Удаление категории через AJAX

Issue #360 resolved
Oleg Sychev repo owner created an issue

По кнопке с крестиком. Предпочтительнее подключать к кнопке новую функциональность уже Javascript - так если у кого он отключен то останется старая.

Обратить внимание на то, чтобы запросить у пользователя точно ли он согласен удалить через небольшое окошко сообщения, и на посылку сообщения на удаление через POST-запрос с проверкой ключа сессии (который получаем на сервере для окошка сообщения) во избежание XSRF-атак - см. https://docs.moodle.org/dev/Security:Cross-site_request_forgery по деталям.

Comments (21)

  1. Elena Lepilkina

    Вы говорили, по моему, что в преге где-то что-то подобное сделано. Где это можно посмотреть?

  2. Oleg Sychev reporter

    Смотря что конкретно вы имеете ввиду под "чем-то подобным"? Поскольку удалением категорий Preg явно не занимается. Там была расширенная обработка кнопки с выдачей окна - это в question/type/poasquestion код связанный с poasquestion_text_and_button и его использованием в preg. У вас формочка будет очень простая, да/нет лишь бы отправляла ключ сессии через post - посмотрите как это сейчас делается без AJAX при удалении тех же категорий.

    Просто кнопка с крестиком, она на окне категорий есть - вам нужно только перехватить действия по ее нажатию.

  3. Elena Lepilkina

    Я про форму с подтверждением. Я думала, что это некоторое всплывающее окно, генерируемое js, а это получается просто страница, так? Ну по крайне мере в удалении пользователей сделано так

  4. Oleg Sychev reporter

    Вы посмотрели что такое XSRF и как с ним борются по моей ссылке выше? Там должны быть понятны основные требования. Вам нужно с сервера получить ключ сессии при генерации формы и отправить его с подтверждением в виде POST-запроса.

    Сейчас это отдельная страница, что вызывает перезагрузку основной - чего мы и пытаемся избежать. Теперь это должно стать всплывающим окном, но скорее всего оно будет именно показывать через AJAX такую же страницу, а не быть просто alert'ом из Javascript. Если сможете выполнить условия предыдущего абзаца (они же защита от XSRF) используя alert - пожалуйста.

    P.S. Вы можете использовать код из poasquestion если это нужно при условии что добавите его в dependencies в version.php - можно в том же preg посмотреть как это делается.

  5. Elena Lepilkina

    Я просто не вижу смысла подменять полностью страницу с помощью ajax. Что помешает сделать нормальное всплывающее окно (не alert, а что то типо такого http://yuilibrary.com/yui/docs/panel/dialog.html). Просто до отображения диалога, отправлять на сервер запрос на получения ключа сессии, а потом этот ключ обратно отправлять при подтверждении. В чем проблема? Может я чего-то не вижу.

    Сейчас при удалении категорий кстати не проверяется ключ сессии.

  6. Oleg Sychev reporter

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

    Для форм ключ сессии проверяется автоматически классом формы, вы уверены что он правда не проверяется? В статье про XSRF в принципе описано как это проверить...

  7. Elena Lepilkina

    Там нет никакой формы подтверждения для удаления категорий. Там просто отправляется запрос на удаление и он сразу выполняется.

  8. Oleg Sychev reporter

    Ну нам лучше ключ получить перед удалением. Если там действительно нет проверки мне надо будет посмотреть и написать им про уязвимость (если вы не хотите сами это сделать).

  9. Elena Lepilkina

    Нет, они все-таки работают с ключом сессии, но своеобразно, они сразу на кнопку удалить вешают ссылку на страницу, содержащую ключ сессии. А потом вызывают форму, но не отображают ее, и удаляют категорию. Может тогда делать как у них сделано, не отображая формы?

  10. Oleg Sychev reporter

    Важна генерация и проверка ключа сессии и отправка post-запросом. Это можно сделать через форму (которая автоматически это делает), а можно и нет. Выбор за вами. В статье написано как это сделать в самом примитивном виде. При этом сервер должен проверить, что пришел именно post запрос - функция для этого тоже есть.

  11. Oleg Sychev reporter

    А зачем вам понадобилось иконку лишнюю добавлять?

  12. Oleg Sychev reporter

    При попытке удалить созданную тут же категорию 123 на http://edu.vstu.org/local/ajaxcategories/index.php?courseid=1 получаю окошко на надписью "Ar" и странным расположением кнопок ок/отмена.

    Строки для пользователя в Moodle должны браться через систему Lang файлов чтобы быть переводимыми на его язык. Как это соединить с JS показано в https://docs.moodle.org/dev/JavaScript_guidelines#Getting_Moodle_to_load_your_JavaScript_files (не сразу, прочитайте раздел до конца).

  13. Elena Lepilkina

    А Вы кэш почистили? должна быть нормальная надпись

  14. Oleg Sychev reporter

    Кэш чистил. Надпись через день стала нормальной, но на русский язык не переводится и в lang файле я изменений не вижу, так что сделана она непереводимой - текст жестко забит в код, его видно в diff. В сообщение я бы встроил название категории, иначе можно ошибиться. Фактически можно использовать имеющееся сообщение из Moodle - у него куда больше шансов быть переведенным на другие языки, чем у нашего отдельного. Как это сделать я вам ссылку прислал выше.

    Кроме того, вы где-нибудь в moodle видели "ОК" справа от "отмены"?

  15. Oleg Sychev reporter

    1)Обеспечить совместимость с текущим интерфейсом Moodle при наличии вопросов в категории (запрос, куда вопросы перенести).

    2) Реализовать подстановку имени категории в место в строке, обозначенное как {$a} т.к. в разных языках это место (как и знак вопроса) может быть разным.

  16. Oleg Sychev reporter

    Прошу прощения за задержку, был тяжелый семестр + болел. Вы какой версией Moodle пользуетесь? Я установил на 3.0 и у меня вообще пункт в меню не добавляется, так что протестить не могу. И на странице плагина тоже пользователи писатели что не могут. Пожалуйста проверьте на 2.9 и 3.0 что пункты добавляются, на 3.1 тоже желательно - но если там по разному то сначала делаем версию для того, где перестала работать старая...

  17. Log in to comment