Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / Preferences / AddAccountViewModel.cs @ 2f5fcd2f

History | View | Annotate | Download (12.2 kB)

1 c561991c pkanavos
#region
2 c561991c pkanavos
/* -----------------------------------------------------------------------
3 c561991c pkanavos
 * <copyright file="AddAccountViewModel.cs" company="GRNet">
4 c561991c pkanavos
 * 
5 c561991c pkanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 c561991c pkanavos
 *
7 c561991c pkanavos
 * Redistribution and use in source and binary forms, with or
8 c561991c pkanavos
 * without modification, are permitted provided that the following
9 c561991c pkanavos
 * conditions are met:
10 c561991c pkanavos
 *
11 c561991c pkanavos
 *   1. Redistributions of source code must retain the above
12 c561991c pkanavos
 *      copyright notice, this list of conditions and the following
13 c561991c pkanavos
 *      disclaimer.
14 c561991c pkanavos
 *
15 c561991c pkanavos
 *   2. Redistributions in binary form must reproduce the above
16 c561991c pkanavos
 *      copyright notice, this list of conditions and the following
17 c561991c pkanavos
 *      disclaimer in the documentation and/or other materials
18 c561991c pkanavos
 *      provided with the distribution.
19 c561991c pkanavos
 *
20 c561991c pkanavos
 *
21 c561991c pkanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 c561991c pkanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 c561991c pkanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 c561991c pkanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 c561991c pkanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 c561991c pkanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 c561991c pkanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 c561991c pkanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 c561991c pkanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 c561991c pkanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 c561991c pkanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 c561991c pkanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 c561991c pkanavos
 *
34 c561991c pkanavos
 * The views and conclusions contained in the software and
35 c561991c pkanavos
 * documentation are those of the authors and should not be
36 c561991c pkanavos
 * interpreted as representing official policies, either expressed
37 c561991c pkanavos
 * or implied, of GRNET S.A.
38 c561991c pkanavos
 * </copyright>
39 c561991c pkanavos
 * -----------------------------------------------------------------------
40 c561991c pkanavos
 */
