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}