diff options
-rwxr-xr-x | cgi-bin/guest_book.cgi | 285 | ||||
-rwxr-xr-x | cgi-bin/guest_book.py | 164 | ||||
-rwxr-xr-x | cgi-bin/guest_book_scm.cgi | 104 |
3 files changed, 286 insertions, 267 deletions
diff --git a/cgi-bin/guest_book.cgi b/cgi-bin/guest_book.cgi index 97a7403..b2baf4f 100755 --- a/cgi-bin/guest_book.cgi +++ b/cgi-bin/guest_book.cgi @@ -1,164 +1,123 @@ -#! /usr/bin/env python3 - -import cgi -import json -import datetime -import html - -def handle_fields(): - form = cgi.FieldStorage() - - name = form.getvalue("name") - url = form.getvalue("url") - message = form.getvalue("message") - - # Nothign was submitted. - if name is None and url is None and message is None: - return "" - - if name is None: - return "<p>name is required</p>" - elif message is None: - return "<p>please write a silly something (:</p>" - - url = "" if url is None else url - - # Make the names safe. - name = html.escape(name) - url = html.escape(url) - message = html.escape(message) - - guest_book = [] - - # Open data if already there. - try: - with open("guest_book.json", "r") as fp: - guest_book = json.load(fp) - except FileNotFoundError: - pass - - # Already in list. - for guest in guest_book: - if guest["name"] == name and guest["url"] == url and guest["message"] == message: - return "<p>You already been added</p>" - - date = datetime.datetime.now() - guest_entry = {"name": name, "url": url, "message": message, "date": date.strftime("%B, %d %Y")} - - # Dump guest to file. - with open("guest_book.json", "w") as fp: - guest_book.append(guest_entry) - json.dump(guest_book, fp, indent=4) - - return "<p>You been added to the guest book yippe (:</p><img src=\"../images/yippee.gif\" alt=\"yippee!\"/>" - -def get_guest_html_from_list(): - guest_html = "" - - try: - with open("guest_book.json", "r") as fp: - for guest in json.load(fp)[::-1]: - guest_table = """ - <table border="1" width="60%"> - <tr> - <td> - <b>{name}</b> <a href="{url}" target="_blank">{url}</a> --- signed {date} - </td> - </tr> - - <tr> - <td><p>{message}</p></td> - </tr> - </table> - """ - - guest_table = guest_table.format(name=guest["name"], url=guest["url"], - date=guest["date"], message=guest["message"]) - guest_html += guest_table - except FileNotFoundError: - guest_html = """ - <table border="1" width="60%"> - <tr> - <td> - <p>No guest have been added ): But you can be the first!</p> - </td> - </tr> - </table> - """ - - return guest_html - -def display_html(fields_reponse): - print("Content-Type: text/html") - - html_text = """ - <!DOCTYPE html> - <html> - - <head> - <title>Guest Book</title> - - <style> - - body {{ - color: black; - background-image: url('../images/guest_book_background.png'); - }} - - table {{ - color: black; - background-color: #bebebe; - margin-top: 10px; - margin-bottom: 10px; - margin-left: 10px; - margin-right: 10px; - }} - - </style> - </head> - - <body> - <a href="../index.html"><img src="../images/back_home.png" alt="Back to home page"/></a> - - <center> - <table border="1" width="60%"> - <tr> - <td> - <h3>Sign my fucking guest book</h3> - <form action = "guest_book.cgi" method = "get"> - <lable for = "name" maxlength="100">Name</lable> - <input type = "text" name = "name"/> - <br/> - <lable for = "url" maxlength="256">Website (Optional)</lable> - <input type = "text" name = "url"/> - <br/><br/> - <lable for = "message">Write a little silly something</lable> - <br/> - <textarea type = "text" name = "message" rows = "4" cols = "40" maxlength="512"></textarea> - <br/> - <input type = "submit" value = "Fucking submit"> <b>You can't delete/edit it afterwards</b> - </form> - <p> - <b>Be nice! Dont be a fucking ass.</b> - </p> - {fields_reponse} - </td> - </tr> - </table> - - {guest_html} - </center> - </body> - </html> - """ - - html_text = html_text.format( - fields_reponse=fields_reponse, - guest_html=get_guest_html_from_list() - ) - - print(html_text) - -fields_reponse = handle_fields() -display_html(fields_reponse) +#! /usr/bin/guile \ +-e main -s +!# + +(use-modules (ice-9 exceptions)) +(use-modules (json)) + +(define guest-book-json-file "cgi-bin/guest_book.json") + +;; Progress form data +(define (get-form) + (let ((query (getenv "QUERY_STRING")) + (form '())) + (cond ((= (string-length query) 0) #f) + (else + (set! form (string-split query #\&)) + (for-each + (lambda (item) + (set! item (string-split item #\=))) + form) + form)))) + +(define (handle-fields) + (let ((form (get-form))) + (if form + (display form)))) + +;; Display a guest in the guest book +(define (display-guest guest) + (let ((date (cdr (list-ref guest 0))) + (message (cdr (list-ref guest 1))) + (url (cdr (list-ref guest 2))) + (name (cdr (list-ref guest 3)))) + (format #t " <table border=\"1\" width=\"60%\">\n\ + <tr><td>\n\ + <b>~a</b> <a href=\"~a\" target=\"_blank\">~a</a> --- signed ~a\n\ + </td></tr>\n\ + <tr><td>\n\ + <p>~a</p>\n\ + </table>\n\n" name url url date message))) + +;; Display pretty much everything +(define (display-guest-book) + (display "Content-Type: text/html\n\n\ +<!DOCTYPE html>\n\ +<html>\n\ +<head>\n\ + <title>Guest Book</title>\n\ + <style>\n\ +body {\n\ + color: black;\n\ + background-image: url('../images/guest_book_background.png');\n\ +}\n\ +\n\ +table {\n\ + color: black;\n\ + background-color: #bebebe;\n\ + margin-top: 10px;\n\ + margin-bottom: 10px;\n\ + margin-left: 10px;\n\ + margin-right: 10px;\n\ +}\n\ +</style>\n\ +</head>\n\ +<body>\n\ + <a href=\"../index.html\"><img src=\"../images/back_home.png\"\n\ + alt=\"Back to home page\"/></a>\n\ + <center>\n\ + <table border=\"1\" width=\"60%\">\n\ + <tr>\n\ + <td>\n\ + <h3>Sign my fucking guest book</h3>\n\ + <form action = \"guest_book.cgi\" method = \"get\">\n\ + <lable for = \"name\" maxlength=\"100\">Name</lable>\n\ + <input type = \"text\" name = \"name\"/>\n\ + <br/>\n\ + <lable for = \"url\" maxlength=\"256\">Website (Optional)\n\ + </lable>\n\ + <input type = \"text\" name = \"url\"/>\n\ + <br/><br/>\n\ + <lable for = \"message\">Write a little silly something</lable>\n\ + <br/>\n\ + <textarea type = \"text\" name = \"message\" rows = \"4\"\n\ + cols = \"40\" maxlength=\"512\"></textarea>\n\ + <br/>\n\ + <input type = \"submit\" value = \"Fucking submit\">\n\ + <b>You can't delete/edit it afterwards</b>\n\ + </form>\n\ + <p>\n\ + <b>Be nice! Dont be a fucking ass.</b>\n\ + </p>\n") + (handle-fields) + (display " </td>\n\ + </tr>\n\ + </table>\n\n") + + ;; Try to read the guest book json + (with-exception-handler + (lambda (error) + (display " <table border=\"1\" width=\"60%\">\n\ + <tr><td>\n\ + <p>No guest have been added ): But you can be the first!</p>\n\ + </td></tr>\n\ + </table>\n")) + (lambda () + (call-with-input-file guest-book-json-file + (lambda (fp) + (letrec ((guest-book (json->scm fp)) + (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))))) + #:unwind? #t) + + (display " </center>\n\ +</body>\n\ +</html>\n")) + +(define (main args) + (display-guest-book)) diff --git a/cgi-bin/guest_book.py b/cgi-bin/guest_book.py new file mode 100755 index 0000000..97a7403 --- /dev/null +++ b/cgi-bin/guest_book.py @@ -0,0 +1,164 @@ +#! /usr/bin/env python3 + +import cgi +import json +import datetime +import html + +def handle_fields(): + form = cgi.FieldStorage() + + name = form.getvalue("name") + url = form.getvalue("url") + message = form.getvalue("message") + + # Nothign was submitted. + if name is None and url is None and message is None: + return "" + + if name is None: + return "<p>name is required</p>" + elif message is None: + return "<p>please write a silly something (:</p>" + + url = "" if url is None else url + + # Make the names safe. + name = html.escape(name) + url = html.escape(url) + message = html.escape(message) + + guest_book = [] + + # Open data if already there. + try: + with open("guest_book.json", "r") as fp: + guest_book = json.load(fp) + except FileNotFoundError: + pass + + # Already in list. + for guest in guest_book: + if guest["name"] == name and guest["url"] == url and guest["message"] == message: + return "<p>You already been added</p>" + + date = datetime.datetime.now() + guest_entry = {"name": name, "url": url, "message": message, "date": date.strftime("%B, %d %Y")} + + # Dump guest to file. + with open("guest_book.json", "w") as fp: + guest_book.append(guest_entry) + json.dump(guest_book, fp, indent=4) + + return "<p>You been added to the guest book yippe (:</p><img src=\"../images/yippee.gif\" alt=\"yippee!\"/>" + +def get_guest_html_from_list(): + guest_html = "" + + try: + with open("guest_book.json", "r") as fp: + for guest in json.load(fp)[::-1]: + guest_table = """ + <table border="1" width="60%"> + <tr> + <td> + <b>{name}</b> <a href="{url}" target="_blank">{url}</a> --- signed {date} + </td> + </tr> + + <tr> + <td><p>{message}</p></td> + </tr> + </table> + """ + + guest_table = guest_table.format(name=guest["name"], url=guest["url"], + date=guest["date"], message=guest["message"]) + guest_html += guest_table + except FileNotFoundError: + guest_html = """ + <table border="1" width="60%"> + <tr> + <td> + <p>No guest have been added ): But you can be the first!</p> + </td> + </tr> + </table> + """ + + return guest_html + +def display_html(fields_reponse): + print("Content-Type: text/html") + + html_text = """ + <!DOCTYPE html> + <html> + + <head> + <title>Guest Book</title> + + <style> + + body {{ + color: black; + background-image: url('../images/guest_book_background.png'); + }} + + table {{ + color: black; + background-color: #bebebe; + margin-top: 10px; + margin-bottom: 10px; + margin-left: 10px; + margin-right: 10px; + }} + + </style> + </head> + + <body> + <a href="../index.html"><img src="../images/back_home.png" alt="Back to home page"/></a> + + <center> + <table border="1" width="60%"> + <tr> + <td> + <h3>Sign my fucking guest book</h3> + <form action = "guest_book.cgi" method = "get"> + <lable for = "name" maxlength="100">Name</lable> + <input type = "text" name = "name"/> + <br/> + <lable for = "url" maxlength="256">Website (Optional)</lable> + <input type = "text" name = "url"/> + <br/><br/> + <lable for = "message">Write a little silly something</lable> + <br/> + <textarea type = "text" name = "message" rows = "4" cols = "40" maxlength="512"></textarea> + <br/> + <input type = "submit" value = "Fucking submit"> <b>You can't delete/edit it afterwards</b> + </form> + <p> + <b>Be nice! Dont be a fucking ass.</b> + </p> + {fields_reponse} + </td> + </tr> + </table> + + {guest_html} + </center> + </body> + </html> + """ + + html_text = html_text.format( + fields_reponse=fields_reponse, + guest_html=get_guest_html_from_list() + ) + + print(html_text) + +fields_reponse = handle_fields() +display_html(fields_reponse) + diff --git a/cgi-bin/guest_book_scm.cgi b/cgi-bin/guest_book_scm.cgi deleted file mode 100755 index 3963b25..0000000 --- a/cgi-bin/guest_book_scm.cgi +++ /dev/null @@ -1,104 +0,0 @@ -#! /usr/bin/guile \ --e main -s -!# - -(use-modules (ice-9 exceptions)) -(use-modules (json)) - -(define guest-book-json-file "cgi-bin/guest_book.json") - -;; Display a guest in the guest book -(define (display-guest guest) - (let ((date (cdr (list-ref guest 0))) - (message (cdr (list-ref guest 1))) - (url (cdr (list-ref guest 2))) - (name (cdr (list-ref guest 3)))) - (format #t " <table border=\"1\" width=\"60%\">\n\ - <tr><td>\n\ - <b>~a</b> <a href=\"~a\" target=\"_blank\">~a</a> --- signed ~a\n\ - </td></tr>\n\ - <tr><td>\n\ - <p>~a</p>\n\ - </table>\n\n" name url url date message))) - -;; Display pretty much everything -(define (display-guest-book) - (display "Content-Type: text/html\n\n\ -<!DOCTYPE html>\n\ -<html>\n\ -<head>\n\ - <title>Guest Book</title>\n\ - <style>\n\ -body {\n\ - color: black;\n\ - background-image: url('../images/guest_book_background.png');\n\ -}\n\ -\n\ -table {\n\ - color: black;\n\ - background-color: #bebebe;\n\ - margin-top: 10px;\n\ - margin-bottom: 10px;\n\ - margin-left: 10px;\n\ - margin-right: 10px;\n\ -}\n\ -</style>\n\ -</head>\n\ -<body>\n\ - <a href=\"../index.html\"><img src=\"../images/back_home.png\"\n\ - alt=\"Back to home page\"/></a>\n\ - <center>\n\ - <table border=\"1\" width=\"60%\">\n\ - <tr>\n\ - <td>\n\ - <h3>Sign my fucking guest book</h3>\n\ - <form action = \"guest_book.cgi\" method = \"get\">\n\ - <lable for = \"name\" maxlength=\"100\">Name</lable>\n\ - <input type = \"text\" name = \"name\"/>\n\ - <br/>\n\ - <lable for = \"url\" maxlength=\"256\">Website (Optional)\n\ - </lable>\n\ - <input type = \"text\" name = \"url\"/>\n\ - <br/><br/>\n\ - <lable for = \"message\">Write a little silly something</lable>\n\ - <br/>\n\ - <textarea type = \"text\" name = \"message\" rows = \"4\"\n\ - cols = \"40\" maxlength=\"512\"></textarea>\n\ - <br/>\n\ - <input type = \"submit\" value = \"Fucking submit\">\n\ - <b>You can't delete/edit it afterwards</b>\n\ - </form>\n\ - <p>\n\ - <b>Be nice! Dont be a fucking ass.</b>\n\ - </p>\n\ - </td>\n\ - </tr>\n\ - </table>\n\n") - - ;; Try to read the guest book json - (with-exception-handler - (lambda (error) - (display " <table border=\"1\" width=\"60%\">\n\ - <tr><td>\n\ - <p>No guest have been added ): But you can be the first!</p>\n\ - </td></tr>\n\ - </table>\n")) - (lambda () - (call-with-input-file guest-book-json-file - (lambda (fp) - (letrec ((guest-book (json->scm fp)) - (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))))) - #:unwind? #t) - - (display " </center>\n\ -</body>\n\ -</html>\n")) - -(define (main args) - (display-guest-book)) - |