Exemplo n.º 1
0
    def reg_logic(self, conn, addr):
        """
        Логика регистрации пользователя
        """
        newuser_ip = addr[0]
        try:
            data = json.loads(conn.recv(1024).decode())
        except JSONDecodeError:
            if newuser_ip in self.reg_list:
                self.reg_list.remove(newuser_ip)
            return
        newuser_password, newuser_username = hash(
            data["password"]), data["username"]

        self.database.user_reg(newuser_ip, newuser_password, newuser_username)
        logger.info(f"Клиент {newuser_ip} -> регистрация прошла успешно")
        create_flag = FTPFileProcessing.new_user_reg(newuser_username)
        if create_flag:
            logger.info(
                f"Клиент {newuser_ip} -> создали root-директорию {newuser_username}"
            )
        else:
            logger.error(
                f"Клиент {newuser_ip} -> не удалось создать root-директорию {newuser_username}"
            )

        data = {"result": True}
        if newuser_ip in self.reg_list:
            self.reg_list.remove(newuser_ip)
            logger.info(f"Удалили клиента {newuser_ip} из списка регистрации")

        self.send_message(conn, data, newuser_ip)
        logger.info(
            f"Клиент {newuser_ip}. Отправили данные о результате регистрации")
Exemplo n.º 2
0
    def new_event_logic(self, conn, client_ip):
        """
        Логика обработки новых событий, которые приходят с клиента
        """
        data = ""

        # Имя пользователя по его ip
        username = self.ip2username_dict[client_ip]
        # Экземпляр класса для работы с файлами конкретного пользователя
        userfiles_logic = FTPFileProcessing(username)

        while True:
            # Получаем данные и собираем их по кусочкам
            chunk = conn.recv(1024)
            data += chunk.decode()

            # Если это конец сообщения, то значит, что мы все собрали и можем отдавать данные каждому соединению
            if END_MESSAGE_FLAG in data:

                data = data.replace(END_MESSAGE_FLAG, "")

                # Проверяем то, что это: файл или команда

                # Это файл
                if FILE_DETECT_FLAG in data:
                    logger.info(
                        f"Получили файл {data} от клиента {client_ip} ({username})"
                    )
                    # Записываем файл

                    file_name, file_content = data.split(FILE_DETECT_FLAG)
                    transfer_flag = userfiles_logic.client2server_transfer(
                        file_name, file_content)
                    if transfer_flag:
                        out_data = {
                            "result": True,
                            "description": "file received"
                        }
                    else:
                        out_data = {
                            "result": False,
                            "description": "file saving error"
                        }
                    self.send_message(conn, out_data, client_ip)

                # Команда для получения файла пользователя с сервера
                elif "get" in data:

                    description, is_result = userfiles_logic.server2client_transfer(
                        data)
                    out_data = {
                        "result": is_result,
                        "description": description
                    }
                    self.send_message(conn, out_data, client_ip)

                # Это одна из стандартных команд FTPFileProcessing
                else:

                    logger.info(
                        f"Получили команду {data} от клиента {client_ip} ({username})"
                    )

                    command = data.split(" ")

                    # Остановка работы программы
                    if command[0] == "exit":
                        break

                    # Получаем результат существования команды
                    result = userfiles_logic.router(command[0])

                    out_data = {"result": None, "description": None}

                    # Если есть такая команда
                    if result:
                        try:
                            description_str = result(*command[1:])
                            out_data = {
                                "result": True,
                                "description": description_str
                            }

                        except TypeError:
                            description_str = f"Команда {command[0]} была вызвана с некорректными аргументами"
                            out_data = {
                                "result": False,
                                "description": description_str
                            }
                    else:
                        commands_str = "\n".join([
                            f"{key} - {value}" for (
                                key,
                                value,
                            ) in userfiles_logic.get_commands().items()
                        ])
                        description_str = f"Команда {command[0]} не найдена! Список команд:\n{commands_str}"
                        out_data = {
                            "result": False,
                            "description": description_str
                        }

                    self.send_message(conn, out_data, client_ip)

                # Обнуляем буфер сообщений
                data = ""

            # Значит пришла только часть большого сообщения
            else:
                logger.info(
                    f"Приняли часть данных от клиента {client_ip}: '{data}'")

            # Если вообще ничего не пришло - это конец всего соединения
            if not chunk:
                break