Exemplo n.º 1
0
        public User GetUserById(ulong userId, bool cached = false)
        {
            if (cached && _userCache.TryGetValue(userId, out User user))
            {
                return(user);
            }
            UserRequestMsg userRequestMsg = new UserRequestMsg();

            userRequestMsg.UserIdDetail = userId;
            MainMessage msg = new MainMessage();

            msg.UserMngMsg         = new UserMngMsg();
            msg.UserMngMsg.UserMsg = new UserMsg();
            msg.UserMngMsg.UserMsg.UserRequestMsg = userRequestMsg;
            MainMessage response = _api.OpenAPI.Networking.Send(msg, _api.OpenAPI.Config.MainServer);

            if (response.MessageTypeCase != MainMessage.MessageTypeOneofCase.UserMngMsg)
            {
                if (ISystemService.IsError(response))
                {
                    _log.Error(response.SystemMsg.ErrorMsg.ErrorMsg_);
                }
                return(null);
            }
            user = new User(response.UserMngMsg.UserMsg.UserDetailMsg);
            _userCache[userId] = user;
            return(user);
        }
Exemplo n.º 2
0
        public ulong?GetUserIdByClientId(ulong clientId, bool cached = false)
        {
            if (cached && _clientId2UserId.TryGetValue(clientId, out ulong?val))
            {
                return(val);
            }
            UserRequestMsg userRequestMsg = new UserRequestMsg();

            userRequestMsg.UserByClientId = clientId;
            MainMessage msg = new MainMessage();

            msg.UserMngMsg         = new UserMngMsg();
            msg.UserMngMsg.UserMsg = new UserMsg();
            msg.UserMngMsg.UserMsg.UserRequestMsg = userRequestMsg;
            MainMessage response = _api.OpenAPI.Networking.Send(msg, _api.OpenAPI.Config.MainServer);

            if (ISystemService.IsError(response))
            {
                _log.Error(response.SystemMsg.ErrorMsg.ErrorMsg_);
                return(null);
            }
            User user = new User(response.UserMngMsg.UserMsg.UserDetailMsg);

            _userCache[user.Id]        = user;
            _clientId2UserId[clientId] = user.Id;
            return(user.Id);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Próba zalogowania się w aplikacji NOL3.
        /// Normalnie metoda ta jest wywoływana automatycznie już przy utworzeniu obiektu NolClient...
        /// chyba że skorzystaliśmy z jednego z dodatkowych konstruktorów, pomijając automatyczne zalogowanie.
        /// </summary>
        public void Login()
        {
            Debug.WriteLine("\nLogin...");
StartLogin:
            using (Socket socket = GetSyncSocket())
            {
                UserRequestMsg request = new UserRequestMsg();
                request.Type     = UserRequestType.Login;
                request.Username = "******";
                request.Password = "******";
                request.Send(socket);
                try
                {
                    UserResponseMsg response = new UserResponseMsg(socket);
                    if ((response.Status == UserStatus.Other) && (response.StatusText == "User is already logged"))
                    {
                        MyUtil.PrintWarning("NOL says: We're already logged in !?");
                    }
                    else
                    if (response.Status != UserStatus.LoggedIn)
                    {
                        throw new FixmlErrorMsgException(response);
                    }
                }
                catch (BizMessageRejectException e)
                {
                    // całe to przechwytywanie wyjątków i powtórki możnaby pominąć, gdyby NOL nie blokował
                    // numerku ReqID, jeśli jego poprzedni klient nie zrealizował prawidłowo logowania/wylogowania
                    if (e.Msg.RejectText == "Incorrect UserReqID")
                    {
                        if (request.Id < 100)
                        {
                            goto StartLogin;                                            // każdy kolejny UserRequestMsg z większym "Id"
                        }
                        else
                        {
                            throw new FixmlException("UserReqID limit reached!");
                        }
                    }
                    else
                    {
                        throw;
                    }
                }
            }
            loggedIn = true;
            Debug.WriteLine("Login OK\n");
        }
Exemplo n.º 4
0
 /// <summary>
 /// Próba wylogowania się z aplikacji NOL3.
 /// Normalnie metoda ta jest wywoływana automatycznie przy zwalnianiu obiektu NolClient...
 /// ale nic nie szkodzi wywołać ją wcześniej jawnie (poza tym, że połączenie przestanie działać).
 /// </summary>
 public void Logout()
 {
     Debug.WriteLine("\nLogout...");
     loggedIn = false;              // <- nawet, jeśli niżej będzie błąd (żeby się nie powtarzał w destruktorze)
     statusOn = false;              // resetujemy też zmienne informujące o włączonym stanie subskrypcji
     mdReqId  = null;               // (na wypadek ponownego połączenia - żeby mógł wtedy wznowić subkrypcję)
     using (Socket socket = GetSyncSocket())
     {
         UserRequestMsg request = new UserRequestMsg();
         request.Type     = UserRequestType.Logout;
         request.Username = "******";
         request.Send(socket);
         UserResponseMsg response = new UserResponseMsg(socket);
         if (response.Status != UserStatus.LoggedOut)
         {
             throw new FixmlErrorMsgException(response);
         }
     }
     Debug.WriteLine("Logout OK\n");
 }
Exemplo n.º 5
0
        /// <summary>
        /// Bardziej zaawansowany przykład użycia "NolClient": zalogowanie dopiero na żądanie,
        /// bez uruchamiania wątku odbierającego komunikaty asynchroniczne (można go obsłużyć samemu).
        /// Samodzielne przygotowanie, wysyłka i odbiór przykładowego message'a.
        /// </summary>
        public void Execute()
        {
            using (var nol = new NolClient(false, false))
            {
                // zalogowanie użytkownika
                Console.WriteLine("\nPress any key... to log in   [Esc - cancel]\n");
                if (Console.ReadKey(true).Key == ConsoleKey.Escape)
                {
                    return;
                }
                nol.Login();

                // otwarcie kanału asynchronicznego
                // (na razie nic tu z niego nie odbieramy, bo do tego przydałby się oddzielny wątek)
                Console.WriteLine("\nPress any key... to open async socket   [Esc - skip]\n");
                Socket asyncSocket = null;
                if (Console.ReadKey(true).Key != ConsoleKey.Escape)
                {
                    asyncSocket = NolClient.GetAsyncSocket();
                }

                // wysyłka przykładowego komunikatu
                // (można skorzystać z gotowych klas zdefiniowanych w pjank.BossaAPI.Fixml,
                // ale można też spreparować coś zupełnie własnego w oparciu o klasę CustomMsg)
                Console.WriteLine("\nPress any key... to send a custom message   [Esc - cancel]\n");
                if (Console.ReadKey(true).Key == ConsoleKey.Escape)
                {
                    return;
                }
                var tmp = FixmlMsg.DebugOriginalXml.Enabled;
                try
                {
                    FixmlMsg.DebugOriginalXml.Enabled = true;

                    // otwarcie nowego połączenia (kanał synchroniczny za każdym razem nowy!)
                    using (var syncSocket = NolClient.GetSyncSocket())
                    {
                        // przygotowanie komunikatu
                        var request = new UserRequestMsg()
                        {
                            Username = "******",
                            Type     = UserRequestType.GetStatus,
                        };
                        // wysyłka komunikatu
                        request.Send(syncSocket);

                        // odbiór odpowiedzi
                        Console.WriteLine("\nPress any key... to read the response\n");
                        Console.ReadKey(true);
                        var response = new FixmlMsg(syncSocket);
                        Trace.WriteLine("\nResponse XML:\n" + response.Xml.FormattedXml() + "\n");

                        // dokładniejsza analiza odpowiedzi (w klasie konkretnego rodzaju komunikatu)
                        Console.WriteLine("Press any key... to parse the response message\n");
                        Console.ReadKey(true);
                        UserResponseMsg parsedResponse = new UserResponseMsg(response);
                        Trace.WriteLine(String.Format("\nResponse parsed:\n Status = {0}, StatusText = '{1}'\n",
                                                      parsedResponse.Status, parsedResponse.StatusText));
                    }

                    Console.WriteLine("\nPress any key... to send another custom message   [Esc - cancel]\n");
                    if (Console.ReadKey(true).Key == ConsoleKey.Escape)
                    {
                        return;
                    }

                    // otwarcie nowego połączenia (kanał synchroniczny za każdym razem nowy!)
                    using (var syncSocket = NolClient.GetSyncSocket())
                    {
                        // tak można spreparować dowolny komunikat, również taki jeszcze nieistniejący ;->
                        var request    = new CustomMsg("MyCustomRequest");
                        var xmlElement = request.AddElement("Test");
                        xmlElement.SetAttribute("attr1", "1");
                        xmlElement.SetAttribute("attr2", "2");
                        // wysyłka tak samodzielnie spreparowanego komunikatu
                        request.Send(syncSocket);
                        // odbiór odpowiedzi - tutaj powinniśmy otrzymać błąd... "BizMessageRejectException"
                        // niestety aktualna wersja NOL3 zwraca nieprawidłowy XML, którego nie da się parsować
                        Console.WriteLine("\nPress any key... to read the response\n");
                        Console.ReadKey(true);
                        var response = new FixmlMsg(syncSocket);
                    }
                }
                catch (Exception e)
                {
                    MyUtil.PrintError(e);
                }
                FixmlMsg.DebugOriginalXml.Enabled = tmp;
                Console.ReadKey(true);
                if (asyncSocket != null)
                {
                    asyncSocket.Close();
                }
            }              // tu następuje automatyczne wylogowanie
        }
Exemplo n.º 6
0
        private MainMessage HandleUserRequest(MainMessage msg)
        {
            _log.Debug("In HandleUserRequest method.");
            try
            {
                // TODO needs enhancemnets
                UserRequestMsg userRequest = msg.UserMngMsg.UserMsg.UserRequestMsg;
                switch (userRequest.UserRequestTypeCase)
                {
                // create new User
                case UserRequestMsg.UserRequestTypeOneofCase.CreateQuery:
                    _log.Debug("Creating new user: "******"User sucessfuly created.");
                    return(new MainMessage {
                        UserMngMsg = userMngMsg
                    });

                // List users (Username LIKE '%msg.username%')
                case UserRequestMsg.UserRequestTypeOneofCase.ListQuery:
                    _log.Debug("Looking for user like: " + userRequest.ListQuery.Username);
                    UserDetailMsg   userDetail = userRequest.ListQuery;
                    UserDetailMsg[] users      = User.List(userDetail)
                                                 .Select(x => new UserDetailMsg {
                        Password = "", UserId = x.Id, Username = x.Username
                    })
                                                 .ToArray();
                    UserListMsg userList = new UserListMsg();
                    userList.Users.AddRange(users);
                    UserMngMsg userMngMsg1 = new UserMngMsg();
                    userMngMsg1.UserMsg = new UserMsg {
                        UserListMsg = userList
                    };
                    _log.Debug($"Found {users.Length} records.");
                    return(new MainMessage {
                        UserMngMsg = userMngMsg1
                    });

                // Change password, where old and new password are in same filed, separated by newline
                case UserRequestMsg.UserRequestTypeOneofCase.UpdateQuery:
                    _log.Debug("Changing password to user: "******"Password sucessfuly changed.");
                    return(ISystemService.CreateOkMessage(msg.MsgId));

                // show user by its Id
                case UserRequestMsg.UserRequestTypeOneofCase.UserIdDetail:
                    _log.Debug($"Looking for user with id {userRequest.UserIdDetail}");
                    User          user2       = User.Get(userRequest.UserIdDetail);
                    UserDetailMsg userDetail1 = new UserDetailMsg();
                    userDetail1.UserId   = user2.Id;
                    userDetail1.Password = "";
                    userDetail1.Username = user2.Username;
                    UserMsg userMsg1 = new UserMsg();
                    userMsg1.UserDetailMsg = userDetail1;
                    return(new MainMessage {
                        UserMngMsg = new UserMngMsg {
                            UserMsg = userMsg1
                        }
                    });

                case UserRequestMsg.UserRequestTypeOneofCase.UserByClientId:
                    _log.Debug($"Looking for user with client id {userRequest.UserByClientId}");
                    if (msg.SenderIdCase != MainMessage.SenderIdOneofCase.ServerId)
                    {
                        return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Not enough permissions."));
                    }
                    ulong clientId = userRequest.UserByClientId;
                    if (clientId >= (ulong)_clientMachines.Count || _clientMachines[(int)clientId] == null)
                    {
                        return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Unable to find user with this client ID"));
                    }
                    MainMessage respUserDetail = new MainMessage();
                    respUserDetail.UserMngMsg         = new UserMngMsg();
                    respUserDetail.UserMngMsg.UserMsg = new UserMsg();
                    respUserDetail.UserMngMsg.UserMsg.UserDetailMsg = _clientMachines[(int)clientId].ToMessage();
                    return(respUserDetail);

                default:
                    throw new ErrorMsgException("This message cannot be empty.");
                }
            }
            catch (Exception ex)
            {
                _log.Error(ex);
                return(ISystemService.CreateErrorMessage(0, 0, 0, ex.Message));
            }
        }