Автоматическая проверка паролей в системе Moodle

20.06.2011
Moodle - модульная объектно-ориентированная динамическая учебная среда, используется в основе учебными заведениями. В том числе и в нашем, и при каждом "важном" тестирование (например Гос. экзамен), возникает потребность проверить все учётные записи пользователей.

Зачем проверять?


Каждый год в наше УЗ поступает около 100 человек, для каждого из них создаётся учётная запись в Moodle. А активных пользователей постоянно около 600 и бывает так, что кому то ввели неправильный пароль, или (а вдруг?) сбой в БД. А т.к. регистрация закрытая, т.е. всех студентов регистрируют наши лаборанты, все логины/пароли хранятся у нас в отдельном Excel файле (Да и студенты их постоянно забывают, поэтому перед каждый тестирование распечатываем и выдаём).
Собственно, затем, что бы было меньше беготни, по поводу того что у кого то не заходит в Moodle, было решено создать небольшую утилитку, для считывания учёток с Excelевского файла и сверки их с БД. Да и как выше писалось, перед каждым "важным" тестированием лаборанты проверяют каждую нужную учётку - заходят под ними вручную.

Зашумление паролей


Зашумления паролей - это способ усиления защиты паролей путём добавления к паролю случайного набора символов (шума) перед вычислением контрольной суммы md5, за счёт чего становится сложнее восстановить пароль по контрольной сумме (чем длиннее случайный набор символов, тем сложнее это сделать).
Именно так хранятся пароли в Moodle, сама шумовая последовательность храниться в файле config.php, в переменной:
$CFG->passwordsaltmain

Шумовая последовательность добавляется к концу паролей.
И стоит отметить, если вы соберётесь обновить Moodle полностью, не забудьте сохранить файл конфигурации (а лучше хранить резерв всегда), а то при новой установке у вас сгенерируется новая шумовая последовательность и под старыми учётными записями будет невозможно войти.

Средства


По старой традиции, для написания утилиты использовался Delphi с компонентами TMS Software. А в частности компоненты AdvFileNameEdit и AdvStringGrid. Через первый находим файл электронных таблиц, а во втором отображаем его.
Так же я добавил пару AdvEdit, столько же AdvGlowButton и один AdvOfficeCheckBox.
Кнопки нам понадобятся для открытия листа Excel и проверки учётных записей. А в AdvEdit мы укажем имя листа Excel, который мы хотим открыть и собственно саму шумовую последовательность.

Приступим


Т.к. нам нужно открывать лишь таблицы Excel, то необходимо настроить фильтр у AdvFileNameEdit, для выбора файлов с расширением .xlsx и .xls:
AdvFileNameEdit.Filter : = 'MS Office |*.xlsx;*.xls;';

Но всё равно, при открытии файла может произойти ошибка (например, файл окажется битым или указано неверное имя листа). Поэтому, назовём одну из наших кнопок "Открыть файл" и в её событие OnClick добавим следующие:
try

AdvStringGrid1.LoadFromXLSSheet(AdvFileNameEdit1.Text, AdvEdit1.Text);
except
showmessage('Ошибка при открытии файла');
end;

Здесь мы используем замечательный метод LoadFromXLSSheet, с помощью которого мы собственно и загрузим данные из листа в наш AdbStringGrid. В качестве параметров необходимо указать путь до Excel файла и название листа. Что мы собственно и сделали, а если произойдёт какая либо ошибка - то об этом выведется сообщение.


Проверяем


Во время проверки паролей, возможно четыре варианта события:
1) Существует учётная запись с таким логином/паролем;
2) Неверный пароль к учётной записи;
3) Отсутствует учётная запись;
4) Некорректно заполнены поля в таблице.
С первыми тремя всё понятно, а вот последний озночает что ячейка с логином и/или паролем пуста.
И как вы могли заметить, слева на скриншоте, на форме есть CheckBox с надписью - "Восстановить пароль". Т.е. если мы поставим эту галочку. и у нас на какой либо учётке сработает второй вариант события (т.е. неверный пароль), то текущий пароль измениться на тот, который был указан в таблице Excel.
Вот и всё, несколько часов потраченных один раз на написание небольшой утилиты, позволят сэкономить в дальнейшем время на более полезные дела. =)