72 lines
2.0 KiB
Common Lisp
72 lines
2.0 KiB
Common Lisp
|
|
(ql:quickload "hunchentoot")
|
|
(ql:quickload "easy-routes")
|
|
(ql:quickload "djula")
|
|
|
|
(setf *default-pathname-defaults* (uiop:getcwd))
|
|
|
|
;;;; if you're gonna run a public instance, change to the url other people
|
|
;;;; will use to connect!
|
|
(defvar *server-external-address* "http://localhost:8080/")
|
|
(defvar *server* nil)
|
|
|
|
;; we probably don't actually need a template for the root,
|
|
;; it's more or less static anyhow.
|
|
;; i guess retrieving a paste is the only place that actually needs
|
|
;; the dynamic templating thingy
|
|
|
|
(defparameter *root-template*
|
|
(uiop:read-file-string "root.html"))
|
|
|
|
(defparameter *paste-template*
|
|
(uiop:read-file-string "paste.html"))
|
|
|
|
;; google code
|
|
;; holy hell, actual business logic
|
|
|
|
(defun get-paste-contents (id)
|
|
"read file lmao. also do some checks. we don't want LFI"
|
|
(let ((path (probe-file (concatenate 'string "bin/" id))))
|
|
(if (and path
|
|
(not (search "." id))
|
|
(not (search "/" id)))
|
|
(uiop:read-file-string path)
|
|
"err: bin not found")))
|
|
|
|
|
|
|
|
(defun render-root ()
|
|
(djula:render-template*
|
|
(djula:compile-string *root-template*)
|
|
nil))
|
|
(defun render-paste (id)
|
|
(djula:render-template*
|
|
(djula:compile-string *paste-template*)
|
|
nil
|
|
:contents (get-paste-contents id)
|
|
:link-home *server-external-address*
|
|
:link-bin (concatenate 'string *server-external-address* "bin/" id)
|
|
:link-raw (concatenate 'string *server-external-address* "raw/" id)))
|
|
|
|
(easy-routes:defroute root ("/" :method :get) ()
|
|
(render-root))
|
|
|
|
(easy-routes:defroute paste ("/bin/:n") ()
|
|
(render-paste n))
|
|
|
|
(easy-routes:defroute raw ("/raw/:n") ()
|
|
(get-paste-contents n))
|
|
|
|
;; todo: handle new pastes TODO: doesn't work, fix.
|
|
(easy-routes:defroute new ("/" :method :post) (content)
|
|
(format t "got somethin: ~a ~%" content))
|
|
|
|
|
|
(defun start-server (&key (port 8080))
|
|
(format t "Starting server on port ~a~%" port)
|
|
(force-output)
|
|
(setf *server* (make-instance 'easy-routes:easy-routes-acceptor :port port))
|
|
(hunchentoot:start *server*))
|
|
(defun stop-server ()
|
|
(hunchentoot:stop *server*))
|