00001 using System;
00002 using System.Diagnostics;
00003 using System.Security.Principal;
00004 using System.Threading;
00005 using System.Web.Services.Protocols;
00006 using System.Windows;
00007 using System.Windows.Forms;
00008 using System.Windows.Input;
00009 using CodePlex.MicrosoftProject.mpFx;
00010 using CodePlex.MicrosoftProject.mpFx.ProjectsWebService;
00011 using Mcs.Epm.MpFx.Browser.Controls;
00012 using Mcs.Epm.MpFx.Browser.Controls.Login;
00013 using Microsoft.MCS.Projects.MopsBrowser;
00014 using Cursors = System.Windows.Input.Cursors;
00015 using MessageBoxOptions = System.Windows.MessageBoxOptions;
00016
00017 namespace Mcs.Epm.MpFx.Browser
00018 {
00019 public partial class Window
00020 {
00021 private delegate void LoginDelegate();
00022
00023 private ProjectServer _ProjectServer;
00024 private WindowsIdentity _Identity;
00025 private IntPtr _UserToken;
00026 private WindowsImpersonationContext _ImpersonationContext;
00027
00028 public Window()
00029 {
00030 InitializeComponent();
00031
00032 Splash splash = new Splash();
00033
00034 splash.BuildOnComplete += splash_BuildOnComplete;
00035
00036 MainContentControl.Content = splash;
00037
00038
00039 WindowState = WindowState.Maximized;
00040 tabControl.Width = ActualWidth;
00041 }
00042
00043 void splash_BuildOnComplete()
00044 {
00045
00046 LoadLoginControl();
00047 }
00048
00049 private void Window_MouseDown(object sender, MouseButtonEventArgs e)
00050 {
00051 if (e.LeftButton == MouseButtonState.Pressed)
00052 {
00053 DragMove();
00054 }
00055 }
00056
00057 private void LoginButton_OnClick(object sender, RoutedEventArgs e)
00058 {
00059 LoadLoginControl();
00060 }
00061
00062 private void LoadLoginControl()
00063 {
00064 LoginControl loginControl = new LoginControl();
00065
00066 loginControl.OnCancelButtonClick += loginControl_OnCancelButtonClick;
00067 loginControl.OnLoginButtonClick += loginControl_OnLoginButtonClick;
00068
00069 MainContentControl.Content = loginControl;
00070 }
00071
00072 void loginControl_OnLoginButtonClick(object sender, EventArgs e)
00073 {
00074 if (IsLoginCredentialsValid())
00075 {
00076 SaveLoginSettings();
00077 Dispatcher.Invoke(new LoginDelegate(Login));
00078 }
00079 }
00080
00081 private void Login()
00082 {
00083 LoginControl loginControl = (LoginControl)MainContentControl.Content;
00084
00085 if (_ProjectServer != null)
00086 {
00087 _ProjectServer.Dispose();
00088 }
00089
00090 if (!loginControl.UseDefaultCredentials)
00091 {
00092 int index = loginControl.Profile.UserName.IndexOf('\\');
00093
00094 string domain;
00095 string userName;
00096
00097 if (index == -1)
00098 {
00099 domain = ".";
00100
00101 userName = loginControl.Profile.UserName;
00102 }
00103 else
00104 {
00105 domain = loginControl.Profile.UserName.Substring(0, index);
00106 userName = loginControl.Profile.UserName.Substring(index + 1);
00107 }
00108
00109 if (Win32Impersonation.LogonUser(userName, domain, loginControl.Profile.Password, Win32Impersonation.LogonSessionType.NewCredentials, out _UserToken))
00110 {
00111 _Identity = new WindowsIdentity(_UserToken);
00112 _ImpersonationContext = _Identity.Impersonate();
00113 }
00114 else
00115 {
00116 Debug.Print(Win32Impersonation.GetLastError().ToString());
00117
00118 Global.ShowMessageBox(this,
00119 "loginFailed",
00120 MessageBoxButton.OK,
00121 MessageBoxImage.Error,
00122 MessageBoxOptions.None);
00123
00124 Cursor = Cursors.Arrow;
00125 return;
00126 }
00127 }
00128
00129 try
00130 {
00131 _ProjectServer = new ProjectServer(loginControl.Profile.Url,
00132 DataStoreEnum.WorkingStore, null);
00133
00134 }
00135 catch (SoapException exception)
00136 {
00137
00138 }
00139 catch (MpFxException exception)
00140 {
00141
00142 }
00143 catch (Exception exception)
00144 {
00145
00146 }
00147 }
00148
00149 private void SaveLoginSettings()
00150 {
00151 LoginControl loginControl = (LoginControl)MainContentControl.Content;
00152 Settings.Default.pwaUrl = loginControl.Profile.Url;
00153 Settings.Default.userName = loginControl.Profile.UserName;
00154 Settings.Default.LastProfileName = loginControl.Profile.Name;
00155 Settings.Default.Save();
00156 }
00157
00158 private bool IsLoginCredentialsValid()
00159 {
00160 LoginControl loginControl = (LoginControl)MainContentControl.Content;
00161
00162 if (loginControl != null)
00163 {
00164 if (string.IsNullOrEmpty(loginControl.Profile.Url))
00165 {
00166 Global.ShowMessageBox(this,
00167 "missingPwaUrl",
00168 MessageBoxButton.OK,
00169 MessageBoxImage.Information,
00170 MessageBoxOptions.None);
00171
00172 return false;
00173 }
00174
00175 bool useDefualtCredentials = (bool) loginControl.useDefaultCredentialsCheckBox.IsChecked;
00176
00177 if (!useDefualtCredentials && string.IsNullOrEmpty(loginControl.Profile.UserName))
00178 {
00179 Global.ShowMessageBox(this,
00180 "missingUserName",
00181 MessageBoxButton.OK,
00182 MessageBoxImage.Information,
00183 MessageBoxOptions.None);
00184
00185 return false;
00186 }
00187
00188 if (!useDefualtCredentials && string.IsNullOrEmpty(loginControl.Profile.Password))
00189 {
00190 Global.ShowMessageBox(this,
00191 "missingPassword",
00192 MessageBoxButton.OK,
00193 MessageBoxImage.Information,
00194 MessageBoxOptions.None);
00195
00196 return false;
00197 }
00198
00199 return true;
00200 }
00201
00202 return false;
00203 }
00204
00205 void loginControl_OnCancelButtonClick(object sender, EventArgs e)
00206 {
00207 MainContentControl.Content = null;
00208 }
00209
00210 private void CloseButton_OnClick(object sender, RoutedEventArgs e)
00211 {
00212 Close();
00213 }
00214
00215 private void Window_OnSizeChanged(object sender, SizeChangedEventArgs e)
00216 {
00217 tabControl.Width = ActualWidth;
00218 }
00219
00220 private void Window_OnStateChanged(object sender, EventArgs e)
00221 {
00222 tabControl.Width = ActualWidth;
00223 }
00224
00225 private void CleanUp()
00226 {
00227 if (_ProjectServer != null)
00228 {
00229 _ProjectServer.Dispose();
00230 _ProjectServer = null;
00231 }
00232
00233 UndoImpersonation();
00234 }
00235
00236 private void UndoImpersonation()
00237 {
00238 if (_ImpersonationContext != null)
00239 {
00240 _ImpersonationContext.Undo();
00241 _ImpersonationContext.Dispose();
00242 }
00243
00244 if (_Identity != null)
00245 {
00246 _Identity.Dispose();
00247 }
00248
00249 if (_UserToken != IntPtr.Zero)
00250 {
00251 Win32Impersonation.CloseHandle(_UserToken);
00252 }
00253 }
00254 }
00255 }