コード例 #1
0
        // Deserialize received message and invoke callback that should process the message
        protected override void ProcessReceivedMessage(SocketAsyncEventArgs e)
        {
            var token = (HostAsyncUserToken)e.UserToken;

            // decrypt message data
            var decryptedMsgData = EncryptionAdapter.Decrypt(token.RecievedMsgData);

            Logger.WriteStr(" Dectypted message: " + utf8.GetString(decryptedMsgData));

            // deserialize to object
            Message message = null;

            try
            {
                message = WoxalizerAdapter.DeserializeFromXml(decryptedMsgData);
            }
            catch (Exception ex)
            {
                // it can be garbage or DoS attack, so better to close connection
                Logger.WriteStr("ERROR: Cannot deserialize recieved message (" + ex.Message + "). Aborting connection.");
                CloseConnection(e);
                return;
            }

            var args = new HostCustomEventArgs(e.SocketError, message)
            {
                Token = token
            };

            if (token.Callback != null)
            {
                token.Callback.Invoke(args);
            }
        }
コード例 #2
0
        protected override void ProcessReceivedMessage(SocketAsyncEventArgs e)
        {
            var token = (AsyncUserTokenBase)e.UserToken;

            // decrypt message data
            var decryptedMsgData = EncryptionAdapter.Decrypt(token.RecievedMsgData);

            Logger.WriteStr(" Recieved message was decrypted as xml: " + utf8.GetString(decryptedMsgData));

            // deserialize to object
            Message message = null;

            try
            {
                message = WoxalizerAdapter.DeserializeFromXml(decryptedMsgData);
            }
            catch (Exception ex)
            {
                Logger.WriteStr("ERROR: Cannot deserialize recieved message (" + ex.Message + "). Aborting connection.");
                CloseConnection(e);
            }

            if (message is RequestMessage)
            {
                ProcessReceivedMessageRequest(e, (RequestMessage)message);
            }
            else if (message is ResponseMessage)
            {
                ProcessReceivedMessageResponse(e, (ResponseMessage)message);
            }
            else
            {
                throw new ArgumentException("Cannot determinate Message type!");
            }
        }
コード例 #3
0
ファイル: Server.cs プロジェクト: alipov/open-rm
        private static readonly object AutoSaveLock = new object();     // for handeling "agent list autosave" from different threads


        public void Run()
        {
            if (ReadConfigFile())
            {
                Logger.CreateLogFile("logs", _logFilenamePattern);       // creates "logs" directory in binaries folder and set log filename
                Logger.WriteStr("Started");
                Console.WriteLine("Server started. You can minimize this window (but DON'T CLOSE). ");

                AppDomain currentDomain = AppDomain.CurrentDomain;
                currentDomain.UnhandledException += ExceptionHandler;

                EncryptionAdapter.SetEncryption(_secretKey);

                _agents = new Dictionary <int, HostAsyncUserToken>();
                // Try to load agents database (xml file)
                LoadAgentsList();

                _server = new TcpServerListenerAdv(_listenPort, _maxNumConnections, ReceiveBufferSize);
                _server.Start(OnReceiveCompleted);

                // Pause here
                Console.WriteLine("Press any key to terminate the server process....");
                Console.ReadKey();
                Logger.WriteStr("TCP terminated.");
            }
        }
コード例 #4
0
        // Start sending single message to client which token belongs to.
        public void Send(Message message, HostAsyncUserToken token)
        {
            byte[] messageToSend = WoxalizerAdapter.SerializeToXml(message);
            Logger.WriteStr(" The message to be send: " + utf8.GetString(messageToSend));

            // encrypt message
            byte[] encryptedMsgData = EncryptionAdapter.Encrypt(messageToSend);

            SendMessage(token, encryptedMsgData);
        }
コード例 #5
0
        private void AgentStarterThread()
        {
            // Read configuration from file
            if (!SettingsManager.ReadConfigFile())
            {
                _notifyIconComponent.ShowNotifiction("Error while reading configuration file.");
                return;
            }

            if (_newServerEndPoint != null)
            {
                SettingsManager.ServerEndPoint = _newServerEndPoint;       //override configuration file
            }
            EncryptionAdapter.SetEncryption(SettingsManager.SecretKey);

            Logger.CreateLogFile("logs", SettingsManager.LogFilenamePattern);       // creates "logs" directory in binaries folder and set log filename
            Logger.WriteStr("+++ Starting Agent by user request... +++");

            AgentStarted          = true;
            _retryIntervalCurrent = RetryIntervalInitial; //set to initial value

            while (true)                                  // always reconnect untill canceled
            {
                _client = new GeneralSocketClient();
                _client.Connect(SettingsManager.ServerEndPoint, OnConnectToServerCompleted);

                // pause here untill disconnected from server
                _clientDisconnected.Reset();
                _clientDisconnected.WaitOne();


                if (AgentStarted)
                {
                    Logger.WriteStr("Should be running so will try to reconnect to server in " + _retryIntervalCurrent + "seconds...");
                    _notifyIconComponent.ShowNotifiction("Will reconnect in " + _retryIntervalCurrent + "sec...");
                    Thread.Sleep(_retryIntervalCurrent * 1000);

                    //increase interval between reconnects up to retryIntervalMaximum value.
                    // it needed in case of frequent disconnects / when server is unreacheble
                    if (_retryIntervalCurrent < RetryIntervalMaximum)
                    {
                        _retryIntervalCurrent += 5;
                    }
                }
                else
                {
                    break;  //exit loop
                }
            }

            Logger.WriteStr("Client terminated");
        }
