source: trunk/CrypPlugins/P2PEditor/GUI/Controls/ConnectView.xaml.cs @ 2540

Last change on this file since 2540 was 2540, checked in by kopal, 11 years ago

added "Remember my password" button. So the user can decide if he wants to save his password on the machine or not

File size: 14.3 KB
Line 
1using System;
2using System.Windows;
3using Cryptool.P2P;
4using System.Windows.Media.Animation;
5using System.Windows.Threading;
6using System.Threading;
7using Cryptool.P2P.Internal;
8using PeersAtPlay.CertificateLibrary.Certificates;
9using Cryptool.PluginBase;
10using System.IO;
11using System.ComponentModel;
12using PeersAtPlay.CertificateLibrary.Network;
13
14namespace Cryptool.P2PEditor.GUI.Controls
15{
16    public partial class ConnectTab
17    {
18
19        public static readonly RoutedEvent P2PConnectingTrueEvent = EventManager.RegisterRoutedEvent("P2PConnectingTrue", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ConnectTab));
20
21        public event RoutedEventHandler P2PConnectingTrue
22        {
23            add { AddHandler(P2PConnectingTrueEvent, value); }
24            remove { RemoveHandler(P2PConnectingTrueEvent, value); }
25        }
26
27        public static readonly RoutedEvent P2PConnectingFalseEvent = EventManager.RegisterRoutedEvent("P2PConnectingFalse", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ConnectTab));
28
29        public event RoutedEventHandler P2PConnectingFalse
30        {
31            add { AddHandler(P2PConnectingFalseEvent, value); }
32            remove { RemoveHandler(P2PConnectingFalseEvent, value); }
33        }
34
35        public void RaiseP2PConnectingEvent(bool b)
36        {
37            if (b)
38            {
39                RoutedEventArgs newEventArgs = new RoutedEventArgs(ConnectTab.P2PConnectingTrueEvent);
40                RaiseEvent(newEventArgs);               
41            }
42            else 
43            {
44                RoutedEventArgs newEventArgs = new RoutedEventArgs(ConnectTab.P2PConnectingFalseEvent);
45                RaiseEvent(newEventArgs);
46            }
47            ((P2PEditorPresentation)P2PEditor.Presentation).UpdateConnectionState();
48        }
49
50        public static readonly DependencyProperty IsP2PConnectingProperty =
51            DependencyProperty.Register("IsP2PConnecting",
52                                        typeof(
53                                            Boolean),
54                                        typeof(
55                                            ConnectTab), new PropertyMetadata(false, new PropertyChangedCallback(OnIsP2PConnectingPropertyPropertyChanged)));
56
57        public Boolean IsP2PConnecting
58        {
59            get { return (Boolean)GetValue(IsP2PConnectingProperty); }
60            set { SetValue(IsP2PConnectingProperty, value); }
61        }
62
63        private static void OnIsP2PConnectingPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
64        {
65        }
66
67
68
69        public ConnectTab()
70        {
71            InitializeComponent();
72
73            P2PManager.ConnectionManager.OnP2PTryConnectingStateChangeOccurred += new ConnectionManager.P2PTryConnectingStateChangeEventHandler(delegate(object sender, bool newState)
74            {
75                this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
76                {
77                    RaiseP2PConnectingEvent(newState);
78                }, null);
79            });           
80        }
81
82        private bool HaveCertificate { get; set; }
83        private bool EmailVerificationRequired { get; set; }
84        private bool WrongPassword { get; set; }
85
86        private void ConnectButtonClick(object sender, RoutedEventArgs e)
87        {
88            this.MessageLabel.Visibility = Visibility.Hidden;
89            HaveCertificate = true;
90            EmailVerificationRequired = false;
91            WrongPassword = false;
92
93            string password = null;
94            if (P2PSettings.Default.RememberPassword)
95            {
96                password = P2PBase.DecryptString(P2PSettings.Default.Password);
97            }
98            else
99            {
100                password = P2PBase.DecryptString(P2PBase.Password);
101            }
102
103            try
104            {
105                if (!Directory.Exists(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY))
106                {
107                    Directory.CreateDirectory(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY);
108                    this.P2PEditor.GuiLogMessage("Automatic created account folder: " + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY, NotificationLevel.Info);
109                }
110            }
111            catch (Exception ex)
112            {
113                this.MessageLabel.Content = "Cannot create default account data directory '" + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY + "':\n" + ex.Message;
114                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
115                this.MessageLabel.Visibility = Visibility.Visible;
116                return;
117            }
118
119            try
120            {
121                     
122                if (CertificateServices.GetPeerCertificateByAvatar(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY,
123                    P2PSettings.Default.PeerName, password) == null)
124                {                   
125                    HaveCertificate = false;               
126                }
127            }
128            catch (NoCertificateFoundException)
129            {
130                HaveCertificate = false;
131            }           
132            catch (Exception ex)
133            {
134                this.MessageLabel.Content = "Cannot connect using account \"" + P2PSettings.Default.PeerName + "\": " + (ex.InnerException != null ? ex.InnerException.Message : ex.Message);
135                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
136                this.MessageLabel.Visibility = Visibility.Visible;
137                return;
138            }
139            if(!HaveCertificate){
140                try
141                {
142                    //we did not find a fitting certificate, so we just try to download one:
143                    CertificateClient certificateClient = new CertificateClient();
144                    certificateClient.TimeOut = 5;
145                    certificateClient.ProgramName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
146                    certificateClient.ProgramVersion = System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString();
147                    certificateClient.InvalidCertificateRequest += InvalidCertificateRequest;
148                    certificateClient.CertificateReceived += CertificateReceived;
149                    certificateClient.RequestCertificate(new CertificateRequest(P2PSettings.Default.PeerName, null, password));
150                }
151                catch (Exception ex)
152                {
153                    this.MessageLabel.Content = "Error while autodownloading your account data: " + ex.Message;
154                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
155                    this.MessageLabel.Visibility = Visibility.Visible;
156                    return;
157                }
158            }
159
160            //user entered the wrong password and the cert could not be download
161            if (WrongPassword)
162            {
163                this.MessageLabel.Content = "Your password was wrong. We could not autodownload your account data.";
164                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
165                this.MessageLabel.Visibility = Visibility.Visible;
166                return;
167            }
168
169            //we used login data, but our email was not authorized
170            if (EmailVerificationRequired)
171            {
172                this.MessageLabel.Content = "The email address was not verified.\nPlease check your email account for an activation code we just sent to you and activate your account.";
173                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
174                this.MessageLabel.Visibility = Visibility.Visible;
175                return;
176            }
177
178            //if we are here we did not find a fitting certificate in users appdate and could not download a certificate
179            if (!HaveCertificate)
180            {
181               
182                this.MessageLabel.Content = "Cannot connect, account \"" + P2PSettings.Default.PeerName + "\" not found!";
183                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
184                this.MessageLabel.Visibility = Visibility.Visible;
185                return;
186            }
187
188            if (!P2PManager.IsConnected)
189                P2PManager.Connect();
190        }
191
192        public void InvalidCertificateRequest(object sender, ProcessingErrorEventArgs args)
193        {           
194            switch (args.Type)
195            {
196                case ErrorType.EmailNotYetVerified:
197                    EmailVerificationRequired = true;
198                    break;
199                case ErrorType.WrongPassword:
200                    WrongPassword = true;
201                    break;
202            }
203        }
204
205        public void CertificateReceived(object sender, CertificateReceivedEventArgs args)
206        {
207            try
208            {
209                try
210                {
211                    if (!Directory.Exists(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY))
212                    {
213                        Directory.CreateDirectory(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY);
214                    }
215                }
216                catch (Exception ex)
217                {
218                    this.MessageLabel.Content = "Cannot create default account data directory '" + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY + "':\n" + ex.Message;
219                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
220                    this.MessageLabel.Visibility = Visibility.Visible;
221                    return;
222                }
223
224                args.Certificate.SaveCrtToAppData();
225                args.Certificate.SavePkcs12ToAppData(args.Certificate.Password);
226                HaveCertificate = true;
227                this.P2PEditor.GuiLogMessage("Autodownloaded user account data for user '" + args.Certificate.Avatar +"'", NotificationLevel.Info);
228            }
229            catch (Exception ex)
230            {
231                this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
232                {
233                    this.MessageLabel.Content = "Could not save the received certificate to your AppData folder:\n\n" +
234                        (ex.GetBaseException() != null && ex.GetBaseException().Message != null ? ex.GetBaseException().Message : ex.Message);
235                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
236                    this.MessageLabel.Visibility = Visibility.Visible;
237                }, null);
238            }
239        }
240
241        private void HelpButtonClick(object sender, RoutedEventArgs e)
242        {
243            ((P2PEditorPresentation) P2PEditor.Presentation).ShowHelp();
244        }
245       
246        private void GetACertificateLabel_Click(object sender, RoutedEventArgs e)
247        {
248            P2PEditorPresentation.ShowGetNewCertificateView();
249        }
250
251        private void ForgotPasswordLabel_Click(object sender, RoutedEventArgs e)
252        {
253            P2PEditorPresentation.ShowForgotPasswordView();
254        }
255
256        private void Username_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
257        {
258            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName = this.Username.Text;
259        }
260
261        private void Password_PasswordChanged(object sender, RoutedEventArgs e)
262        {
263            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password = this.Password.Password;
264        }
265
266        private void RememberPasswordCheckbox_Click(object sender, RoutedEventArgs e)
267        {
268            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).RememberPassword = (bool)this.RememberPasswordCheckbox.IsChecked;
269        }
270
271        private void P2PUserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
272        {           
273            this.Username.Text = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName;
274            this.Password.Password = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password;
275            this.RememberPasswordCheckbox.IsChecked = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).RememberPassword;
276            this.RaiseP2PConnectingEvent(IsP2PConnecting);
277        }
278
279        private void OnPropertyChanged_Settings(object sender, PropertyChangedEventArgs args)
280        {           
281            if(args.PropertyName.Equals("PeerName")){
282                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
283                //{
284                    if (this.Username.Text != ((P2PEditorSettings)sender).PeerName)
285                    {
286
287                        this.Username.Text = ((P2PEditorSettings)sender).PeerName;
288                    }
289                //},null);
290            }
291            if(args.PropertyName.Equals("Password")){
292                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
293                //{
294                    if (this.Password.Password != ((P2PEditorSettings)sender).Password)
295                    {
296                        this.Password.Password = ((P2PEditorSettings)sender).Password;
297                    }
298                //},null);
299            }
300            if (args.PropertyName.Equals("RememberPassword"))
301            {
302                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
303                //{
304                if (this.RememberPasswordCheckbox.IsChecked != ((P2PEditorSettings)sender).RememberPassword)
305                {
306                    this.RememberPasswordCheckbox.IsChecked = ((P2PEditorSettings)sender).RememberPassword;
307                }
308                //},null);
309            }
310        }
311
312        private void P2PUserControl_Loaded(object sender, RoutedEventArgs e)
313        {
314            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PropertyChanged += OnPropertyChanged_Settings;
315        }
316
317       
318    }
319}
Note: See TracBrowser for help on using the repository browser.