protected override void Encode(IChannelHandlerContext context, IObject message, IByteBuffer output)
        {
            if (message == null)
            {
                return;
            }

            var messageId = ClientSettings.ClientSession.GenerateMessageId();

            var isRequest = message is IRequest;

            var sequenceNumber = ClientSettings.ClientSession.GenerateSequenceNumber(isRequest);

            SessionWriter.Save(ClientSettings.ClientSession);

            var messageBuffer = Serializer.Serialize(message);

            try
            {
                MtProtoHelper.ToServerEncrypt(messageBuffer, ClientSettings.ClientSession, messageId, sequenceNumber, output);
            }
            finally
            {
                messageBuffer.Release();
            }

            Log.Debug($"#{ClientSettings.ClientSession.SessionId}: Send secure message {message} with messageId = {messageId} and sequenceNumber = {sequenceNumber}");

            if (isRequest)
            {
                RequestService.AttachRequestToMessageId(message.Is <IRequest>(), messageId);
            }
        }
 public SessionLifecycleHandlerBuilder ConfigureSessionWriter(RawSession session)
 {
     SessionWriter
     .Setup(w => w.WriteSession(session, IdleExpirationTime))
     .Returns(Task.CompletedTask);
     return(this);
 }
Пример #3
0
        private async Task OnUserAuthenticated(TUser user)
        {
            var session = ClientSettings.ClientSession;

            session.UserId = user.Id;

            await SessionWriter.Save(session).ConfigureAwait(false);
        }
Пример #4
0
        /// <inheritdoc />
        public async Task Logout(CancellationToken cancellationToken)
        {
            if (ClientSettings.ClientSession.UserId.HasValue)
            {
                await ContextGetter.Context.WriteAndFlushAsync(new RequestLogOut());

                RequestService.ReturnException(new UserLogoutException());

                ClientSettings.ClientSession.UserId = null;

                await SessionWriter.Save(ClientSettings.ClientSession);
            }
        }
        protected override void ChannelRead0(IChannelHandlerContext ctx, TBadServerSalt msg)
        {
            Log.Info($"#{ClientSettings.ClientSession.SessionId}: Bad server sault detected! message id = {msg.BadMsgId} ");

            ClientSettings.ClientSession.ServerSalt = BitConverter.GetBytes(msg.NewServerSalt);

            var request = RequestService.GetRequestToReply(msg.BadMsgId);

            var saveTask = SessionWriter.Save(ClientSettings.ClientSession);

            if (request != null)
            {
                saveTask.ContinueWith(_ => ctx.WriteAndFlushAsync(request));
            }
        }
Пример #6
0
        public void EmptyDB_WriteAll()
        {
            sut = new SessionWriter(fakeContext.Object,
                                    new DataReceiver(),
                                    new DataProvider(fakeContext.Object),
                                    new HierarchyWriter(fakeContext.Object),
                                    new MetricWriter(fakeContext.Object));

            sut.WriteSession();

            Assert.That(fakeContext.Object.Sessions.Count, Is.EqualTo(1));
            Assert.That(fakeContext.Object.Containers.Count, Is.EqualTo(5));
            Assert.That(fakeContext.Object.Sensors.Count, Is.EqualTo(19));
            Assert.That(fakeContext.Object.Metrics.Count, Is.EqualTo(19));
        }
Пример #7
0
        protected override void ChannelRead0(IChannelHandlerContext ctx, IObject msg)
        {
            switch (msg)
            {
            case TResPQ resPq:
                Guard.That(resPq.Nonce).IsItemsEquals(_nonce);

                Log.Debug($"#{ClientSettings.ClientSession.SessionId}: TResPQ step complete");

                var requestReqDhParams = Step2ClientHelper.GetRequest(resPq, ClientSettings.PublicKey, out _newNonce);
                ctx.WriteAndFlushAsync(requestReqDhParams);
                break;

            case TServerDHParamsOk dhParamsOk:
                Log.Debug($"#{ClientSettings.ClientSession.SessionId}: TServerDHParamsOk step complete");

                var request = Step3ClientHelper.GetRequest(dhParamsOk, _newNonce, out _clientAgree, out var serverTime);
                ClientSettings.ClientSession.TimeOffset = serverTime - (int)DateTimeOffset.Now.ToUnixTimeSeconds();

                SessionWriter.Save(ClientSettings.ClientSession)
                .ContinueWith(_ => ctx.WriteAndFlushAsync(request));

                break;

            case TDhGenOk dhGenOk:
                Log.Debug($"#{ClientSettings.ClientSession.SessionId}: TDhGenOk step complete");

                ClientSettings.ClientSession.AuthKey    = new AuthKey(_clientAgree);
                ClientSettings.ClientSession.ServerSalt = SaltHelper.ComputeSalt(_newNonce, dhGenOk.ServerNonce);

                SessionWriter.Save(ClientSettings.ClientSession)
                .ContinueWith(_ => ctx.FireUserEventTriggered(ESystemNotification.HandshakeComplete));
                break;

            case TServerDHParamsFail _:
            case TDhGenRetry _:
            case TDhGenFail _:
                throw new NotSupportedException();

            default:
                ctx.FireChannelRead(msg);
                break;
            }
        }
        public void GenerateFile()
        {
            // Get templates
            string templatePath = AssetDatabaseExt.GetAssetFilePath(TemplateFile);
            var    parser       = new TemplateParser(templatePath);

            parser.Parse();
            ITemplate template = parser.GetParsedTemplate();

            // Build session
            ISession session = BuildSession(template);

            // Write session to file
            Directory.CreateDirectory(OutputFolder);

            SessionWriter writer = new SessionWriter();

            writer.WriteSession(session, OutputPath);
            Debug.Log($"Menu script generated at '{OutputPath}'.");
        }
Пример #9
0
        protected override void Encode(IChannelHandlerContext context, IObject message, IByteBuffer output)
        {
            var newMessageId = ClientSettings.ClientSession.GenerateMessageId();

            SessionWriter.Save(ClientSettings.ClientSession);

            Log.Debug($"#{ClientSettings.ClientSession.SessionId}: Send handshake message {message} with id : {newMessageId}");

            output.WriteLongLE(0);
            output.WriteLongLE(newMessageId);

            var dataBuffer = Serializer.Serialize(message);

            try
            {
                output.WriteIntLE(dataBuffer.ReadableBytes);
                output.WriteBytes(dataBuffer);
            }
            finally
            {
                dataBuffer.SafeRelease();
            }
        }