A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3
4using UnityEngine;
5using UnityEditor;
6
7using Codice.CM.Common;
8using Codice.Client.Common;
9using Codice.Client.Common.Authentication;
10using Codice.Client.Common.Connection;
11using Codice.Client.Common.WebApi.Responses;
12using PlasticGui;
13using PlasticGui.Configuration.CloudEdition;
14using PlasticGui.Configuration.CloudEdition.Welcome;
15using PlasticGui.WorkspaceWindow.Home;
16using Unity.PlasticSCM.Editor.UI;
17using Unity.PlasticSCM.Editor.UI.Progress;
18
19namespace Unity.PlasticSCM.Editor.Configuration
20{
21 internal class SSOCredentialsDialog :
22 PlasticDialog,
23 OAuthSignIn.INotify,
24 GetCloudOrganizations.INotify
25 {
26 protected override Rect DefaultRect
27 {
28 get
29 {
30 var baseRect = base.DefaultRect;
31 return new Rect(baseRect.x, baseRect.y, 525, 450);
32 }
33 }
34
35 internal static AskCredentialsToUser.DialogData RequestCredentials(
36 string cloudServer,
37 EditorWindow parentWindow)
38 {
39 SSOCredentialsDialog dialog = Create(
40 cloudServer, new ProgressControlsForDialogs());
41 ResponseType dialogResult = dialog.RunModal(parentWindow);
42
43 return dialog.BuildCredentialsDialogData(dialogResult);
44 }
45
46 protected override string GetTitle()
47 {
48 return PlasticLocalization.Name.CredentialsDialogTitle.GetString();
49 }
50
51 protected override void OnModalGUI()
52 {
53 Title(PlasticLocalization.Name.CredentialsDialogTitle.GetString());
54
55 Paragraph(
56 PlasticLocalization.Name.CredentialsDialogExplanation.GetString(
57 mOrganizationInfo.DisplayName));
58
59 GUILayout.Space(20);
60
61 DoEntriesArea();
62
63 GUILayout.Space(10);
64
65 DrawProgressForDialogs.For(
66 mProgressControls.ProgressData);
67
68 GUILayout.Space(10);
69
70 DoButtonsArea();
71 }
72
73 void DoEntriesArea()
74 {
75 Paragraph("Sign in with Unity ID");
76 GUILayout.Space(5);
77
78 DoUnityIDButton();
79
80 GUILayout.Space(25);
81 Paragraph(" --or-- ");
82
83 Paragraph("Sign in with email");
84
85 mEmail = TextEntry(
86 PlasticLocalization.Name.Email.GetString(),
87 mEmail, ENTRY_WIDTH, ENTRY_X);
88
89 GUILayout.Space(5);
90
91 mPassword = PasswordEntry(
92 PlasticLocalization.Name.Password.GetString(),
93 mPassword, ENTRY_WIDTH, ENTRY_X);
94 }
95
96 void DoUnityIDButton()
97 {
98 if (NormalButton("Sign in with Unity ID"))
99 {
100 Guid state = Guid.NewGuid();
101
102 OAuthSignInForUnityPackage(
103 GetAuthProviders.GetUnityIdAuthProvider(string.Empty, state),
104 GetCredentialsFromState.Build(
105 string.Empty,
106 state,
107 SEIDWorkingMode.SSOWorkingMode,
108 PlasticGui.Plastic.WebRestAPI));
109 }
110 }
111
112 void DoButtonsArea()
113 {
114 using (new EditorGUILayout.HorizontalScope())
115 {
116 GUILayout.FlexibleSpace();
117
118 if (Application.platform == RuntimePlatform.WindowsEditor)
119 {
120 DoOkButton();
121 DoCancelButton();
122 return;
123 }
124
125 DoCancelButton();
126 DoOkButton();
127 }
128 }
129
130 void DoOkButton()
131 {
132 if (!AcceptButton(PlasticLocalization.Name.OkButton.GetString()))
133 return;
134
135 OkButtonWithValidationAction();
136 }
137
138 void DoCancelButton()
139 {
140 if (!NormalButton(PlasticLocalization.Name.CancelButton.GetString()))
141 return;
142
143 CancelButtonAction();
144 }
145
146 void OkButtonWithValidationAction()
147 {
148 mCredentials = new Credentials(
149 new SEID(mEmail, false, mPassword),
150 SEIDWorkingMode.LDAPWorkingMode);
151
152 GetCloudOrganizations.GetOrganizationsInThreadWaiter(
153 mCredentials.User.Data,
154 mCredentials.User.Password,
155 mProgressControls,
156 this,
157 PlasticGui.Plastic.WebRestAPI,
158 CmConnection.Get());
159 }
160
161 void OAuthSignInForUnityPackage(
162 AuthProvider authProvider, IGetCredentialsFromState getCredentialsFromState)
163 {
164 OAuthSignIn oAuthSignIn = new OAuthSignIn();
165
166 oAuthSignIn.SignInForProviderInThreadWaiter(
167 authProvider,
168 string.Empty,
169 mProgressControls,
170 this,
171 new OAuthSignIn.Browser(),
172 getCredentialsFromState);
173 }
174
175 void OAuthSignIn.INotify.SignedInForCloud(
176 string chosenProviderName, Credentials credentials)
177 {
178 mCredentials = credentials;
179
180 GetCloudOrganizations.GetOrganizationsInThreadWaiter(
181 mCredentials.User.Data,
182 mCredentials.User.Password,
183 mProgressControls,
184 this,
185 PlasticGui.Plastic.WebRestAPI,
186 CmConnection.Get());
187 }
188
189 void OAuthSignIn.INotify.SignedInForOnPremise(
190 string server, string proxy, Credentials credentials)
191 {
192 // The Plugin does not support SSO for on-premise (OIDCWorkingMode / SAMLWorkingMode)
193 // as it is not prepared to show the necessary UI
194 }
195
196 void OAuthSignIn.INotify.Cancel(string errorMessage)
197 {
198 CancelButtonAction();
199 }
200
201 void GetCloudOrganizations.INotify.CloudOrganizationsRetrieved(
202 List<string> cloudOrganizations)
203 {
204 if (!cloudOrganizations.Contains(mOrganizationInfo.Server))
205 {
206 CancelButtonAction();
207 return;
208 }
209
210 ClientConfiguration.Save(
211 mOrganizationInfo.Server,
212 mCredentials.Mode,
213 mCredentials.User.Data,
214 mCredentials.User.Password);
215
216 GetWindow<PlasticWindow>().InitializePlastic();
217 OkButtonAction();
218 }
219
220 void GetCloudOrganizations.INotify.Error(ErrorResponse.ErrorFields error)
221 {
222 CancelButtonAction();
223 }
224
225 AskCredentialsToUser.DialogData BuildCredentialsDialogData(ResponseType dialogResult)
226 {
227 return dialogResult == ResponseType.Ok
228 ? AskCredentialsToUser.DialogData.Success(mCredentials)
229 : AskCredentialsToUser.DialogData.Failure(SEIDWorkingMode.SSOWorkingMode);
230 }
231
232 static SSOCredentialsDialog Create(
233 string server,
234 ProgressControlsForDialogs progressControls)
235 {
236 var instance = CreateInstance<SSOCredentialsDialog>();
237 instance.mOrganizationInfo = OrganizationsInformation.FromServer(server);
238 instance.mProgressControls = progressControls;
239 instance.mEnterKeyAction = instance.OkButtonWithValidationAction;
240 instance.mEscapeKeyAction = instance.CancelButtonAction;
241 return instance;
242 }
243
244 string mEmail;
245 string mPassword = string.Empty;
246
247 Credentials mCredentials;
248 ProgressControlsForDialogs mProgressControls;
249
250 OrganizationInfo mOrganizationInfo;
251
252 const float ENTRY_WIDTH = 345f;
253 const float ENTRY_X = 150f;
254 }
255}