I am using an editable span with some js to submit the input via ajax to the server. The span is only editable by admins.
To give them some formatting options they can use MARKMIN in the span. The problem is it only seems to be one directional. How can I take the processed HTML and turn it back into MARKMIN in order to allow editing? or at least sanitize it that I can be sure no malicious code has been submitted so I can save the MARKMIN in the db. js that sends the span contents. $("document").ready(function() { // set the event listeners on the edit button $("button[name='buttonedit']").click(function() { var panel = $(this)[0].previousSibling panel.innerText = panel.getAttribute("data-raw") panel.setAttribute("contenteditable", "true") // console.log(panel) $(this).hide() $(this)[0].nextSibling.setAttribute("style", "display:true") }) $("button[name='buttonsave']").click(function() { $(this).disabled = true var xhttp = new XMLHttpRequest(); xhttp.open('POST', '/assist/update_info_panel', true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); var panel = $(this)[0].previousElementSibling.previousElementSibling var body = { 'pid': panel.id, 'body': panel.innerText, }; // console.log(body); xhttp.onreadystatechange = function() { // debug code // if (this.readyState == 4) { // console.log(this); // }; if (this.readyState == 4 && this.status == 200) { var rObj = JSON.parse(this.responseText); $("span#"+rObj.pid).replaceWith(rObj.body) $("span#"+rObj.pid) .next().attr("style", "display:true") .next().attr("style", "display:None") $("span#"+rObj.pid).find("a").attr("target", "_blank") } }; xhttp.send(JSON.stringify(body)); }) }) the controller function that receives the markmin (via json) and returns the HTML. In order to allow editing the raw markmin is stored in a data attribute. I feel this is very unsafe which is why I am asking for help. def update_info_panel(): if auth.has_membership('assistant_admin', cached=True): raw_json = None for key in request.vars.keys(): if len(key) > 10: raw_json = key inData = Storage(json.loads(raw_json)) pid = inData.pid[5:] record = db.product[pid] assist_info = inData.body if record: record.update_record(assist_info=assist_info) body = { 'pid': inData.pid, 'body': SPAN(MARKMIN(assist_info), _id=inData.pid, _name='info_panel', _contenteditable='false', data = {'raw': assist_info} ).__str__() } return json.dumps(body) else: pass The section of the view which holds the span and edit buttons. <div id='info_box' class='well'> {{try:}} {{for item in extra_info:}} {{=DIV( SPAN(MARKMIN(item['info']), _id= 'info_{0}'.format(item['pid']), _name= 'info_panel', _contenteditable= 'false', _style="display:block", data= { 'raw':item['info'] if auth.has_membership('assistant_admin') else '', }, ), BUTTON(SPAN(_class="glyphicon glyphicon-pencil"), _class='btn btn-sm btn-default', _name='buttonedit')\ if auth.has_membership('assistant_admin') else '', BUTTON(SPAN(_class='glyphicon glyphicon-floppy-disk'), _class="btn btn-sm btn-primary", _name="buttonsave", _style="display:none")\ if auth.has_membership('assistant_admin') else '', _id= 'box_{0}'.format(item['id']), _style='display:none', )}} {{pass}} {{except Exception as e:}} {{print e}} {{pass}} </div> The function looks and works great. Apart from the Italic formatting cutting the JSON string short, resulting in invalid JSON and me being very uneasy about saving raw user input into the db and then letting it back out again. As a side question. Is there different way to add the JSON string to the ajax request in js so that it is accessible from somwhere other than as a key in request.vars? -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.