暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SSOCredentialsDialog.cs 8.0KB

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