2 using System.Collections.Generic;
\r
3 using System.ComponentModel;
\r
5 using System.Linq.Expressions;
\r
6 using System.Reflection;
\r
8 using System.Threading.Tasks;
\r
9 using System.Windows;
\r
10 using System.Windows.Controls;
\r
11 using System.Windows.Data;
\r
12 using System.Windows.Documents;
\r
13 using System.Windows.Input;
\r
14 using System.Windows.Media;
\r
15 using System.Windows.Media.Imaging;
\r
16 using System.Windows.Shapes;
\r
17 using Caliburn.Micro;
\r
18 using Pithos.Client.WPF.Properties;
\r
21 namespace Pithos.Client.WPF.Preferences
\r
24 /// Interaction logic for LoginView.xaml
\r
26 public partial class LoginView : Window,INotifyPropertyChanged
\r
28 private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
\r
31 private Uri _logoutUri;
\r
32 private bool _loggingOut;
\r
43 RaisePropertyChanged(() => Uri);
\r
47 private void RaisePropertyChanged(Expression<Func<Uri>> property)
\r
49 if (PropertyChanged != null)
\r
51 PropertyChanged(this, new PropertyChangedEventArgs(property.GetMemberInfo().Name));
\r
55 public LoginView(Uri loginUri, Uri logoutUri, string account = null)
\r
57 InitializeComponent();
\r
58 if (String.IsNullOrWhiteSpace(account))
\r
59 this.Title = "Retrieve Pithos credentials";
\r
61 this.Title = "Retrieve Pithos credentials for " + account;
\r
65 _logoutUri = logoutUri;
\r
69 LoginBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())");
\r
71 LoginBrowser.Navigate(logoutUri ?? loginUri);
\r
75 public string Token { get; set; }
\r
76 public string Account { get; set; }
\r
79 private void LoginBrowser_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
\r
81 IsBusy.IsBusy = true;
\r
82 LoginBrowser.Visibility=Visibility.Hidden;
\r
84 if (Log.IsDebugEnabled)
\r
85 Log.Debug(e.ToString());
\r
87 if (e.Uri.Scheme == "pithos")
\r
89 Log.DebugFormat("Authentication response [{0}]",e.Uri);
\r
91 var response = ParseResponse(e.Uri.Query);
\r
92 Account = response["user"];
\r
93 Token = response["token"];
\r
94 Log.InfoFormat("Token received for [{0}]", Account);
\r
95 DialogResult = true;
\r
100 private static Dictionary<string, string> ParseResponse(string request)
\r
102 //var parts = request.Split(' ');
\r
103 var query = request.TrimStart('?');
\r
105 var items = query.Split('&')
\r
106 .Select(pair => pair.Split('='))
\r
107 .ToDictionary(arr => arr[0].ToLower(), arr => Uri.UnescapeDataString(arr[1]));
\r
111 public event PropertyChangedEventHandler PropertyChanged;
\r
113 private void Retry_Click(object sender, RoutedEventArgs e)
\r
115 LoginBrowser.Navigate(Uri);
\r
118 private void LoginBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
\r
122 _loggingOut = false;
\r
123 IsBusy.BusyContent = "Opening login screen";
\r
124 LoginBrowser.Navigate(Uri);
\r
128 IsBusy.IsBusy = false;
\r
129 LoginBrowser.Visibility = Visibility.Visible;
\r