コード例 #6
0
        private void ConnectToServer()
        {
            // Read configuration from file
            if (!SettingsManager.ReadConfigFile())
            {
                return;                                         //TODO: add some message box?
            }
            // Initialize some global settings
            Logger.CreateLogFile("logs", SettingsManager.LogFilenamePattern);
            EncryptionAdapter.SetEncryption(SettingsManager.SecretKey);

            // Process to connect
            var messageClient = _container.Resolve <IMessageClient>();

            messageClient.Connect(SettingsManager.ServerEndPoint, OnConnectToServerCompleted);
        }
コード例 #7
0
        /// <summary>
        /// This method protects data that the taxonomy marks as High Impact.
        /// </summary>
        /// <param name="key">The key of the data, must be validated by the caller.</param>
        /// <param name="value">The value to protect, must be validated by the caller.</param>
        /// <returns>The original value, or an adapter around the encrypted serialized version of the data.</returns>
        /// <remarks>Data that is not serializable remains unencrypted, any failure to serialize or encrypt the data returns the data as is.
        /// When considering in-memory protection, Unknown classification results in no encryption so we rely mostly on PE classifications for determining HBI.</remarks>
        private object ProtectData(string key, object value)
        {
            // key cannot be null, empty or whitespaces, verified in calling context, no need for arg validation
            // value cannot be null, verified in calling context, no need for arg validation
            if (!value.GetType().IsSerializable)
            {
                // cannot serialize this type of data, do not attempt to encrypt, return as is
                // This is a shallow test (could be aggregating non-serializable data), in this case, we will get exception below
                return(value);
            }

            // getting the classification from the taxonomy chain informs whether or not we encrypt in-memory
            switch (TaxonomyChain.AuthoritativeInstance.GetClassification(key))
            {
            case TaxonomyClassification.HighImpact:
                // processing below switch block
                break;

            // For Internal and LowImpact data, we return the data directly
            case TaxonomyClassification.Internal:
            case TaxonomyClassification.LowImpact:
            case TaxonomyClassification.Unknown:
            default:
                return(value);
            }

            try
            {
                // Convert the key to upper case since entropy generation depends on the key casing, and workflow context keys are case insensitive
                return(BinarySerializationAdapter.CreateAdapter(data => EncryptionAdapter.CreateAdapter(this.Encryptor, key.ToUpperInvariant(), data), value));
            }
            catch (SerializationException)
            {
                // nothing to log, nothing to do (checked with Muhammad)
            }
            catch (CryptographicException)
            {
                // nothing to log, nothing to do (checked with Muhammad)
            }
            catch (SecurityException)
            {
                // nothing to log, nothing to do (checked with Muhammad)
            }

            // serialization or encryption failed, returning original data
            return(value);
        }
コード例 #8
0
ファイル: GeneralSocketClient.cs プロジェクト: alipov/open-rm
        public void Send(Message message, Action <CustomEventArgs> callback)
        {
            if (!_isConnected)
            {
                return;
            }
            //TODO:  check if exception needed: throw new SocketException((int)SocketError.NotConnected);

            _userToken.Callback = callback;

            byte[] messageToSend = WoxalizerAdapter.SerializeToXml(message);
            Logger.WriteStr(" The message (xml) to be sent: " + utf8.GetString(messageToSend));

            // encrypt message
            byte[] encryptedMsgData = EncryptionAdapter.Encrypt(messageToSend);

            SendMessage(_userToken, encryptedMsgData);
        }
コード例 #9
0
ファイル: GeneralSocketClient.cs プロジェクト: alipov/open-rm
        protected override void ProcessReceivedMessage(SocketAsyncEventArgs e)
        {
            // decrypt message
            byte[] decryptedMsgData = EncryptionAdapter.Decrypt(_userToken.RecievedMsgData);
            Logger.WriteStr(" Recieved message was decrypted as xml: " + utf8.GetString(decryptedMsgData));

            // deserialize to object
            Message message = null;

            try
            {
                message = WoxalizerAdapter.DeserializeFromXml(decryptedMsgData);
            }
            catch (Exception ex)
            {
                Logger.WriteStr("ERROR: Cannot deserialize recieved message (" + ex.Message + "). Aborting connection.");
                CloseConnection(e);
            }

            if (_userToken.Callback != null)
            {
                _userToken.Callback.Invoke(new CustomEventArgs(e.SocketError, message));
            }
        }