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 | } |