#region /* ----------------------------------------------------------------------- * * * Copyright 2011-2012 GRNET S.A. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and * documentation are those of the authors and should not be * interpreted as representing official policies, either expressed * or implied, of GRNET S.A. * * ----------------------------------------------------------------------- */ #endregion using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; using Pithos.Client.WPF.Properties; using Pithos.Network; using MessageBox = System.Windows.MessageBox; using Screen = Caliburn.Micro.Screen; namespace Pithos.Client.WPF.Preferences { [Export(typeof(AddAccountViewModel))] public class AddAccountViewModel:Screen { private readonly List _servers; public List Servers { get { return Settings.Default.Servers.Select(server => server.ServerUri).ToList(); } } private bool _isValidServer; public bool IsValidServer { get { return _isValidServer; } set { _isValidServer = value; NotifyOfPropertyChange(()=>IsValidServer); } } private string _currentServer; public string CurrentServer { get { return _currentServer; } set { if (!Uri.IsWellFormedUriString(value, UriKind.Absolute)) { IsValidServer = false; throw new UriFormatException(); } _currentServer = value; IsValidServer = true; HasValidCredentials = false; IsConfirmed = false; NotifyOfPropertyChange(()=>CurrentServer); } } private string _accountName; public string AccountName { get { return _accountName; } set { _accountName = value; NotifyOfPropertyChange(()=>AccountName); NotifyOfPropertyChange(() => HasCredentials); } } private string _token; public string Token { get { return _token; } set { _token = value; NotifyOfPropertyChange(()=>Token); NotifyOfPropertyChange(() => HasCredentials); } } private string _accountPath; public string AccountPath { get { return _accountPath; } set { _accountPath = value; NotifyOfPropertyChange(() => AccountPath); NotifyOfPropertyChange(() => HasAccountPath); } } public bool HasAccountPath { get { return !String.IsNullOrWhiteSpace(AccountPath); } } public bool HasCredentials { get { return !(String.IsNullOrWhiteSpace(AccountName) || String.IsNullOrWhiteSpace(Token) ) ; } } private bool _isConfirmed; public bool IsConfirmed { get { return _isConfirmed; } set { _isConfirmed = value; HasValidCredentials = false; NotifyOfPropertyChange(() => IsConfirmed); } } private bool _isAccountActive; public bool IsAccountActive { get { return _isAccountActive; } set { _isAccountActive = value; NotifyOfPropertyChange(() => IsAccountActive); } } private bool _shouldCreateOkeanosFolder; public bool ShouldCreateOkeanosFolder { get { return _shouldCreateOkeanosFolder; } set { _shouldCreateOkeanosFolder = value; NotifyOfPropertyChange(()=>ShouldCreateOkeanosFolder); } } public void SelectAccount() { using (var dlg = new FolderBrowserDialog{Description=Resources.AddAccountViewModel_SelectAccount_Please_select_a_folder}) { //Ask the user to select a folder //Note: We need a parent window here, which we retrieve with GetView var view = (Window)GetView(); if (DialogResult.OK != dlg.ShowDialog(new Wpf32Window(view))) return; AccountPath= dlg.SelectedPath; ShouldCreateOkeanosFolder=Directory.EnumerateFileSystemEntries(AccountPath).Any(); } } public void RetrieveCredentials() { SetBusy("Waiting for credentials.", "Please enter your credentials in the Pithos logon page"); IsConfirmed = false; try { var loginUri=new Uri(new Uri(CurrentServer) , "login"); var credentials = PithosAccount.RetrieveCredentials(loginUri.ToString()); if (credentials == null) return; AccountName = credentials.UserName; Token = credentials.Password; IsConfirmed = true; } catch (PithosException exc) { ClearBusy(); MessageBox.Show(exc.Message, "Unable to retrieve credentials"); } catch (Exception exc) { IsConfirmed = false; MessageBox.Show(exc.ToString(), "Error"); throw; } finally { ClearBusy(); ((Window) GetView()).Activate(); } if (IsConfirmed) TaskEx.Run(TestAccount); } public AddAccountViewModel() { _servers=new List { Settings.Default.ProductionServer, Settings.Default.DevelopmentServer }; CurrentServer = _servers[0]; DisplayName = "Add Pithos+ Account"; } private bool _hasValidCredentials; public bool HasValidCredentials { get { return _hasValidCredentials; } set { _hasValidCredentials = value; NotifyOfPropertyChange(()=>HasValidCredentials); } } private string _validationMessage; public string ValidationMessage { get { return _validationMessage; } set { _validationMessage = value; NotifyOfPropertyChange(()=>ValidationMessage); } } private bool _isWorking; public bool IsWorking { get { return _isWorking; } set { _isWorking = value; NotifyOfPropertyChange(()=>IsWorking); } } private string _busyTitle; public string BusyTitle { get { return _busyTitle; } set { _busyTitle = value; NotifyOfPropertyChange(()=>BusyTitle); } } private string _busyDetail; public string BusyDetail { get { return _busyDetail; } set { _busyDetail = value; NotifyOfPropertyChange(()=>BusyDetail); } } private void SetBusy(string title,string detail) { IsWorking = true; BusyTitle = title; BusyDetail = detail; } private void ClearBusy() { IsWorking = false; BusyTitle = ""; BusyDetail = ""; } public async void TestAccount() { try { SetBusy("Validating Credentials", ""); var client = new CloudFilesClient(AccountName, Token) { AuthenticationUrl = CurrentServer,/*Proxy=Proxy */}; await TaskEx.Run(() => { client.Authenticate(); return client.ListContainers(AccountName); }); HasValidCredentials = true; ValidationMessage = "Credentials Validated"; } catch { HasValidCredentials = false; MessageBox.Show("The account is not valid", "Account Error", MessageBoxButton.OK, MessageBoxImage.Stop); ValidationMessage = "Credentials validation failed"; } finally { ClearBusy(); } } } }