summaryrefslogtreecommitdiff
path: root/webapps/webapp-loader.lisp
diff options
context:
space:
mode:
authorckonstanski <carlos.konstanski@olo.com>2021-11-27 10:20:12 -0700
committerckonstanski <carlos.konstanski@olo.com>2021-11-27 10:20:12 -0700
commit31657f6854edc116946a099be889440fb3e92e53 (patch)
treebe32747cfaf2f19f59857349438d62fb4a4a25b6 /webapps/webapp-loader.lisp
parent41ca4dcf8a18a76c48734a5fca4c56afb735a66e (diff)
moved everything under lisp/
Diffstat (limited to 'webapps/webapp-loader.lisp')
-rw-r--r--webapps/webapp-loader.lisp157
1 files changed, 0 insertions, 157 deletions
diff --git a/webapps/webapp-loader.lisp b/webapps/webapp-loader.lisp
deleted file mode 100644
index 555d493..0000000
--- a/webapps/webapp-loader.lisp
+++ /dev/null
@@ -1,157 +0,0 @@
-;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
-(declaim (optimize (speed 0) (safety 3) (debug 3)))
-
-(in-package :ldapadmin)
-
-(defvar *acceptor* nil)
-(defvar *dispatch-table* '(#'dispatch-easy-handlers #'default-dispatcher))
-(defvar *webapps* (make-hash-table :test 'equal))
-(defvar *webapp* nil)
-(defparameter *port* 3006)
-(defparameter *session-timeout* 14400)
-(defparameter *server-root* (namestring (asdf:system-relative-pathname (intern (package-name #.*package*)) "./"))
- "The location of the web server root on the filesystem.")
-
-(defclass webapp ()
- ((name :initarg :name
- :initform nil
- :accessor name
- :documentation "The name of the webapp as used in the code. A
-string used as the key to any webapp config lookup.")
- (url :initarg :url
- :initform nil
- :accessor url
- :documentation "The domain portion of the URL to the
-root of the webapp.")
- (document-root :initarg :document-root
- :initform nil
- :accessor document-root
- :documentation "The absolute filesystem path to
-the webapp's top-level directory, which is inside the webapps
-folder.")
- (title :initarg :title
- :initform nil
- :accessor title
- :documentation "The default title that shows up in
-the browser title bar.")
- (meta-description :initarg :meta-description
- :initform nil
- :accessor meta-description
- :documentation "The text that goes into the META DESCRIPTION
-tag, and anywhere else we want to put this text so that it will show
-up in Google.")
- (ldap :initarg :ldap
- :initform nil
- :accessor ldap))
- (:documentation ""))
-
-(defgeneric get-site-file-path (webapp)
- (:documentation "Builds a full filesystem path to a webapp's site
-file."))
-
-(defmethod get-site-file-path ((webapp webapp))
- (format nil "~a/site" (document-root webapp)))
-
-(defgeneric get-pages-file-paths (webapp)
- (:documentation ""))
-
-(defmethod get-pages-file-paths ((webapp webapp))
- (mapcar (lambda (pages-file)
- (ppcre:regex-replace-all "\\.lisp$" (format nil "~a" pages-file) ""))
- (remove-if (lambda (x) (equal x "shared"))
- (org-ckons-core::shell-wrapper (format nil "find '~a' -maxdepth 1 -type f -iname 'pages*.lisp' |sort" (document-root webapp))))))
-
-(defun make-server-path (relative-path)
- "Makes a relative filesystem path into a full one, using
-`*server-root*' as the base."
- (make-document-root-path *server-root* relative-path))
-
-(defun make-document-root-path (document-root relative-path)
- "Makes a relative filesystem path into a full one, using
-`document-root' as the base."
- (concatenate 'string document-root relative-path))
-
-(defun make-webapp-path (relative-path)
- "Makes an absolute filesystem path to a location in the webapps
-folder."
- (concatenate 'string *server-root* "webapps/" relative-path))
-
-(defun get-options-files ()
- (mapcar (lambda (webapp-directory)
- (format nil "~a/conf/options.lisp" webapp-directory))
- (remove-if (lambda (x) (or (org-ckons-core::match-it "webapps/$" x)
- (org-ckons-core::match-it "webapps/shared$" x)
- (org-ckons-core::match-it "webapps/CVS$" x)
- (org-ckons-core::match-it "webapps/\\.$" x)
- (org-ckons-core::match-it "webapps/\\.\\.$" x)))
- (org-ckons-core::shell-wrapper (format nil "find '~a' -maxdepth 1 -type d |sort" (make-webapp-path ""))))))
-
-(defun set-webapp (webapp)
- "Sets a `webapp' object in `*webapps*'. The lookup key is the
-webapp name. If a webapp already exists under this key, it gets
-overwritten with the new one."
- (setf (gethash (name webapp) *webapps*) webapp))
-
-(defun get-webapp (key)
- "Gets the webapp object."
- (gethash key *webapps*))
-
-(defun generate-sessionid ()
- "Generates a unique random string to seed the
-`*session-secret*'. The string is a SHA256 hash."
- (let ((entropic-value (make-array '(32) :element-type '(unsigned-byte 8))))
- (with-open-file (urandom-file "/dev/urandom" :direction :input :element-type '(unsigned-byte 8))
- (loop for i from 0 to 31 do
- (setf (elt entropic-value i) (read-byte urandom-file))))
- (let ((digest (ironclad:make-digest 'ironclad:sha256)))
- (ironclad:update-digest digest entropic-value)
- (ironclad:byte-array-to-hex-string (ironclad:produce-digest digest)))))
-
-(defun populate-webapps ()
- (loop for options-file in (get-options-files) do
- (with-open-file (input options-file :direction :input)
- (let* ((form (car (read input))))
- (set-webapp (make-instance 'webapp
- :name (getf form :name)
- :url (getf form :url)
- :document-root (make-webapp-path (getf form :document-root))
- :title (getf form :title)
- :meta-description (getf form :meta-description)
- :ldap (getf form :ldap)))))))
-
-(defun ldapadmin ()
- "Call this to start the server."
- (when (null *acceptor*)
- (let ((package (string-downcase (package-name *package*))))
- (populate-webapps)
- (setf (log-manager) (make-instance 'log-manager :message-class 'formatted-message))
- (start-messenger 'text-file-messenger :filename (format nil "/var/log/lisp/~a.log" package))
- (setf *session-secret* (generate-sessionid))
- (populate-webapps)
- (setf *acceptor* (start (make-instance 'easy-acceptor
- :port *port*
- :document-root (make-server-path (format nil "webapps/~a/" package))
- :name (format nil "~a-acceptor" package)))))))
-
-(defmacro with-request-wrapper (uri page-function)
- ;; Assigning package outside the backquote is necessary because
- ;; *package* resolves incorrectly to common-lisp-user inside the
- ;; backquote.
- (let ((package (string-downcase (package-name *package*))))
- `(let ((*webapp* (get-webapp ,package)))
- (org-ckons-core::logger (format nil "Page request URI: [~a]" ,uri))
- (unless *session*
- (start-session)
- (setf (session-max-time *session*) *session-timeout*)
- (setf (session-value :permissions) "anonymous"))
- (,page-function))))
-
-(defmacro define-endpoint (request-type uri var-list page-function)
- "Does the grunt work of creating an `easy-handler' for each page you
-wish to publish."
- (let ((name (gensym)))
- `(progn
- (org-ckons-core::logger (format nil "Publishing page. URL = [~a]" ,uri))
- (define-easy-handler (,name :uri ,uri :default-request-type ,request-type)
- ,var-list
- (with-request-wrapper ,uri ,page-function)))))