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

Last change on this file since 2408 was 2408, checked in by kopal, 11 years ago
  • added auto download of certificate data
  • increased space in gui for messages / error messages
File size: 10.4 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 DependencyProperty IsP2PConnectingProperty =
20            DependencyProperty.Register("IsP2PConnecting",
21                                        typeof(
22                                            Boolean),
23                                        typeof(
24                                            ConnectTab), new PropertyMetadata(false));
25
26        public Boolean IsP2PConnecting
27        {
28            get { return (Boolean)GetValue(IsP2PConnectingProperty); }
29            set { SetValue(IsP2PConnectingProperty, value); }
30        }
31
32        public ConnectTab()
33        {
34            InitializeComponent();
35
36            P2PManager.ConnectionManager.OnP2PTryConnectingStateChangeOccurred += new ConnectionManager.P2PTryConnectingStateChangeEventHandler(delegate(object sender, bool newState)
37            {
38                if (newState)
39                {
40                   
41                    this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
42                    {
43                        ((P2PEditorPresentation)P2PEditor.Presentation).UpdateConnectionState();
44                        Storyboard storyboard = (Storyboard)FindResource("AnimateBigWorldIcon");
45                        storyboard.Begin();
46                    }
47                    , null);
48                }
49                else
50                {
51                    this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
52                    {
53                        ((P2PEditorPresentation)P2PEditor.Presentation).UpdateConnectionState();                   
54                        Storyboard storyboard = (Storyboard)FindResource("AnimateBigWorldIcon");
55                        storyboard.Stop(); 
56                    }
57                    , null);         
58                }
59            });           
60        }
61
62        private bool HaveCertificate { get; set; }
63        private bool EmailVerificationRequired { get; set; }
64        private bool WrongPassword { get; set; }
65
66        private void ConnectButtonClick(object sender, RoutedEventArgs e)
67        {
68            this.MessageLabel.Visibility = Visibility.Hidden;
69            HaveCertificate = true;
70            EmailVerificationRequired = false;
71            WrongPassword = false;
72            try
73            {
74                if (CertificateServices.GetPeerCertificateByAvatar(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PeersAtPlay" + Path.DirectorySeparatorChar + "Certificates" + Path.DirectorySeparatorChar),
75                    P2PSettings.Default.PeerName, P2PBase.DecryptString(P2PSettings.Default.Password)) == null)
76                {                   
77                    HaveCertificate = false;               
78                }
79            }
80            catch (NoCertificateFoundException)
81            {
82                HaveCertificate = false;
83            }           
84            catch (Exception ex)
85            {
86                this.MessageLabel.Content = "Cannot connect using account \"" + P2PSettings.Default.PeerName + "\": " + (ex.InnerException != null ? ex.InnerException.Message : ex.Message);
87                this.MessageLabel.Visibility = Visibility.Visible;
88                return;
89            }
90            if(!HaveCertificate){
91                try
92                {
93                    //we did not find a fitting certificate, so we just try to download one:
94                    CertificateClient certificateClient = new CertificateClient();
95                    certificateClient.TimeOut = 5;
96                    certificateClient.ProgramName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
97                    certificateClient.ProgramVersion = System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString();
98                    certificateClient.InvalidCertificateRequest += InvalidCertificateRequest;
99                    certificateClient.CertificateReceived += CertificateReceived;
100                    certificateClient.RequestCertificate(new CertificateRequest(P2PSettings.Default.PeerName, null, P2PBase.DecryptString(P2PSettings.Default.Password)));
101                }
102                catch (Exception ex)
103                {
104                    this.MessageLabel.Content = "Error while autodownloading your account data: " + ex.Message;
105                    this.MessageLabel.Visibility = Visibility.Visible;
106                    return;
107                }
108            }
109
110            //user entered the wrong password and the cert could not be download
111            if (WrongPassword)
112            {
113                this.MessageLabel.Content = "Your password was wrong. We could not autodownload your account data.";
114                this.MessageLabel.Visibility = Visibility.Visible;
115                return;
116            }
117
118            //we used login data, but our email was not authorized
119            if (EmailVerificationRequired)
120            {
121                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.";
122                this.MessageLabel.Visibility = Visibility.Visible;
123                return;
124            }
125
126            //if we are here we did not find a fitting certificate in users appdate and could not download a certificate
127            if (!HaveCertificate)
128            {
129               
130                this.MessageLabel.Content = "Cannot connect, account \"" + P2PSettings.Default.PeerName + "\" not found!";
131                this.MessageLabel.Visibility = Visibility.Visible;
132                return;
133            }
134
135            if (!P2PManager.IsConnected)
136                P2PManager.Connect();
137        }
138
139        public void InvalidCertificateRequest(object sender, ProcessingErrorEventArgs args)
140        {           
141            switch (args.Type)
142            {
143                case ErrorType.EmailNotYetVerified:
144                    EmailVerificationRequired = true;
145                    break;
146                case ErrorType.WrongPassword:
147                    WrongPassword = true;
148                    break;
149            }
150        }
151
152        public void CertificateReceived(object sender, CertificateReceivedEventArgs args)
153        {
154            try
155            {
156                args.Certificate.SaveCrtToAppData();
157                args.Certificate.SavePkcs12ToAppData(args.Certificate.Password);
158                HaveCertificate = true;
159            }
160            catch (Exception ex)
161            {
162                this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
163                {
164                    this.MessageLabel.Content = "Could not save the received certificate to your AppData folder:\n\n" +
165                        (ex.GetBaseException() != null && ex.GetBaseException().Message != null ? ex.GetBaseException().Message : ex.Message);
166                    this.MessageLabel.Visibility = Visibility.Visible;
167                }, null);
168            }
169        }
170
171        private void HelpButtonClick(object sender, RoutedEventArgs e)
172        {
173            ((P2PEditorPresentation) P2PEditor.Presentation).ShowHelp();
174        }
175       
176        private void GetACertificateLabel_Click(object sender, RoutedEventArgs e)
177        {
178            P2PEditorPresentation.ShowGetNewCertificateView();
179        }
180
181        private void ForgotPasswordLabel_Click(object sender, RoutedEventArgs e)
182        {
183           //todo
184        }
185
186        private void Username_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
187        {
188            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName = this.Username.Text;
189        }
190
191        private void Password_PasswordChanged(object sender, RoutedEventArgs e)
192        {
193            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password = this.Password.Password;
194        }
195
196        private void P2PUserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
197        {           
198            this.Username.Text = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PeerName;
199            this.Password.Password = ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).Password;
200            if (this.IsP2PConnecting)
201            {
202                Storyboard storyboard = (Storyboard)FindResource("AnimateBigWorldIcon");
203                storyboard.Begin();
204            }
205            else
206            {
207                Storyboard storyboard = (Storyboard)FindResource("AnimateBigWorldIcon");
208                storyboard.Stop();
209            }
210        }
211
212        private void OnPropertyChanged_Settings(object sender, PropertyChangedEventArgs args)
213        {           
214            if(args.PropertyName.Equals("PeerName")){
215                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
216                //{
217                    if (this.Username.Text != ((P2PEditorSettings)sender).PeerName)
218                    {
219
220                        this.Username.Text = ((P2PEditorSettings)sender).PeerName;
221                    }
222                //},null);
223            }
224            if(args.PropertyName.Equals("Password")){
225                //this.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
226                //{
227                    if (this.Password.Password != ((P2PEditorSettings)sender).Password)
228                    {
229                        this.Password.Password = ((P2PEditorSettings)sender).Password;
230                    }
231                //},null);
232            }           
233        }
234
235        private void P2PUserControl_Loaded(object sender, RoutedEventArgs e)
236        {
237            ((P2PEditorSettings)((P2PEditor)GetValue(P2PEditorProperty)).Settings).PropertyChanged += OnPropertyChanged_Settings;
238        }
239    }
240}
Note: See TracBrowser for help on using the repository browser.