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

Last change on this file since 2494 was 2494, checked in by matkovic, 11 years ago

-small fix

File size: 13.1 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        }
48
49        public static readonly DependencyProperty IsP2PConnectingProperty =
50            DependencyProperty.Register("IsP2PConnecting",
51                                        typeof(
52                                            Boolean),
53                                        typeof(
54                                            ConnectTab), new PropertyMetadata(false, new PropertyChangedCallback(OnIsP2PConnectingPropertyPropertyChanged)));
55
56        public Boolean IsP2PConnecting
57        {
58            get { return (Boolean)GetValue(IsP2PConnectingProperty); }
59            set { SetValue(IsP2PConnectingProperty, value); }
60        }
61
62        private static void OnIsP2PConnectingPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
63        {
64        }
65
66
67
68        public ConnectTab()
69        {
70            InitializeComponent();
71
72            P2PManager.ConnectionManager.OnP2PTryConnectingStateChangeOccurred += new ConnectionManager.P2PTryConnectingStateChangeEventHandler(delegate(object sender, bool newState)
73            {
74                this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
75                {
76                    RaiseP2PConnectingEvent(newState);
77                }, null);
78            });           
79        }
80
81        private bool HaveCertificate { get; set; }
82        private bool EmailVerificationRequired { get; set; }
83        private bool WrongPassword { get; set; }
84
85        private void ConnectButtonClick(object sender, RoutedEventArgs e)
86        {
87            this.MessageLabel.Visibility = Visibility.Hidden;
88            HaveCertificate = true;
89            EmailVerificationRequired = false;
90            WrongPassword = false;
91
92            try
93            {
94                if (!Directory.Exists(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY))
95                {
96                    Directory.CreateDirectory(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY);
97                    this.P2PEditor.GuiLogMessage("Automatic created account folder: " + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY, NotificationLevel.Info);
98                }
99            }
100            catch (Exception ex)
101            {
102                this.MessageLabel.Content = "Cannot create default account data directory '" + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY + "':\n" + ex.Message;
103                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
104                this.MessageLabel.Visibility = Visibility.Visible;
105                return;
106            }
107
108            try
109            {
110                if (CertificateServices.GetPeerCertificateByAvatar(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY,
111                    P2PSettings.Default.PeerName, P2PBase.DecryptString(P2PSettings.Default.Password)) == null)
112                {                   
113                    HaveCertificate = false;               
114                }
115            }
116            catch (NoCertificateFoundException)
117            {
118                HaveCertificate = false;
119            }           
120            catch (Exception ex)
121            {
122                this.MessageLabel.Content = "Cannot connect using account \"" + P2PSettings.Default.PeerName + "\": " + (ex.InnerException != null ? ex.InnerException.Message : ex.Message);
123                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
124                this.MessageLabel.Visibility = Visibility.Visible;
125                return;
126            }
127            if(!HaveCertificate){
128                try
129                {
130                    //we did not find a fitting certificate, so we just try to download one:
131                    CertificateClient certificateClient = new CertificateClient();
132                    certificateClient.TimeOut = 5;
133                    certificateClient.ProgramName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
134                    certificateClient.ProgramVersion = System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString();
135                    certificateClient.InvalidCertificateRequest += InvalidCertificateRequest;
136                    certificateClient.CertificateReceived += CertificateReceived;
137                    certificateClient.RequestCertificate(new CertificateRequest(P2PSettings.Default.PeerName, null, P2PBase.DecryptString(P2PSettings.Default.Password)));
138                }
139                catch (Exception ex)
140                {
141                    this.MessageLabel.Content = "Error while autodownloading your account data: " + ex.Message;
142                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
143                    this.MessageLabel.Visibility = Visibility.Visible;
144                    return;
145                }
146            }
147
148            //user entered the wrong password and the cert could not be download
149            if (WrongPassword)
150            {
151                this.MessageLabel.Content = "Your password was wrong. We could not autodownload your account data.";
152                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
153                this.MessageLabel.Visibility = Visibility.Visible;
154                return;
155            }
156
157            //we used login data, but our email was not authorized
158            if (EmailVerificationRequired)
159            {
160                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.";
161                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
162                this.MessageLabel.Visibility = Visibility.Visible;
163                return;
164            }
165
166            //if we are here we did not find a fitting certificate in users appdate and could not download a certificate
167            if (!HaveCertificate)
168            {
169               
170                this.MessageLabel.Content = "Cannot connect, account \"" + P2PSettings.Default.PeerName + "\" not found!";
171                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
172                this.MessageLabel.Visibility = Visibility.Visible;
173                return;
174            }
175
176            if (!P2PManager.IsConnected)
177                P2PManager.Connect();
178        }
179
180        public void InvalidCertificateRequest(object sender, ProcessingErrorEventArgs args)
181        {           
182            switch (args.Type)
183            {
184                case ErrorType.EmailNotYetVerified:
185                    EmailVerificationRequired = true;
186                    break;
187                case ErrorType.WrongPassword:
188                    WrongPassword = true;
189                    break;
190            }
191        }
192
193        public void CertificateReceived(object sender, CertificateReceivedEventArgs args)
194        {
195            try
196            {
197                try
198                {
199                    if (!Directory.Exists(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY))
200                    {
201                        Directory.CreateDirectory(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY);
202                    }
203                }
204                catch (Exception ex)
205                {
206                    this.MessageLabel.Content = "Cannot create default account data directory '" + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY + "':\n" + ex.Message;
207                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
208                    this.MessageLabel.Visibility = Visibility.Visible;
209                    return;
210                }
211
212                args.Certificate.SaveCrtToAppData();
213                args.Certificate.SavePkcs12ToAppData(args.Certificate.Password);
214                HaveCertificate = true;
215                this.P2PEditor.GuiLogMessage("Autodownloaded user account data for user '" + args.Certificate.Avatar +"'", NotificationLevel.Info);
216            }
217            catch (Exception ex)
218            {
219                this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
220                {
221                    this.MessageLabel.Content = "Could not save the received certificate to your AppData folder:\n\n" +
222                        (ex.GetBaseException() != null && ex.GetBaseException().Message != null ? ex.GetBaseException().Message : ex.Message);
223                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
224                    this.MessageLabel.Visibility = Visibility.Visible;
225                }, null);
226            }
227        }
228
229        private void HelpButtonClick(object sender, RoutedEventArgs e)
230        {
231            ((P2PEditorPresentation) P2PEditor.Presentation).ShowHelp();
232        }
233       
234        private void GetACertificateLabel_Click(object sender, RoutedEventArgs e)
235        {
236            P2PEditorPresentation.ShowGetNewCertificateView();
237        }
238
239        private void ForgotPasswordLabel_Click(object sender, RoutedEventArgs e)
240        {
241            P2PEditorPresentation.ShowForgotPasswordView();
242        }
243
244        private void Username_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
245        {
246            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName = this.Username.Text;
247        }
248
249        private void Password_PasswordChanged(object sender, RoutedEventArgs e)
250        {
251            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password = this.Password.Password;
252        }
253
254        private void P2PUserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
255        {           
256            this.Username.Text = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName;
257            this.Password.Password = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password;
258            this.RaiseP2PConnectingEvent(IsP2PConnecting);
259        }
260
261        private void OnPropertyChanged_Settings(object sender, PropertyChangedEventArgs args)
262        {           
263            if(args.PropertyName.Equals("PeerName")){
264                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
265                //{
266                    if (this.Username.Text != ((P2PEditorSettings)sender).PeerName)
267                    {
268
269                        this.Username.Text = ((P2PEditorSettings)sender).PeerName;
270                    }
271                //},null);
272            }
273            if(args.PropertyName.Equals("Password")){
274                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
275                //{
276                    if (this.Password.Password != ((P2PEditorSettings)sender).Password)
277                    {
278                        this.Password.Password = ((P2PEditorSettings)sender).Password;
279                    }
280                //},null);
281            }           
282        }
283
284        private void P2PUserControl_Loaded(object sender, RoutedEventArgs e)
285        {
286            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PropertyChanged += OnPropertyChanged_Settings;
287        }
288    }
289}
Note: See TracBrowser for help on using the repository browser.