;;; Copyright © 2019 - 2022 Jakob L. Kreuze ;;; ;;; This program is free software; you can redistribute it and/or ;;; modify it under the terms of the GNU General Public License as ;;; published by the Free Software Foundation; either version 3 of the ;;; License, or (at your option) any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program. If not, see ;;; . (define-module (jakob dynamic capabilities comment-form) #:use-module (gcrypt base64) #:use-module (haunt html) #:use-module (ice-9 match) #:use-module (jakob dynamic captcha) #:use-module (jakob dynamic util) #:use-module (jakob theme) #:use-module (jakob utils sxml) #:use-module (json) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) #:use-module (web request) #:use-module (web response) #:use-module (web uri) #:export (get-comment-form)) (define (render-comment-form slug) (let-values (((captcha-id captcha-image) (new-captcha!))) `((div (@ (id "comment-form")) (h1 "Comment form") (form (@ (id "comment-input") (action "/api/comment") (method "post")) (input (@ (type "text") (name "slug") (hidden #t) (value ,slug))) (input (@ (type "text") (name "captcha-id") (hidden #t) (value ,captcha-id))) (fieldset (@ (id "commenter-info")) (legend "Commenter Info") (label (@ (for "name")) "Name:") (input (@ (type "text") (id "name") (name "name") (required #t) (size 24))) (label (@ (for "email")) "Email (optional, used for Gravatar):") (input (@ (type "text") (id "email") (name "email") (size 24))) (label (@ (for "url")) "Webpage URL (optional):") (input (@ (type "text") (id "url") (name "url") (size 24)))) (fieldset (@ (id "comment-content")) (legend "Comment") (label (@ (for "subject")) "Subject (optional):") (input (@ (type "text") (id "subject") (name "subject") (size 24))) (label (@ (for "comment")) "Comment :") (textarea (@ (id "coment") (name "comment") (rows 4) (cols 50)))) (fieldset (@ (id "comment-captcha")) (legend "Captcha") (label (@ (for "captcha")) "Please evaluate the following definite integral:") (img (@ (src ,(format #f "data:image/jpeg;charset=utf-8;base64,~a" (base64-encode captcha-image))))) (input (@ (type "text") (id "captcha") (name "captcha") (size 24))) (button (@ (id "pow-trigger") (hidden #t)) "Too hard? (Or unable to see the challenge?) Click here.") (input (@ (type "text") (id "captcha-alt") (name "captcha-alt") (hidden #t))) (input (@ (type "text") (id "captcha-alt-id") (name "captcha-alt-id") (hidden #t))) (input (@ (type "submit") (id "submit-form") (value "Submit"))))) ,(script "proof-of-work.js"))))) (define (get-comment-form request body) "API endpoint handler for querying for the comments on a particular post This is a wrapper around `get-comments-by-slug'." (let* ((path-encoded (uri-path (request-uri request))) (path (split-and-decode-uri-path path-encoded)) (slug (last path))) (values '((content-type . (text/html))) (sxml->html-string (theme #:content (render-comment-form slug) #:title "Comment prompt")))))