paste/main.lisp~
2025-03-29 22:43:00 +03:00

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*))