SSOCredentialsDialog.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. using UnityEngine;
  2. using UnityEditor;
  3. using PlasticGui;
  4. using Unity.PlasticSCM.Editor.UI;
  5. using Unity.PlasticSCM.Editor.UI.Progress;
  6. using Codice.CM.Common;
  7. using Codice.Client.Common.Connection;
  8. using Unity.PlasticSCM.Editor.Configuration.CloudEdition.Welcome;
  9. using PlasticGui.Configuration.CloudEdition.Welcome;
  10. using System.Collections.Generic;
  11. using PlasticGui.WebApi.Responses;
  12. using PlasticGui.Configuration.CloudEdition;
  13. namespace Unity.PlasticSCM.Editor.Configuration
  14. {
  15. internal class SSOCredentialsDialog : PlasticDialog, OAuthSignIn.INotify, Login.INotify
  16. {
  17. protected override Rect DefaultRect
  18. {
  19. get
  20. {
  21. var baseRect = base.DefaultRect;
  22. return new Rect(baseRect.x, baseRect.y, 525, 450);
  23. }
  24. }
  25. internal static AskCredentialsToUser.DialogData RequestCredentials(
  26. string cloudServer,
  27. EditorWindow parentWindow)
  28. {
  29. SSOCredentialsDialog dialog = Create(
  30. cloudServer, new ProgressControlsForDialogs());
  31. ResponseType dialogResult = dialog.RunModal(parentWindow);
  32. return dialog.BuildCredentialsDialogData(dialogResult);
  33. }
  34. protected override void OnModalGUI()
  35. {
  36. Title(PlasticLocalization.GetString(
  37. PlasticLocalization.Name.CredentialsDialogTitle));
  38. Paragraph(PlasticLocalization.GetString(
  39. PlasticLocalization.Name.CredentialsDialogExplanation, mServer));
  40. GUILayout.Space(20);
  41. DoEntriesArea();
  42. GUILayout.Space(10);
  43. DrawProgressForDialogs.For(
  44. mProgressControls.ProgressData);
  45. GUILayout.Space(10);
  46. DoButtonsArea();
  47. }
  48. protected override string GetTitle()
  49. {
  50. return PlasticLocalization.GetString(
  51. PlasticLocalization.Name.CredentialsDialogTitle);
  52. }
  53. AskCredentialsToUser.DialogData BuildCredentialsDialogData(
  54. ResponseType dialogResult)
  55. {
  56. return new AskCredentialsToUser.DialogData(
  57. dialogResult == ResponseType.Ok,
  58. mEmail, mPassword, false, SEIDWorkingMode.SSOWorkingMode);
  59. }
  60. void OAuthSignIn.INotify.SuccessForSSO(string organization)
  61. {
  62. OkButtonAction();
  63. }
  64. void OAuthSignIn.INotify.SuccessForProfile(string email)
  65. {
  66. OkButtonAction();
  67. }
  68. void OAuthSignIn.INotify.SuccessForCredentials(
  69. string email,
  70. string accessToken)
  71. {
  72. OkButtonAction();
  73. }
  74. void OAuthSignIn.INotify.Cancel(string errorMessage)
  75. {
  76. CancelButtonAction();
  77. }
  78. void OAuthSignIn.INotify.SuccessForConfigure(
  79. List<string> organizations,
  80. bool canCreateAnOrganization,
  81. string userName,
  82. string accessToken)
  83. {
  84. mEmail = userName;
  85. mPassword = accessToken;
  86. if (!organizations.Contains(mServer))
  87. {
  88. CancelButtonAction();
  89. return;
  90. }
  91. CloudEditionWelcomeWindow.JoinOrganization(mServer, userName, accessToken);
  92. GetWindow<PlasticWindow>().InitializePlastic();
  93. OkButtonAction();
  94. }
  95. void DoButtonsArea()
  96. {
  97. using (new EditorGUILayout.HorizontalScope())
  98. {
  99. GUILayout.FlexibleSpace();
  100. if (Application.platform == RuntimePlatform.WindowsEditor)
  101. {
  102. DoOkButton();
  103. DoCancelButton();
  104. return;
  105. }
  106. DoCancelButton();
  107. DoOkButton();
  108. }
  109. }
  110. internal void OAuthSignInForConfigure(string ssoProviderName)
  111. {
  112. OAuthSignIn mSignIn = new OAuthSignIn();
  113. mSignIn.ForConfigure(
  114. GetWindow<PlasticWindow>().PlasticWebRestApiForTesting,
  115. ssoProviderName,
  116. mProgressControls,
  117. this,
  118. GetWindow<PlasticWindow>().CmConnectionForTesting);
  119. }
  120. void DoUnityIDButton()
  121. {
  122. if (NormalButton("Sign in with Unity ID"))
  123. {
  124. OAuthSignInForConfigure(SsoProvider.UNITY_URL_ACTION);
  125. }
  126. }
  127. void DoEntriesArea()
  128. {
  129. Paragraph("Sign in with Unity ID");
  130. GUILayout.Space(5);
  131. DoUnityIDButton();
  132. GUILayout.Space(25);
  133. Paragraph(" --or-- ");
  134. Paragraph("Sign in with email");
  135. mEmail = TextEntry(PlasticLocalization.GetString(
  136. PlasticLocalization.Name.Email), mEmail,
  137. ENTRY_WIDTH, ENTRY_X);
  138. GUILayout.Space(5);
  139. mPassword = PasswordEntry(PlasticLocalization.GetString(
  140. PlasticLocalization.Name.Password), mPassword,
  141. ENTRY_WIDTH, ENTRY_X);
  142. }
  143. void DoOkButton()
  144. {
  145. if (!AcceptButton(PlasticLocalization.GetString(
  146. PlasticLocalization.Name.OkButton)))
  147. return;
  148. OkButtonWithValidationAction();
  149. }
  150. void DoCancelButton()
  151. {
  152. if (!NormalButton(PlasticLocalization.GetString(
  153. PlasticLocalization.Name.CancelButton)))
  154. return;
  155. CancelButtonAction();
  156. }
  157. void OkButtonWithValidationAction()
  158. {
  159. Login.Run(
  160. GetWindow<PlasticWindow>().PlasticWebRestApiForTesting,
  161. new SaveCloudEditionCreds(),
  162. mEmail,
  163. mPassword,
  164. string.Empty,
  165. Login.Mode.Configure,
  166. mProgressControls,
  167. this);
  168. }
  169. void Login.INotify.SuccessForConfigure(
  170. List<string> organizations,
  171. bool canCreateAnOrganization)
  172. {
  173. OkButtonAction();
  174. }
  175. void Login.INotify.SuccessForSSO(
  176. string organization)
  177. {
  178. OkButtonAction();
  179. }
  180. void Login.INotify.SuccessForCredentials(string userName, string password)
  181. {
  182. OkButtonAction();
  183. }
  184. void Login.INotify.SuccessForProfile(
  185. string userName)
  186. {
  187. OkButtonAction();
  188. }
  189. void Login.INotify.ValidationFailed(
  190. Login.ValidationResult validationResult)
  191. {
  192. CancelButtonAction();
  193. }
  194. void Login.INotify.SignUpNeeded(
  195. Login.Data loginData)
  196. {
  197. CancelButtonAction();
  198. }
  199. void Login.INotify.Error(
  200. string message)
  201. {
  202. CancelButtonAction();
  203. }
  204. static SSOCredentialsDialog Create(
  205. string server,
  206. ProgressControlsForDialogs progressControls)
  207. {
  208. var instance = CreateInstance<SSOCredentialsDialog>();
  209. instance.mServer = server;
  210. instance.mProgressControls = progressControls;
  211. instance.mEnterKeyAction = instance.OkButtonWithValidationAction;
  212. instance.mEscapeKeyAction = instance.CancelButtonAction;
  213. return instance;
  214. }
  215. string mEmail;
  216. string mPassword = string.Empty;
  217. ProgressControlsForDialogs mProgressControls;
  218. string mServer;
  219. const float ENTRY_WIDTH = 345f;
  220. const float ENTRY_X = 150f;
  221. }
  222. }