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

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

-added 3D World + Animation

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