diff options
Diffstat (limited to 'cgi-bin')
| -rwxr-xr-x | cgi-bin/guest_book.cgi | 75 | 
1 files changed, 69 insertions, 6 deletions
diff --git a/cgi-bin/guest_book.cgi b/cgi-bin/guest_book.cgi index 966093a..d527d2d 100755 --- a/cgi-bin/guest_book.cgi +++ b/cgi-bin/guest_book.cgi @@ -3,6 +3,8 @@  !#  (use-modules (ice-9 exceptions)) +(use-modules (srfi srfi-19)) +(use-modules (sxml simple))  (use-modules (json))  (define guest-book-json-file "cgi-bin/guest_book.json") @@ -12,6 +14,7 @@             (string->number (string-append "#x"                                            hex))))) +;; Handle query string encoding  (define (format-query-string item)    (letrec ((decode-query              (lambda (value) @@ -38,16 +41,76 @@  ;; Progress form data  (define (get-form)    (let ((query (getenv "QUERY_STRING"))) -    (cond ((= (string-length query) 0) #f) +    (cond ((string= query "") #f)            (else             (map (lambda (item)                    (let ((pairs (string-split item #\=)))                      (set-cdr! pairs (format-query-string (cadr pairs)))                      pairs))                  (string-split query #\&)))))) -            + +(define (sanitize-input value) +  (let ((output (open-output-string)) +        (sanitized "")) +    (sxml->xml `(*TOP* ,value) output) +    (set! sanitized (get-output-string output)) +    (close-output-port output) +    sanitized)) + +(define (write-guest-to-json name url message) +  (let ((guest-book '()) +        (guest `(("name" . ,name) +                 ("url" . ,url) +                 ("message" . ,message) +                 ("date" . ,(date->string (current-date) "~B, ~d ~Y"))))) +    (if (file-exists? guest-book-json-file) +        (call-with-input-file guest-book-json-file +          (lambda (fp) +            (set! guest-book (vector->list (json->scm fp))) +            ;; Handle order thingy +            (set! guest-book (map (lambda (item) +                                    (reverse item)) +                                  guest-book))))) + +    ;; Guest already added. +    (letrec ((check-if-already-added +              (lambda (guests) +                (unless (eq? guests '()) +                  (unless (letrec ((guest-item-compare +                                    (lambda (index) +                                      (if (< index (- (length guest) 1)) +                                          (and (cdr (list-ref (car guests) +                                                              index)) +                                               (cdr (list-ref guest index)) +                                               (guest-item-compare +                                                (+ index 1))) ;; Unholyness +                                            +                  (check-if-already-added (cdr guests)))))) +      (check-if-already-added guest-book)) + +    ;; Add guest to guest-book +    (cond ((eq? guest-book '()) +           (set! guest-book (list guest))) +          (else +           (append! guest-book (list guest)))) + +    ;; Write guest book to json +    (call-with-output-file guest-book-json-file +      (lambda (fp) +        (scm->json (list->vector guest-book) fp))))) +  (define (handle-fields) -  (display (get-form))) +  (let ((form (get-form))) +    (if form +        (let ((name (sanitize-input (cdr (list-ref form 0)))) +              (url (sanitize-input (cdr (list-ref form 1)))) +              (message (sanitize-input (cdr (list-ref form 2))))) +          (cond ((string= name "") ;; No name given +                 (display "<p>name is required</p>")) +                ((string= message "") ;; No message given +                 (display "<p>please write a silly something (:</p>")) +                (else +                 (write-guest-to-json name url message)))))))  ;; Display a guest in the guest book  (define (display-guest guest) @@ -133,9 +196,9 @@ table {\n\                     (guest-loop                      (lambda (index)                        (display-guest (vector-ref guest-book index)) -                      (if (< index (- (vector-length guest-book) 1)) -                          (guest-loop (+ index 1)))))) -            (guest-loop 0))))) +                      (if (> index 0) +                          (guest-loop (- index 1)))))) +            (guest-loop (- (vector-length guest-book) 1))))))      #:unwind? #t)    (display "  </center>\n\  | 
