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

Last change on this file since 2497 was 2497, checked in by kopal, 11 years ago
  • replaced texture of the world with nicer one from the nasa
  • connection state is now updated in gui, so control elements are disabled if user clicks the connect button
File size: 13.2 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            try
94            {
95                if (!Directory.Exists(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY))
96                {
97                    Directory.CreateDirectory(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY);
98                    this.P2PEditor.GuiLogMessage("Automatic created account folder: " + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY, NotificationLevel.Info);
99                }
100            }
101            catch (Exception ex)
102            {
103                this.MessageLabel.Content = "Cannot create default account data directory '" + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY + "':\n" + ex.Message;
104                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
105                this.MessageLabel.Visibility = Visibility.Visible;
106                return;
107            }
108
109            try
110            {
111                if (CertificateServices.GetPeerCertificateByAvatar(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY,
112                    P2PSettings.Default.PeerName, P2PBase.DecryptString(P2PSettings.Default.Password)) == null)
113                {                   
114                    HaveCertificate = false;               
115                }
116            }
117            catch (NoCertificateFoundException)
118            {
119                HaveCertificate = false;
120            }           
121            catch (Exception ex)
122            {
123                this.MessageLabel.Content = "Cannot connect using account \"" + P2PSettings.Default.PeerName + "\": " + (ex.InnerException != null ? ex.InnerException.Message : ex.Message);
124                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
125                this.MessageLabel.Visibility = Visibility.Visible;
126                return;
127            }
128            if(!HaveCertificate){
129                try
130                {
131                    //we did not find a fitting certificate, so we just try to download one:
132                    CertificateClient certificateClient = new CertificateClient();
133                    certificateClient.TimeOut = 5;
134                    certificateClient.ProgramName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
135                    certificateClient.ProgramVersion = System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString();
136                    certificateClient.InvalidCertificateRequest += InvalidCertificateRequest;
137                    certificateClient.CertificateReceived += CertificateReceived;
138                    certificateClient.RequestCertificate(new CertificateRequest(P2PSettings.Default.PeerName, null, P2PBase.DecryptString(P2PSettings.Default.Password)));
139                }
140                catch (Exception ex)
141                {
142                    this.MessageLabel.Content = "Error while autodownloading your account data: " + ex.Message;
143                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
144                    this.MessageLabel.Visibility = Visibility.Visible;
145                    return;
146                }
147            }
148
149            //user entered the wrong password and the cert could not be download
150            if (WrongPassword)
151            {
152                this.MessageLabel.Content = "Your password was wrong. We could not autodownload your account data.";
153                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
154                this.MessageLabel.Visibility = Visibility.Visible;
155                return;
156            }
157
158            //we used login data, but our email was not authorized
159            if (EmailVerificationRequired)
160            {
161                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.";
162                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
163                this.MessageLabel.Visibility = Visibility.Visible;
164                return;
165            }
166
167            //if we are here we did not find a fitting certificate in users appdate and could not download a certificate
168            if (!HaveCertificate)
169            {
170               
171                this.MessageLabel.Content = "Cannot connect, account \"" + P2PSettings.Default.PeerName + "\" not found!";
172                this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Info);
173                this.MessageLabel.Visibility = Visibility.Visible;
174                return;
175            }
176
177            if (!P2PManager.IsConnected)
178                P2PManager.Connect();
179        }
180
181        public void InvalidCertificateRequest(object sender, ProcessingErrorEventArgs args)
182        {           
183            switch (args.Type)
184            {
185                case ErrorType.EmailNotYetVerified:
186                    EmailVerificationRequired = true;
187                    break;
188                case ErrorType.WrongPassword:
189                    WrongPassword = true;
190                    break;
191            }
192        }
193
194        public void CertificateReceived(object sender, CertificateReceivedEventArgs args)
195        {
196            try
197            {
198                try
199                {
200                    if (!Directory.Exists(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY))
201                    {
202                        Directory.CreateDirectory(PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY);
203                    }
204                }
205                catch (Exception ex)
206                {
207                    this.MessageLabel.Content = "Cannot create default account data directory '" + PeerCertificate.DEFAULT_USER_CERTIFICATE_DIRECTORY + "':\n" + ex.Message;
208                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
209                    this.MessageLabel.Visibility = Visibility.Visible;
210                    return;
211                }
212
213                args.Certificate.SaveCrtToAppData();
214                args.Certificate.SavePkcs12ToAppData(args.Certificate.Password);
215                HaveCertificate = true;
216                this.P2PEditor.GuiLogMessage("Autodownloaded user account data for user '" + args.Certificate.Avatar +"'", NotificationLevel.Info);
217            }
218            catch (Exception ex)
219            {
220                this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
221                {
222                    this.MessageLabel.Content = "Could not save the received certificate to your AppData folder:\n\n" +
223                        (ex.GetBaseException() != null && ex.GetBaseException().Message != null ? ex.GetBaseException().Message : ex.Message);
224                    this.P2PEditor.GuiLogMessage(this.MessageLabel.Content.ToString(), NotificationLevel.Error);
225                    this.MessageLabel.Visibility = Visibility.Visible;
226                }, null);
227            }
228        }
229
230        private void HelpButtonClick(object sender, RoutedEventArgs e)
231        {
232            ((P2PEditorPresentation) P2PEditor.Presentation).ShowHelp();
233        }
234       
235        private void GetACertificateLabel_Click(object sender, RoutedEventArgs e)
236        {
237            P2PEditorPresentation.ShowGetNewCertificateView();
238        }
239
240        private void ForgotPasswordLabel_Click(object sender, RoutedEventArgs e)
241        {
242            P2PEditorPresentation.ShowForgotPasswordView();
243        }
244
245        private void Username_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
246        {
247            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName = this.Username.Text;
248        }
249
250        private void Password_PasswordChanged(object sender, RoutedEventArgs e)
251        {
252            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password = this.Password.Password;
253        }
254
255        private void P2PUserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
256        {           
257            this.Username.Text = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName;
258            this.Password.Password = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password;
259            this.RaiseP2PConnectingEvent(IsP2PConnecting);
260        }
261
262        private void OnPropertyChanged_Settings(object sender, PropertyChangedEventArgs args)
263        {           
264            if(args.PropertyName.Equals("PeerName")){
265                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
266                //{
267                    if (this.Username.Text != ((P2PEditorSettings)sender).PeerName)
268                    {
269
270                        this.Username.Text = ((P2PEditorSettings)sender).PeerName;
271                    }
272                //},null);
273            }
274            if(args.PropertyName.Equals("Password")){
275                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
276                //{
277                    if (this.Password.Password != ((P2PEditorSettings)sender).Password)
278                    {
279                        this.Password.Password = ((P2PEditorSettings)sender).Password;
280                    }
281                //},null);
282            }           
283        }
284
285        private void P2PUserControl_Loaded(object sender, RoutedEventArgs e)
286        {
287            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PropertyChanged += OnPropertyChanged_Settings;
288        }
289    }
290}
Note: See TracBrowser for help on using the repository browser.