Commit 8062daef7543f9a509f209cf95425a05390194eb

Authored by Miguel Barão
1 parent 93b22072
Exists in master and in 1 other branch dev

- added support for xsrf (cross site request forgery)

1 1
2 -BUGS: 2 +# BUGS
3 3
4 - detect questions in questions.yaml without ref -> error ou generate default. 4 - detect questions in questions.yaml without ref -> error ou generate default.
5 - topicos virtuais nao deveriam aparecer. na construção da árvore os sucessores seriam ligados directamente aos predecessores. 5 - topicos virtuais nao deveriam aparecer. na construção da árvore os sucessores seriam ligados directamente aos predecessores.
6 - Criar outra estrutura organizada em capítulos (conjuntos de tópicos). Permitir capítulos de capítulos, etc. talvez usar grafos de grafos... 6 - Criar outra estrutura organizada em capítulos (conjuntos de tópicos). Permitir capítulos de capítulos, etc. talvez usar grafos de grafos...
7 - error if demo.yaml has no topics 7 - error if demo.yaml has no topics
8 - session management. close after inactive time. 8 - session management. close after inactive time.
9 -- implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]()  
10 - generators not working: bcrypt (ver blog) 9 - generators not working: bcrypt (ver blog)
11 - tabelas nas perguntas radio/checkbox não ocupam todo o espaço como em question. 10 - tabelas nas perguntas radio/checkbox não ocupam todo o espaço como em question.
12 - mover javascript para ficheiros externos e carregar com <script defer src='...'> 11 - mover javascript para ficheiros externos e carregar com <script defer src='...'>
13 12
14 -TODO: 13 +# TODO
15 14
16 -- pertuntas tipo tristate: (sim, não, não sei 15 +- update de fontawesome para versão 5.
17 - reportar comentarios após submeter. 16 - reportar comentarios após submeter.
18 - each topic only loads a sample of K questions (max) in random order. 17 - each topic only loads a sample of K questions (max) in random order.
19 - servir imagens/ficheiros. 18 - servir imagens/ficheiros.
  19 +- pertuntas tipo tristate: (sim, não, não sei
20 - forçar reload das perguntas sem ter de deitar abaixo o servidor. 20 - forçar reload das perguntas sem ter de deitar abaixo o servidor.
21 -- update de fontawesome para versão 5.  
22 - reload das perguntas enquanto online. 21 - reload das perguntas enquanto online.
23 - tabela de progresso de todos os alunos por topico. 22 - tabela de progresso de todos os alunos por topico.
24 - tabela com perguntas / quantidade de respostas certas/erradas. 23 - tabela com perguntas / quantidade de respostas certas/erradas.
@@ -27,12 +26,13 @@ TODO: @@ -27,12 +26,13 @@ TODO:
27 - implementar servidor http com redirect para https. 26 - implementar servidor http com redirect para https.
28 - usar codemirror no textarea 27 - usar codemirror no textarea
29 - ao fim de 3 tentativas com password errada, envia email com nova password. 28 - ao fim de 3 tentativas com password errada, envia email com nova password.
30 -- titulos das perguntas não suportam markdown. 29 +- titulos das perguntas não suportam markdown.
31 - pagina report que permita ver tabela alunos/topicos, estatisticas perguntas mais falhadas, tempo médio por pergunta. 30 - pagina report que permita ver tabela alunos/topicos, estatisticas perguntas mais falhadas, tempo médio por pergunta.
32 - normalizar com perguntations. 31 - normalizar com perguntations.
33 32
34 -FIXED: 33 +# FIXED
35 34
  35 +- implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]()
36 - se refs de um topic estao invalidos, nao carrega esse topico. devia haver um error nos logs a indicar qual o ref invalido. 36 - se refs de um topic estao invalidos, nao carrega esse topico. devia haver um error nos logs a indicar qual o ref invalido.
37 - link directo para topico nao valida se topico esta unlocked. 37 - link directo para topico nao valida se topico esta unlocked.
38 - templates not working: quesntion-information, question-warning (remove all informative panels??) 38 - templates not working: quesntion-information, question-warning (remove all informative panels??)
@@ -37,7 +37,7 @@ class WebApplication(tornado.web.Application): @@ -37,7 +37,7 @@ class WebApplication(tornado.web.Application):
37 'template_path': path.join(path.dirname(__file__), 'templates'), 37 'template_path': path.join(path.dirname(__file__), 'templates'),
38 'static_path': path.join(path.dirname(__file__), 'static'), 38 'static_path': path.join(path.dirname(__file__), 'static'),
39 'static_url_prefix': '/static/', 39 'static_url_prefix': '/static/',
40 - 'xsrf_cookies': False, # FIXME see how to do it... 40 + 'xsrf_cookies': True,
41 'cookie_secret': base64.b64encode(uuid.uuid4().bytes), 41 'cookie_secret': base64.b64encode(uuid.uuid4().bytes),
42 'login_url': '/login', 42 'login_url': '/login',
43 'debug': debug, 43 'debug': debug,
templates/maintopics.html
@@ -138,10 +138,17 @@ @@ -138,10 +138,17 @@
138 $("#notifications").fadeIn(250).delay(5000).fadeOut(500); 138 $("#notifications").fadeIn(250).delay(5000).fadeOut(500);
139 } 139 }
140 140
  141 + function getCookie(name) {
  142 + var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
  143 + return r ? r[1] : undefined;
  144 + }
  145 +
141 function change_password() { 146 function change_password() {
  147 + var token = getCookie('_xsrf');
142 $.ajax({ 148 $.ajax({
143 type: "POST", 149 type: "POST",
144 url: "/change_password", 150 url: "/change_password",
  151 + headers: {'X-XSRFToken' : token },
145 data: { 152 data: {
146 "new_password": $("#new_password").val(), 153 "new_password": $("#new_password").val(),
147 }, 154 },
templates/topic.html
@@ -190,7 +190,6 @@ @@ -190,7 +190,6 @@
190 $.ajax({ 190 $.ajax({
191 type: "GET", 191 type: "GET",
192 url: "/question", 192 url: "/question",
193 - // headers: {"X-XSRFToken": token},  
194 dataType: "json", // expected from server 193 dataType: "json", // expected from server
195 success: updateQuestion, 194 success: updateQuestion,
196 error: function() {alert("O servidor não responde.");} 195 error: function() {alert("O servidor não responde.");}
@@ -203,7 +202,6 @@ @@ -203,7 +202,6 @@
203 $.ajax({ 202 $.ajax({
204 type: "POST", 203 type: "POST",
205 url: "/question", 204 url: "/question",
206 - // headers: {"X-XSRFToken": token},  
207 data: $("#question_form").serialize(), // {'a':10,'b':20}, 205 data: $("#question_form").serialize(), // {'a':10,'b':20},
208 dataType: "json", // expected from server 206 dataType: "json", // expected from server
209 success: updateQuestion, 207 success: updateQuestion,