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

Last change on this file since 2420 was 2420, checked in by krueger, 11 years ago

fixed certificate directory path

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