Сообщить об ошибке.

Класс DummyAuthorizer() модуля pyftpdlib в Python

Управление пользователями FTP-сервера

Класс pyftpdlib.authorizers.DummyAuthorizer() модуля pyftpdlib - это базовый класс авторизатора, подходящий для создания подклассов собственных пользовательских авторизаторов. Этот класс, обрабатывает аутентификацию и разрешения FTP-сервера. Он используется внутри класса FTPHandler для проверки пароля пользователя, получения домашнего каталога пользователей, проверки разрешений пользователя при возникновении события чтения/записи файловой системы и смены пользователя перед доступом к файловой системе.

Класс pyftpdlib.authorizers.DummyAuthorizer это независимый от платформы интерфейс для управления "виртуальными" пользователями FTP-сервера. Обычно первое, что нужно сделать, это создать экземпляр этого класса и начать добавлять пользователей ftp:

>>> from pyftpdlib.authorizers import DummyAuthorizer
>>> authorizer = DummyAuthorizer()
>>> authorizer.add_user('user', 'password', '/home/user', perm='elradfmwMT')
>>> authorizer.add_anonymous('/home/nobody')

Методы экземпляра класса DummyAuthorizer.


DummyAuthorizer.add_user(username, password, homedir, perm="elr", msg_login="Login successful.", msg_quit="Goodbye."):

Метод DummyAuthorizer.add_user() добавляет пользователя в таблицу виртуальных пользователей.

Необязательный аргумент perm - это набор букв, ссылающихся на разрешения пользователя. Каждая буква используется для указания того, что текущему пользователю FTP предоставлены права доступа к следующим конкретным действиям.

При возникновении ошибок, таких как недостаточные разрешения или повторяющиеся имена пользователей поднимается исключение AuthorizerError.

Доступные разрешения

Разрешения на чтение:

  • "e": изменить каталог (команды CWD, CDUP)
  • "l": список файлов (команды LIST, NLST, STAT, MLSD, MLST, SIZE)
  • "r": извлечение файла с сервера (команда RETR)

Разрешения на чтение:

  • "a": добавить данные в существующий файл (команда APPE)
  • "d": удалить файл или каталог (команды DELE, RMD)
  • "f": переименовать файл или каталог (команды RNFR, RNTO)
  • "m": создать каталог (команда MKD)
  • "w": сохранить файл на сервер (команды STOR, STOU)
  • "M": изменить режим файла (команда SITE CHMOD)
  • "T": изменить время модификации файла (команда SITE MFMT)

Для предоставления настраиваемых строк ответа при входе пользователя в систему и выходе из нее можно указать необязательные аргументы msg_login и msg_quit.

DummyAuthorizer.add_anonymous(homedir, **kwargs):

Метод DummyAuthorizer.add_anonymous() добавляет анонимного пользователя в таблицу виртуальных пользователей. Исключение AuthorizerError возникает при таких условиях ошибки, как недостаточные разрешения, отсутствие домашнего каталога или дублирование анонимных пользователей.

Ключевые аргументы **kwargs такие же, как и в методе DummyAuthorizer.add_user(): perm, msg_login и msg_quit. Аргумент perm - это строка со значением по умолчанию 'elr', ссылающаяся на разрешение анонимного пользователя "только для чтения". Использование значения 'w' приводит к появлению предупреждения RuntimeWarning.

При возникновении ошибок, таких как недостаточные разрешения, отсутствие домашнего каталога или дублирование анонимных пользователей поднимается исключение AuthorizerError.

DummyAuthorizer.override_perm(username, directory, perm, recursive=False):

Метод DummyAuthorizer.override_perm() переопределяет пользовательские разрешения для данного каталога directory.

DummyAuthorizer.validate_authentication(username, password, handler):

Метод DummyAuthorizer.validate_authentication() вызывает pyftpdlib.authorizers.AuthenticationFailed, если предоставленные имя пользователя и пароль не соответствуют сохраненным учетным данным.

DummyAuthorizer.impersonate_user(username, password):

Метод DummyAuthorizer.impersonate_user() выдает себя за другого пользователя (изменяет текущего пользователя noop). Метод всегда вызывается перед доступом к файловой системе. По умолчанию ничего не делает.

Ожидается, что подкласс, переопределяющий этот метод, предоставит механизм для изменения текущего пользователя.

DummyAuthorizer.terminate_impersonation(username):

Метод DummyAuthorizer.terminate_impersonation() переключает обратно на исходного пользователя (noop). Метод всегда вызывается после доступа к файловой системе. По умолчанию ничего не делает.

Ожидается, что подкласс, переопределяющий этот метод, предоставит механизм для переключения обратно на исходного пользователя.

DummyAuthorizer.remove_user(username):

Метод DummyAuthorizer.remove_user() удаляет пользователя из таблицы виртуальных пользователей.

Пример хранения паролей на FTP-сервере в виде хэшей.

В приведенном ниже примере показано, как хранить пароли в виде односторонних хэшей с использованием алгоритма SHA1 (hashlib.sha1).

import os
import sys
from hashlib import sha1

from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed

class DummySHA1Authorizer(DummyAuthorizer):
    def validate_authentication(self, username, password, handler):
        hash = sha1(password.encode('utf-8')).hexdigest()
        try:
            if self.user_table[username]['pwd'] != hash:
                raise KeyError
        except KeyError:
            raise AuthenticationFailed

def main():
    # хеш-дайджест из текста пароля
    hash = sha1('12345'.encode('utf-8')).hexdigest()
    authorizer = DummySHA1Authorizer()
    authorizer.add_user('user', hash, os.getcwd(), perm='elradfmwMT')
    authorizer.add_anonymous(os.getcwd())
    handler = FTPHandler
    handler.authorizer = authorizer
    server = FTPServer(('', 2121), handler)
    server.serve_forever()

if __name__ == "__main__":
    main()