Slightly restrain allowed HTML tags + adjust style for problems instr/solu
authorBenjamin Auder <benjamin.auder@somewhere>
Sat, 2 May 2020 02:14:53 +0000 (04:14 +0200)
committerBenjamin Auder <benjamin.auder@somewhere>
Sat, 2 May 2020 02:14:53 +0000 (04:14 +0200)
client/src/components/UserBio.vue
client/src/views/Problems.vue
server/routes/problems.js
server/routes/users.js

index 01bafd2..4631e83 100644 (file)
@@ -115,7 +115,7 @@ export default {
 .bio-content
   text-align: left
   margin: 0 var(--universal-margin)
 .bio-content
   text-align: left
   margin: 0 var(--universal-margin)
-  p, ul, ol
+  p, ul, ol, pre, table, h3, h4, h5, h6, blockquote
     margin: var(--universal-margin) 0
   .br
     display: block
     margin: var(--universal-margin) 0
   .br
     display: block
index b989fbc..adc0ad3 100644 (file)
@@ -47,14 +47,14 @@ main
           @input="adjustHeight('instructions')"
           v-model="curproblem.instruction"
         )
           @input="adjustHeight('instructions')"
           v-model="curproblem.instruction"
         )
-        p(v-html="parseHtml(curproblem.instruction)")
+        .instructions(v-html="parseHtml(curproblem.instruction)")
       fieldset
         textarea.solution-edit(
           :placeholder="st.tr['Solution']"
           @input="adjustHeight('solution')"
           v-model="curproblem.solution"
         )
       fieldset
         textarea.solution-edit(
           :placeholder="st.tr['Solution']"
           @input="adjustHeight('solution')"
           v-model="curproblem.solution"
         )
-        p(v-html="parseHtml(curproblem.solution)")
+        .solution(v-html="parseHtml(curproblem.solution)")
       button(@click="sendProblem()") {{ st.tr["Send"] }}
       #dialog.text-center {{ st.tr[infoMsg] }}
   .row(v-if="showOne")
       button(@click="sendProblem()") {{ st.tr["Send"] }}
       #dialog.text-center {{ st.tr[infoMsg] }}
   .row(v-if="showOne")
@@ -70,12 +70,12 @@ main
           | {{ st.tr["Previous_p"] }}
         button.nomargin(@click="gotoPrevNext(curproblem,-1)")
           | {{ st.tr["Next_p"] }}
           | {{ st.tr["Previous_p"] }}
         button.nomargin(@click="gotoPrevNext(curproblem,-1)")
           | {{ st.tr["Next_p"] }}
-      p.oneInstructions.clickable(
+      .instructions.oneInstructions.clickable(
         v-html="parseHtml(curproblem.instruction)"
         @click="curproblem.showSolution=!curproblem.showSolution"
       )
         | {{ st.tr["Show solution"] }}
         v-html="parseHtml(curproblem.instruction)"
         @click="curproblem.showSolution=!curproblem.showSolution"
       )
         | {{ st.tr["Show solution"] }}
-      p(
+      .solution(
         v-show="curproblem.showSolution"
         v-html="parseHtml(curproblem.solution)"
       )
         v-show="curproblem.showSolution"
         v-html="parseHtml(curproblem.solution)"
       )
@@ -513,9 +513,13 @@ export default {
 <style lang="sass">
 @import "@/styles/_board_squares_img.sass"
 @import "@/styles/_rules.sass"
 <style lang="sass">
 @import "@/styles/_board_squares_img.sass"
 @import "@/styles/_rules.sass"
-.br
-  display: block
-  margin: 10px 0
+.instructions, .solution
+  margin: 0 var(--universal-margin)
+  p, ul, ol, pre, table, h3, h4, h5, h6, blockquote
+    margin: var(--universal-margin) 0
+  .br
+    display: block
+    margin: 10px 0
 </style>
 
 <style lang="sass" scoped>
 </style>
 
 <style lang="sass" scoped>
@@ -562,7 +566,7 @@ button#loadMoreBtn
   & > *
     margin: 0
 
   & > *
     margin: 0
 
-p.oneInstructions
+.oneInstructions
   margin: 0
   padding: 2px 5px
   background-color: lightgreen
   margin: 0
   padding: 2px 5px
   background-color: lightgreen
index 746be9a..5f4dd40 100644 (file)
@@ -2,7 +2,16 @@ let router = require("express").Router();
 const access = require("../utils/access");
 const params = require("../config/parameters");
 const ProblemModel = require("../models/Problem");
 const access = require("../utils/access");
 const params = require("../config/parameters");
 const ProblemModel = require("../models/Problem");
-const sanitizeHtml = require('sanitize-html');
+const sanitizeHtml_pkg = require('sanitize-html');
+
+const allowedTags = [
+  'h3', 'h4', 'h5', 'h6', 'blockquote', 'p', 'a', 'ul', 'ol', 'li', 'b',
+  'i', 'strong', 'em', 'strike', 'code', 'hr', 'br', 'div', 'table',
+  'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre'
+];
+function sanitizeHtml(text) {
+  return sanitizeHtml_pkg(text, { allowedTags: allowedTags });
+}
 
 router.post("/problems", access.logged, access.ajax, (req,res) => {
   if (ProblemModel.checkProblem(req.body.prob)) {
 
 router.post("/problems", access.logged, access.ajax, (req,res) => {
   if (ProblemModel.checkProblem(req.body.prob)) {
index d637e13..a3fa706 100644 (file)
@@ -4,7 +4,16 @@ const sendEmail = require('../utils/mailer');
 const genToken = require("../utils/tokenGenerator");
 const access = require("../utils/access");
 const params = require("../config/parameters");
 const genToken = require("../utils/tokenGenerator");
 const access = require("../utils/access");
 const params = require("../config/parameters");
-const sanitizeHtml = require('sanitize-html');
+const sanitizeHtml_pkg = require('sanitize-html');
+
+const allowedTags = [
+  'h3', 'h4', 'h5', 'h6', 'blockquote', 'p', 'a', 'ul', 'ol', 'li', 'b',
+  'i', 'strong', 'em', 'strike', 'code', 'hr', 'br', 'div', 'table',
+  'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre'
+];
+function sanitizeHtml(text) {
+  return sanitizeHtml_pkg(text, { allowedTags: allowedTags });
+}
 
 router.get("/userbio", access.ajax, (req,res) => {
   const uid = req.query["id"];
 
 router.get("/userbio", access.ajax, (req,res) => {
   const uid = req.query["id"];