41 c561991c pkanavos
#endregion
42 c561991c pkanavos
using System;
43 c561991c pkanavos
using System.Collections.Generic;
44 c561991c pkanavos
using System.ComponentModel.Composition;
45 c561991c pkanavos
using System.IO;
46 c561991c pkanavos
using System.Linq;
47 c561991c pkanavos
using System.Text.RegularExpressions;
48 c561991c pkanavos
using System.Threading.Tasks;
49 c561991c pkanavos
using System.Windows;
50 c561991c pkanavos
using System.Windows.Forms;
51 c561991c pkanavos
using Pithos.Client.WPF.Properties;
52 c561991c pkanavos
using Pithos.Interfaces;
53 c561991c pkanavos
using Pithos.Network;
54 c561991c pkanavos
using MessageBox = System.Windows.MessageBox;
55 c561991c pkanavos
using Screen = Caliburn.Micro.Screen;
56 c561991c pkanavos
57 c561991c pkanavos
namespace Pithos.Client.WPF.Preferences
58 c561991c pkanavos
{
59 c561991c pkanavos
    [Export(typeof(AddAccountViewModel))]
60 c561991c pkanavos
    public class AddAccountViewModel:Screen
61 c561991c pkanavos
    {
62 c561991c pkanavos
63 c561991c pkanavos
        private readonly List<string> _servers;
64 c561991c pkanavos
65 c561991c pkanavos
        public List<string> Servers
66 c561991c pkanavos
        {
67 c561991c pkanavos
            get { return Settings.Default.Servers.Select(server => server.ServerUri).ToList(); }
68 c561991c pkanavos
        }
69 c561991c pkanavos
70 c561991c pkanavos
        private bool _isValidServer;
71 c561991c pkanavos
        public bool IsValidServer
72 c561991c pkanavos
        {
73 c561991c pkanavos
            get { return _isValidServer; }
74 c561991c pkanavos
            set
75 c561991c pkanavos
            {
76 c561991c pkanavos
                _isValidServer = value;
77 c561991c pkanavos
                NotifyOfPropertyChange(()=>IsValidServer);
78 c561991c pkanavos
            }
79 c561991c pkanavos
        }
80 c561991c pkanavos
81 c561991c pkanavos
82 c561991c pkanavos
        private string _currentServer;
83 c561991c pkanavos
        public string CurrentServer
84 c561991c pkanavos
        {
85 c561991c pkanavos
            get { return _currentServer; }
86 c561991c pkanavos
            set
87 c561991c pkanavos
            {
88 c561991c pkanavos
                if (!Uri.IsWellFormedUriString(value, UriKind.Absolute))
89 c561991c pkanavos
                {
90 c561991c pkanavos
                    IsValidServer = false;
91 c561991c pkanavos
                    throw new UriFormatException();
92 c561991c pkanavos
                }
93 c561991c pkanavos
                _currentServer = value;
94 c561991c pkanavos
                IsValidServer = true;
95 c561991c pkanavos
                HasValidCredentials = false;
96 c561991c pkanavos
                IsConfirmed = false;
97 c561991c pkanavos
                NotifyOfPropertyChange(()=>CurrentServer);
98 c561991c pkanavos
            }
99 c561991c pkanavos
        }
100 c561991c pkanavos
101 c561991c pkanavos
        private string _accountName;
102 c561991c pkanavos
        public string AccountName
103 c561991c pkanavos
        {
104 c561991c pkanavos
            get { return _accountName; }
105 c561991c pkanavos
            set
106 c561991c pkanavos
            {
107 c561991c pkanavos
                _accountName = value;
108 1b3ee255 George Pantazis
109 c561991c pkanavos
                NotifyOfPropertyChange(()=>AccountName);
110 c561991c pkanavos
                NotifyOfPropertyChange(() => HasCredentials);
111 c561991c pkanavos
            }
112 c561991c pkanavos
        }
113 c561991c pkanavos
114 c561991c pkanavos
        private string _token;
115 c561991c pkanavos
        public string Token
116 c561991c pkanavos
        {
117 c561991c pkanavos
            get { return _token; }
118 c561991c pkanavos
            set
119 c561991c pkanavos
            {
120 c561991c pkanavos
                _token = value;
121 c561991c pkanavos
                NotifyOfPropertyChange(()=>Token);
122 c561991c pkanavos
                NotifyOfPropertyChange(() => HasCredentials);
123 c561991c pkanavos
            }
124 c561991c pkanavos
        }
125 c561991c pkanavos
126 c561991c pkanavos
        private string _accountPath;
127 c561991c pkanavos
        public string AccountPath
128 c561991c pkanavos
        {
129 c561991c pkanavos
            get { return _accountPath; }
130 c561991c pkanavos
            set
131 c561991c pkanavos
            {
132 c561991c pkanavos
                _accountPath = value;
133 c561991c pkanavos
                NotifyOfPropertyChange(() => AccountPath);
134 c561991c pkanavos
                NotifyOfPropertyChange(() => HasAccountPath);
135 c561991c pkanavos
            }
136 c561991c pkanavos
        }
137 c561991c pkanavos
138 c561991c pkanavos
139 c561991c pkanavos
        public bool HasAccountPath
140 c561991c pkanavos
        {
141 c561991c pkanavos
            get { return !String.IsNullOrWhiteSpace(AccountPath); }
142 c561991c pkanavos
        }
143 c561991c pkanavos
144 c561991c pkanavos
        public bool HasCredentials
145 c561991c pkanavos
        {
146 c561991c pkanavos
            get { return !(String.IsNullOrWhiteSpace(AccountName) || String.IsNullOrWhiteSpace(Token) ) ; }
147 c561991c pkanavos
        }
148 c561991c pkanavos
149 c561991c pkanavos
150 c561991c pkanavos
        private bool  _isConfirmed;
151 c561991c pkanavos
152 c561991c pkanavos
        public bool IsConfirmed
153 c561991c pkanavos
        {
154 c561991c pkanavos
            get { return _isConfirmed; }
155 c561991c pkanavos
            set
156 c561991c pkanavos
            {
157 c561991c pkanavos
                _isConfirmed = value;
158 c561991c pkanavos
                HasValidCredentials = false;
159 c561991c pkanavos
                NotifyOfPropertyChange(() => IsConfirmed);
160 c561991c pkanavos
            }
161 c561991c pkanavos
        }
162 c561991c pkanavos
163 c561991c pkanavos
164 c561991c pkanavos
        private bool _isAccountActive;
165 c561991c pkanavos
166 c561991c pkanavos
        public bool IsAccountActive
167 c561991c pkanavos
        {
168 c561991c pkanavos
            get { return _isAccountActive; }
169 c561991c pkanavos
            set
170 c561991c pkanavos
            {
171 c561991c pkanavos
                _isAccountActive = value;
172 c561991c pkanavos
                NotifyOfPropertyChange(() => IsAccountActive);
173 c561991c pkanavos
            }
174 c561991c pkanavos
        }
175 c561991c pkanavos
176 c561991c pkanavos
177 c561991c pkanavos
        private bool _shouldCreateOkeanosFolder;
178 c561991c pkanavos
        public bool ShouldCreateOkeanosFolder
179 c561991c pkanavos
        {
180 c561991c pkanavos
            get { return _shouldCreateOkeanosFolder; }
181 c561991c pkanavos
            set
182 c561991c pkanavos
            {
183 c561991c pkanavos
                _shouldCreateOkeanosFolder = value;
184 c561991c pkanavos
                NotifyOfPropertyChange(()=>ShouldCreateOkeanosFolder);
185 c561991c pkanavos
            }
186 c561991c pkanavos
        }
187 c561991c pkanavos
188 c561991c pkanavos
        bool HasNoParentWithCache(DirectoryInfo info)
189 c561991c pkanavos
        {
190 c561991c pkanavos
            if (info == null)
191 c561991c pkanavos
                return false;
192 c561991c pkanavos
            var parent = info.Parent;
193 c561991c pkanavos
            if (parent == null)
194 c561991c pkanavos
                return true;
195 c561991c pkanavos
            if (parent.EnumerateDirectories(FolderConstants.CacheFolder).Any())
196 c561991c pkanavos
            {
197 c561991c pkanavos
                return false;
198 c561991c pkanavos
            }
199 c561991c pkanavos
            return HasNoParentWithCache(parent);
200 c561991c pkanavos
        }
201 c561991c pkanavos
202 c561991c pkanavos
        string GetLowestAboveCache(string path)
203 c561991c pkanavos
        {
204 c561991c pkanavos
            if (String.IsNullOrWhiteSpace(path))
205 c561991c pkanavos
                return null;
206 c561991c pkanavos
            var info = new DirectoryInfo(path);
207 c561991c pkanavos
            if (!info.Exists)
208 c561991c pkanavos
                return path;
209 c561991c pkanavos
            while (!HasNoParentWithCache(info))
210 c561991c pkanavos
            {
211 c561991c pkanavos
                info = info.Parent;
212 c561991c pkanavos
            }
213 c561991c pkanavos
            if (info == null)
214 c561991c pkanavos
                return null;
215 c561991c pkanavos
            else
216 c561991c pkanavos
                return info.FullName;
217 c561991c pkanavos
        }
218 c561991c pkanavos
219 c561991c pkanavos
        public void SelectAccount()
220 c561991c pkanavos
        {
221 c561991c pkanavos
            using (var dlg = new FolderBrowserDialog{Description=Resources.AddAccountViewModel_SelectAccount_Please_select_a_folder})
222 c561991c pkanavos
            {
223 c561991c pkanavos
                //Ask the user to select a folder
224 c561991c pkanavos
                //Note: We need a parent window here, which we retrieve with GetView            
225 c561991c pkanavos
                var view = (Window)GetView();
226 c561991c pkanavos
                if (DialogResult.OK != dlg.ShowDialog(new Wpf32Window(view)))
227 c561991c pkanavos
                    return;
228 c561991c pkanavos
229 c561991c pkanavos
                //If the selected path is under an account folder, ie a folder containint a .pithos.cache subfolder, try to locate
230 c561991c pkanavos
                //the cache's parent folder
231 c561991c pkanavos
                var selectedPath = GetLowestAboveCache(dlg.SelectedPath);
232 c561991c pkanavos
233 c561991c pkanavos
                //If the path  ends with /okeanos#/pithos, replace with /okeanos#
234 c561991c pkanavos
                var match = _okeanosRegex.Match(selectedPath);
235 c561991c pkanavos
                if (match.Success)
236 c561991c pkanavos
                {
237 c561991c pkanavos
                    selectedPath = match.Groups[1].Value;                    
238 c561991c pkanavos
                }
239 c561991c pkanavos
240 c561991c pkanavos
                AccountPath= selectedPath;
241 c561991c pkanavos
242 c561991c pkanavos
243 c561991c pkanavos
244 c561991c pkanavos
                ShouldCreateOkeanosFolder=Directory.EnumerateFileSystemEntries(AccountPath).Any();                
245 c561991c pkanavos
            }
246 c561991c pkanavos
        }
247 c561991c pkanavos
248 c561991c pkanavos
249 c561991c pkanavos
        public void RetrieveCredentials()
250 c561991c pkanavos
        {
251 c561991c pkanavos
            SetBusy("Waiting for credentials.", "Please enter your credentials in the Pithos logon page");
252 c561991c pkanavos
            IsConfirmed = false;
253 c561991c pkanavos
254 c561991c pkanavos
            try
255 c561991c pkanavos
            {
256 2f5fcd2f pkanavos
                var loginUri = PithosAccount.GetLoginUri(CurrentServer);
257 c561991c pkanavos
                var credentials = PithosAccount.RetrieveCredentials(loginUri.ToString());
258 c561991c pkanavos
                if (credentials == null)
259 c561991c pkanavos
                    return;
260 c561991c pkanavos
                AccountName = credentials.UserName;
261 c561991c pkanavos
                Token = credentials.Password;
262 c561991c pkanavos
263 c561991c pkanavos
                IsConfirmed = true;
264 c561991c pkanavos
265 c561991c pkanavos
            }
266 c561991c pkanavos
            catch (PithosException exc)
267 c561991c pkanavos
            {
268 c561991c pkanavos
                ClearBusy();
269 c561991c pkanavos
                MessageBox.Show(exc.Message, "Unable to retrieve credentials");
270 c561991c pkanavos
            }
271 c561991c pkanavos
            catch (Exception exc)
272 c561991c pkanavos
            {
273 c561991c pkanavos
                IsConfirmed = false;
274 c561991c pkanavos
                MessageBox.Show(exc.ToString(), "Error");
275 c561991c pkanavos
                throw;
276 c561991c pkanavos
            }
277 c561991c pkanavos
            finally
278 c561991c pkanavos
            {
279 c561991c pkanavos
                ClearBusy();
280 c561991c pkanavos
                
281 c561991c pkanavos
                ((Window) GetView()).Activate();
282 c561991c pkanavos
            }
283 c561991c pkanavos
284 c561991c pkanavos
            if (IsConfirmed)
285 c561991c pkanavos
                TaskEx.Run(()=>TestAccount());
286 c561991c pkanavos
287 c561991c pkanavos
        }
288 c561991c pkanavos
289 c561991c pkanavos
        public AddAccountViewModel()
290 c561991c pkanavos
        {
291 c561991c pkanavos
            _servers=new List<string>
292 c561991c pkanavos
                         {
293 c561991c pkanavos
                             Settings.Default.ProductionServer, 
294 c561991c pkanavos
                             Settings.Default.DevelopmentServer
295 c561991c pkanavos
                         };
296 c561991c pkanavos
            CurrentServer = _servers[0];
297 c561991c pkanavos
            DisplayName = "Add Pithos+ Account";
298 c561991c pkanavos
        }
299 c561991c pkanavos
300 c561991c pkanavos
        private bool _hasValidCredentials;
301 c561991c pkanavos
        public bool HasValidCredentials
302 c561991c pkanavos
        {
303 c561991c pkanavos
            get { return _hasValidCredentials; }
304 c561991c pkanavos
            set
305 c561991c pkanavos
            {
306 c561991c pkanavos
                _hasValidCredentials = value;
307 c561991c pkanavos
                NotifyOfPropertyChange(()=>HasValidCredentials);
308 c561991c pkanavos
            }
309 c561991c pkanavos
        }
310 c561991c pkanavos
311 c561991c pkanavos
        private string _validationMessage;
312 c561991c pkanavos
        public string ValidationMessage
313 c561991c pkanavos
        {
314 c561991c pkanavos
            get { return _validationMessage; }
315 c561991c pkanavos
            set
316 c561991c pkanavos
            {
317 c561991c pkanavos
                _validationMessage = value;
318 c561991c pkanavos
                NotifyOfPropertyChange(()=>ValidationMessage);
319 c561991c pkanavos
            }
320 c561991c pkanavos
        }
321 c561991c pkanavos
322 c561991c pkanavos
        private bool _isWorking;
323 c561991c pkanavos
        public bool IsWorking
324 c561991c pkanavos
        {
325 c561991c pkanavos
            get { return _isWorking; }
326 c561991c pkanavos
            set
327 c561991c pkanavos
            {
328 c561991c pkanavos
                _isWorking = value;
329 c561991c pkanavos
                NotifyOfPropertyChange(()=>IsWorking);
330 c561991c pkanavos
            }
331 c561991c pkanavos
        }
332 c561991c pkanavos
333 c561991c pkanavos
        private string _busyTitle;
334 c561991c pkanavos
        public string BusyTitle
335 c561991c pkanavos
        {
336 c561991c pkanavos
            get { return _busyTitle; }
337 c561991c pkanavos
            set
338 c561991c pkanavos
            {
339 c561991c pkanavos
                _busyTitle = value;
340 c561991c pkanavos
                NotifyOfPropertyChange(()=>BusyTitle);
341 c561991c pkanavos
            }
342 c561991c pkanavos
        }
343 c561991c pkanavos
344 c561991c pkanavos
        private string _busyDetail;
345 c561991c pkanavos
        private Regex _okeanosRegex = new Regex(@"(.*okeanos[0-9]*)\\pithos$");
346 c561991c pkanavos
347 c561991c pkanavos
        public string BusyDetail
348 c561991c pkanavos
        {
349 c561991c pkanavos
            get { return _busyDetail; }
350 c561991c pkanavos
            set
351 c561991c pkanavos
            {
352 c561991c pkanavos
                _busyDetail = value;
353 c561991c pkanavos
                NotifyOfPropertyChange(()=>BusyDetail);
354 c561991c pkanavos
            }
355 c561991c pkanavos
        }
356 c561991c pkanavos
357 c561991c pkanavos
        private void SetBusy(string title,string detail)
358 c561991c pkanavos
        {
359 c561991c pkanavos
            IsWorking = true;
360 c561991c pkanavos
            BusyTitle = title;
361 c561991c pkanavos
            BusyDetail = detail;
362 c561991c pkanavos
        }
363 c561991c pkanavos
364 c561991c pkanavos
        private void ClearBusy()
365 c561991c pkanavos
        {
366 c561991c pkanavos
            IsWorking = false;
367 c561991c pkanavos
            BusyTitle = "";
368 c561991c pkanavos
            BusyDetail = "";
369 c561991c pkanavos
            
370 c561991c pkanavos
        }
371 c561991c pkanavos
372 c561991c pkanavos
        public async Task TestAccount()
373 c561991c pkanavos
        {
374 c561991c pkanavos
            try
375 c561991c pkanavos
            {
376 c561991c pkanavos
                SetBusy("Validating Credentials", "");
377 5b2e4db4 pkanavos
                var client = new CloudFilesClient(AccountName, Token) { AuthenticationUrl = CurrentServer,/*Proxy=Proxy */};
378 5b2e4db4 pkanavos
                await client.Authenticate().ConfigureAwait(false);
379 5b2e4db4 pkanavos
                await client.ListContainers(AccountName).ConfigureAwait(false);
380 c561991c pkanavos
                HasValidCredentials = true;
381 c561991c pkanavos
                ValidationMessage = "Credentials Validated";
382 c561991c pkanavos
            }
383 c561991c pkanavos
            catch
384 c561991c pkanavos
            {
385 c561991c pkanavos
                HasValidCredentials = false;
386 c561991c pkanavos
                MessageBox.Show("The account is not valid", "Account Error", MessageBoxButton.OK, MessageBoxImage.Stop);
387 c561991c pkanavos
                ValidationMessage = "Credentials validation failed";
388 c561991c pkanavos
            }
389 c561991c pkanavos
            finally
390 c561991c pkanavos
            {
391 c561991c pkanavos
                ClearBusy();
392 c561991c pkanavos
            }
393 c561991c pkanavos
        }
394 c561991c pkanavos
395 c561991c pkanavos
    }
396 c561991c pkanavos
}