예제 #1
0
		private StartUserSessionRequest BuildRequest(string swid, RSAParameters rsaParameters)
		{
			long sessionGroupId = database.GetSessionGroupId();
			string publicKeyExponent = Convert.ToBase64String(rsaParameters.Exponent);
			string publicKeyModulus = Convert.ToBase64String(rsaParameters.Modulus);
			StartUserSessionRequest startUserSessionRequest = new StartUserSessionRequest();
			startUserSessionRequest.PublicKeyExponent = publicKeyExponent;
			startUserSessionRequest.PublicKeyModulus = publicKeyModulus;
			startUserSessionRequest.SessionGroupId = sessionGroupId;
			startUserSessionRequest.UserId = swid;
			startUserSessionRequest.ProtocolVersion = 3;
			return startUserSessionRequest;
		}
예제 #2
0
		private void Start(string swid, string guestControllerAccessToken, RSAParameters rsaParameters, Action<MixSessionStartResult> successCallback, Action failureCallback)
		{
			try
			{
				ISessionRefresher sessionRefresher = sessionRefresherFactory.Create(this);
				IMixWebCallFactory mixWebCallFactory = mixWebCallFactoryFactory.Create(sessionStartEncryptor, swid, guestControllerAccessToken, sessionRefresher);
				StartUserSessionRequest request = BuildRequest(swid, rsaParameters);
				IWebCall<StartUserSessionRequest, StartUserSessionResponse> webCall = mixWebCallFactory.SessionUserPut(request);
				webCall.OnResponse += delegate(object sender, WebCallEventArgs<StartUserSessionResponse> e)
				{
					StartUserSessionResponse response = e.Response;
					if (!ValidateResponse(response))
					{
						logger.Critical("Error parsing the session start response: " + JsonParser.ToJson(response));
						failureCallback();
					}
					else
					{
						long sessionId = response.SessionId.Value;
						byte[] ciphertext = Convert.FromBase64String(response.EncryptedSymmetricKey);
						byte[] symmetricKey = rsaEncryptor.Decrypt(ciphertext, rsaParameters);
						keychain.PushNotificationKey = symmetricKey;
						database.UpdateSessionDocument(swid, delegate(SessionDocument doc)
						{
							doc.PreviousSymmetricEncryptionKey = doc.CurrentSymmetricEncryptionKey;
							doc.CurrentSymmetricEncryptionKey = symmetricKey;
							doc.SessionId = sessionId;
							doc.LatestNotificationSequenceNumber = 0L;
						});
						IWebCallEncryptor webCallEncryptor = webCallEncryptorFactory.Create(symmetricKey, sessionId);
						MixSessionStartResult obj = new MixSessionStartResult(webCallEncryptor);
						successCallback(obj);
					}
				};
				webCall.OnError += delegate
				{
					failureCallback();
				};
				webCall.Execute(force: true);
			}
			catch (Exception ex)
			{
				logger.Critical("Unhandled exception: " + ex);
				failureCallback();
			}
		}
예제 #3
0
 public IWebCall <StartUserSessionRequest, StartUserSessionResponse> SessionUserPut(StartUserSessionRequest request)
 {
     return(CreateWebCall <StartUserSessionRequest, StartUserSessionResponse>(HttpMethod.PUT, new Uri(host + "/session/user"), request));
 }