mirror of
https://github.com/journeyman-cc/smeagol.git
synced 2026-04-12 18:05:06 +00:00
Extensive linting whilst trying to resolve Tomcat config issue.
This commit is contained in:
parent
f4b28b344d
commit
f46af642a4
24 changed files with 188 additions and 179 deletions
|
|
@ -2,7 +2,6 @@
|
|||
:author "Simon Brooke"}
|
||||
smeagol.authenticate
|
||||
(:require [crypto.password.scrypt :as password]
|
||||
[environ.core :refer [env]]
|
||||
[noir.io :as io]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
|
@ -65,7 +64,7 @@
|
|||
(defn get-email
|
||||
"Return the email address associated with this `username`."
|
||||
[username]
|
||||
(if username
|
||||
(when username
|
||||
(let [user ((keyword username) (get-users))]
|
||||
(:email user))))
|
||||
|
||||
|
|
@ -73,7 +72,7 @@
|
|||
(defn get-admin
|
||||
"Return a flag indicating whether the user with this username is an administrator."
|
||||
[username]
|
||||
(if username
|
||||
(when username
|
||||
(let [user ((keyword username) (get-users))]
|
||||
(:admin user))))
|
||||
|
||||
|
|
@ -84,7 +83,7 @@
|
|||
(cond
|
||||
(< (count pass1) 8) :chpass-too-short
|
||||
(.equals pass1 pass2) true
|
||||
true :chpass-bad-match))
|
||||
:else :chpass-bad-match))
|
||||
([password]
|
||||
(evaluate-password password password)))
|
||||
|
||||
|
|
@ -97,8 +96,7 @@
|
|||
(log/info (format "Changing password for user %s" username))
|
||||
(let [users (get-users)
|
||||
keywd (keyword username)
|
||||
user (keywd users)
|
||||
email (:email user)]
|
||||
user (keywd users)]
|
||||
(try
|
||||
(cond
|
||||
(and user
|
||||
|
|
@ -130,7 +128,7 @@
|
|||
(defn fetch-user-details
|
||||
"Return the map of features of this user, if any."
|
||||
[username]
|
||||
(if
|
||||
(when
|
||||
(and username (pos? (count (str username))))
|
||||
((keyword username) (get-users))))
|
||||
|
||||
|
|
@ -144,9 +142,9 @@
|
|||
(cond
|
||||
(not (string? username)) (throw (Exception. "Username must be a string."))
|
||||
(zero? (count username)) (throw (Exception. "Username cannot be zero length"))
|
||||
true (let [users (get-users)
|
||||
:else (let [users (get-users)
|
||||
user ((keyword username) users)
|
||||
password (if
|
||||
password (when
|
||||
(and newpass (evaluate-password newpass))
|
||||
(password/encrypt newpass))
|
||||
details {:email email
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
[clojure.string :as s]
|
||||
[environ.core :refer [env]]
|
||||
[noir.io :as io]
|
||||
[taoensso.timbre :as log]))
|
||||
[taoensso.timbre :as log])
|
||||
(:import (javax.naming InitialContext )))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
@ -30,12 +31,9 @@
|
|||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; Right, doing the data visualisation thing is tricky. Doing it in the
|
||||
;;;; pipeline doesn't work, because the md-to-html-string filter messes up
|
||||
;;;; both YAML and JSON notation. So we need to extract the visualisation
|
||||
;;;; fragments from the Markdown text and replace them with tokens we will
|
||||
;;;; recognise afterwards, perform md-to-html-string, and then replace our
|
||||
;;;; tokens with the transformed visualisation specification.
|
||||
;;;; Configuration may have to be pulled from different places depending on the
|
||||
;;;; environment in which Smeagol runs. This handles that problem reasonably
|
||||
;;;; seamlessly.
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
|
@ -47,13 +45,44 @@
|
|||
|
||||
|
||||
(defn- from-env-vars
|
||||
"Read a map from those of these environment variables which have values"
|
||||
[& vars]
|
||||
"Read a map from those of these environment `vars` which have values"
|
||||
[vars]
|
||||
(reduce
|
||||
#(let [v (env %2)]
|
||||
(if v (assoc %1 %2 v) %1))
|
||||
{}
|
||||
vars))
|
||||
#(let [v (env %2)]
|
||||
(if v
|
||||
(do
|
||||
(log/info (str "Read value of " %2 " from shell environment as " v))
|
||||
(assoc %1 %2 v)) %1))
|
||||
{}
|
||||
vars))
|
||||
|
||||
(defn- from-initial-context
|
||||
"Config `vars` are read from the initial context, which (at least under Tomcat)
|
||||
are specific to the individual web app. Nevertheless the same names will
|
||||
be used as for environment variables, because it just makes life easier."
|
||||
[vars]
|
||||
(log/info "Seeking config in initial context")
|
||||
(try
|
||||
(reduce
|
||||
#(try
|
||||
(log/info "Seeking value for " %2 " in initial context")
|
||||
(let [v (javax.naming.InitialContext/doLookup %2)]
|
||||
(if v
|
||||
(do
|
||||
(log/info (str "Read value of " %2 " from initial context as " v))
|
||||
(assoc %1 %2 v))
|
||||
%1))
|
||||
(catch Exception e
|
||||
(log/warn (str "Error while seeking value for " %2 " in initial context: " (type e) "; " (.getMessage e)))
|
||||
%1))
|
||||
{}
|
||||
(map #(str "java:comp/env/" (name %)) vars))
|
||||
(catch javax.naming.NoInitialContextException _
|
||||
;; ignore: this only means we're not in a servlet context,
|
||||
;; e.g unit tests.
|
||||
)
|
||||
(catch Exception other
|
||||
(log/warn (str "Error while seeking values in initial context: " (type other) "; " (.getMessage other))))))
|
||||
|
||||
|
||||
(defn to-keyword
|
||||
|
|
@ -106,6 +135,19 @@
|
|||
{:from :smeagol-site-title :to :site-title}))
|
||||
|
||||
|
||||
(def config-var-names
|
||||
"Names of configuration variables which will be sought in the environment or
|
||||
initial context"
|
||||
'(:smeagol-config
|
||||
:smeagol-content-dir
|
||||
:smeagol-default-locale
|
||||
:smeagol-formatters
|
||||
:smeagol-js-from
|
||||
:smeagol-log-level
|
||||
:smeagol-passwd
|
||||
:smeagol-site-title))
|
||||
|
||||
|
||||
(def build-config
|
||||
"The actual configuration, as a map. The idea here is that the config
|
||||
file is read (if it is specified and present), but that individual
|
||||
|
|
@ -128,14 +170,10 @@
|
|||
config (merge
|
||||
file-contents
|
||||
(transform-map
|
||||
(from-env-vars
|
||||
:smeagol-content-dir
|
||||
:smeagol-default-locale
|
||||
:smeagol-formatters
|
||||
:smeagol-js-from
|
||||
:smeagol-log-level
|
||||
:smeagol-passwd
|
||||
:smeagol-site-title)
|
||||
(from-env-vars config-var-names)
|
||||
config-env-transforms)
|
||||
(transform-map
|
||||
(from-initial-context config-var-names)
|
||||
config-env-transforms))]
|
||||
(if (env :dev)
|
||||
(log/debug
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
(ns ^{:doc "Format a diff as HTML."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.diff2html
|
||||
(:require [clojure.string :refer [join split split-lines]]))
|
||||
(:require [clojure.string :refer [join split-lines]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
(starts-with? line "-") (str "<p><del>" (subs line 1) "</del></p>")
|
||||
(starts-with? line "@@") "</div><div class='change'>"
|
||||
(starts-with? line "\\") (str "<p class='warn'>" (subs line 1) "</p>")
|
||||
true (str "<p>" line "</p>")))
|
||||
:else (str "<p>" line "</p>")))
|
||||
|
||||
|
||||
(defn diff2html
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
:author "Simon Brooke"}
|
||||
smeagol.extensions.geocsv
|
||||
(:require [smeagol.configuration :refer [config]]
|
||||
[smeagol.extensions.utils :refer :all]
|
||||
[smeagol.extensions.utils :refer [resource-url-or-data->data]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
(ns ^{:doc "Mermaid formatter for Semagol's extendsible markdown format."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.extensions.mermaid
|
||||
(:require [smeagol.extensions.utils :refer :all]
|
||||
(:require [smeagol.extensions.utils :refer [resource-url-or-data->data]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
[me.raynes.fs :as fs]
|
||||
[noir.io :as io]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.extensions.utils :refer :all]
|
||||
[smeagol.extensions.utils :refer [resource-url-or-data->data uploaded?]]
|
||||
[smeagol.util :refer [content-dir upload-dir]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
|
|
@ -85,7 +85,7 @@
|
|||
(defn simplify
|
||||
"Simplify a parse-`tree` created by `simple-grammar`, q.v."
|
||||
[tree]
|
||||
(if
|
||||
(when
|
||||
(coll? tree)
|
||||
(case (first tree)
|
||||
:SLIDES (cons
|
||||
|
|
@ -106,7 +106,7 @@
|
|||
[slide]
|
||||
(let [url (:src slide)
|
||||
dimensions (try
|
||||
(if (uploaded? url)
|
||||
(when (uploaded? url)
|
||||
(dimensions
|
||||
(buffered-image
|
||||
(cio/file upload-dir (fs/base-name url)))))
|
||||
|
|
@ -122,7 +122,7 @@
|
|||
|
||||
(defn find-thumb
|
||||
[url thumbsize]
|
||||
(if
|
||||
(when
|
||||
(and
|
||||
(uploaded? url)
|
||||
thumbsize)
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@
|
|||
(def process-test-return-value "<!-- The test extension has run and this is its output -->")
|
||||
|
||||
(defn process-test
|
||||
[^String fragment ^Integer index]
|
||||
[^String _ ^Integer _]
|
||||
process-test-return-value)
|
||||
|
|
|
|||
|
|
@ -1,16 +1,15 @@
|
|||
(ns ^{:doc "Utility functions useful to extension processors."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.extensions.utils
|
||||
(:require [cemerick.url :refer (url url-encode url-decode)]
|
||||
(:require [cemerick.url :refer (url)]
|
||||
[clj-yaml.core :as yaml]
|
||||
[clojure.data.json :as json]
|
||||
[clojure.java.io :as cjio]
|
||||
[clojure.string :as cs]
|
||||
[me.raynes.fs :as fs]
|
||||
[noir.io :as io]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[taoensso.timbre :as log]
|
||||
[smeagol.util :refer [content-dir upload-dir]]))
|
||||
[smeagol.util :refer [upload-dir]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
(ns ^{:doc "Format vega/vis extensions to Semagol's extended markdown format."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.extensions.vega
|
||||
(:require [smeagol.extensions.utils :refer :all]
|
||||
(:require [smeagol.extensions.utils :refer [resource-url-or-data->data yaml->json]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
|||
|
|
@ -4,11 +4,9 @@
|
|||
smeagol.finder
|
||||
(:require [clojure.string :as cs]
|
||||
[me.raynes.fs :as fs]
|
||||
[noir.io :as io]
|
||||
[ring.util.mime-type :refer [ext-mime-type]]
|
||||
[ring.util.response :as response]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.util :refer [local-url-base content-dir upload-dir]]
|
||||
[smeagol.util :refer [local-url-base content-dir]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
|||
|
|
@ -1,17 +1,10 @@
|
|||
(ns ^{:doc "Format Semagol's extended markdown format."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.formatting
|
||||
(:require [clojure.data.json :as json]
|
||||
[clojure.string :as cs]
|
||||
[cemerick.url :refer (url url-encode url-decode)]
|
||||
[clj-yaml.core :as yaml]
|
||||
(:require [clojure.string :as cs]
|
||||
[markdown.core :as md]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.extensions.geocsv :refer [process-geocsv]]
|
||||
[smeagol.extensions.mermaid :refer [process-mermaid]]
|
||||
[smeagol.extensions.photoswipe :refer [process-photoswipe]]
|
||||
[smeagol.extensions.vega :refer [process-vega]]
|
||||
[smeagol.local-links :refer :all]
|
||||
[smeagol.local-links :refer [local-links]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
@ -55,7 +48,7 @@
|
|||
|
||||
**NOTE** that it is not expected that this function forms part of a stable
|
||||
API."
|
||||
[^String text ^Integer index]
|
||||
[^String text _]
|
||||
(str "<pre class=\"backticks\">```" (.trim text) "\n```</pre>"))
|
||||
|
||||
|
||||
|
|
@ -64,7 +57,7 @@
|
|||
or `nil` if there is none."
|
||||
[^String string]
|
||||
(try
|
||||
(if string (first (cs/split (first (cs/split-lines string)) #"[^a-zA-Z0-9]+")))
|
||||
(when string (first (cs/split (first (cs/split-lines string)) #"[^a-zA-Z0-9]+")))
|
||||
(catch NullPointerException _ nil)))
|
||||
|
||||
|
||||
|
|
@ -195,17 +188,16 @@
|
|||
;; I need to put the backticks back in.
|
||||
remarked (if (odd? index) (str "```" fragment "\n```") fragment)
|
||||
first-token (get-first-token fragment)
|
||||
kw (if-not (empty? first-token) (keyword first-token))
|
||||
formatter (if
|
||||
kw (when-not (empty? first-token) (keyword first-token))
|
||||
formatter (when
|
||||
kw
|
||||
(try
|
||||
(read-string (-> config :formatters kw :formatter))
|
||||
(catch Exception _
|
||||
(do
|
||||
(log/info "No formatter found for extension `" kw "`")
|
||||
(log/info "No formatter found for extension `" kw "`")
|
||||
;; no extension registered - there sometimes won't be,
|
||||
;; and it doesn't matter
|
||||
nil))))]
|
||||
nil)))]
|
||||
(cond
|
||||
(empty? fragments)
|
||||
;; We've come to the end of the list of fragments. Reassemble them into
|
||||
|
|
@ -213,7 +205,7 @@
|
|||
(reassemble-text result processed)
|
||||
formatter
|
||||
(apply-formatter index result fragments processed fragment first-token formatter)
|
||||
true
|
||||
:else
|
||||
(process-markdown-fragment index result remarked (rest fragments) processed))))
|
||||
|
||||
(defn md->html
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
(ns ^{:doc "Set up, configure, and clean up after the wiki server."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.handler
|
||||
(:require [clojure.java.io :as cjio]
|
||||
[clojure.string :refer [lower-case]]
|
||||
[compojure.core :refer [defroutes]]
|
||||
(:require [compojure.core :refer [defroutes]]
|
||||
[compojure.route :as route]
|
||||
[cronj.core :as cronj]
|
||||
[environ.core :refer [env]]
|
||||
|
|
@ -42,7 +40,7 @@
|
|||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defn user-access [request]
|
||||
(defn user-access [_]
|
||||
(session/get :user))
|
||||
|
||||
|
||||
|
|
@ -75,10 +73,10 @@
|
|||
:backlog 10})}
|
||||
:level (or
|
||||
(:log-level config)
|
||||
(if (env :dev) :debug)
|
||||
(when (env :dev) :debug)
|
||||
:info)})
|
||||
(cronj/start! session-manager/cleanup-job)
|
||||
(if (env :dev) (parser/cache-off!))
|
||||
(when (env :dev) (parser/cache-off!))
|
||||
;;start the expired session cleanup job
|
||||
(log/info "\n-=[ smeagol started successfully"
|
||||
(when (env :dev) "using the development profile") "]=-")
|
||||
|
|
|
|||
|
|
@ -6,11 +6,10 @@
|
|||
[clj-jgit.querying :as q]
|
||||
[taoensso.timbre :as log])
|
||||
(:import [org.eclipse.jgit.api Git]
|
||||
[org.eclipse.jgit.lib Repository ObjectId]
|
||||
[org.eclipse.jgit.revwalk RevCommit RevTree RevWalk]
|
||||
[org.eclipse.jgit.treewalk TreeWalk AbstractTreeIterator CanonicalTreeParser]
|
||||
[org.eclipse.jgit.lib ObjectId]
|
||||
[org.eclipse.jgit.treewalk TreeWalk CanonicalTreeParser]
|
||||
[org.eclipse.jgit.treewalk.filter PathFilter]
|
||||
[org.eclipse.jgit.diff DiffEntry DiffFormatter]))
|
||||
[org.eclipse.jgit.diff DiffFormatter]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
@ -53,7 +52,7 @@
|
|||
[^String git-directory-path]
|
||||
(try
|
||||
(git/load-repo git-directory-path)
|
||||
(catch java.io.FileNotFoundException fnf
|
||||
(catch java.io.FileNotFoundException _
|
||||
(log/info "Initialising Git repository at" git-directory-path)
|
||||
(git/git-init git-directory-path)
|
||||
(let [repo (git/load-repo git-directory-path)]
|
||||
|
|
@ -137,7 +136,7 @@
|
|||
(.addTree tw tree)
|
||||
(.setRecursive tw true)
|
||||
(.setFilter tw (PathFilter/create file-path))
|
||||
(if (not (.next tw))
|
||||
(when-not (.next tw)
|
||||
(throw (IllegalStateException.
|
||||
(str "Did not find expected file '" file-path "'"))))
|
||||
(.copyTo (.open repo (.getObjectId tw 0)) out)
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
(:require
|
||||
[clojure.string :as cs]
|
||||
[schema.core :as s]
|
||||
[com.stuartsierra.component :as component]
|
||||
[smeagol.include.parse :as parse]
|
||||
[smeagol.include.resolve :as resolve]
|
||||
[smeagol.include.indent :as indent]))
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ smeagol.include and not inteded for direct usage."
|
|||
:author "Michael Jerger"}
|
||||
smeagol.include.resolve
|
||||
(:require
|
||||
[schema.core :as s]
|
||||
[com.stuartsierra.component :as component]))
|
||||
[schema.core :as s]))
|
||||
|
||||
(s/defrecord Resolver
|
||||
[type :- s/Keyword
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ smeagol.include and not inteded for direct usage."
|
|||
(:require
|
||||
[schema.core :as s]
|
||||
[smeagol.include.resolve :as resolve]
|
||||
[com.stuartsierra.component :as component]
|
||||
[clojure.java.io :as cjio]
|
||||
[taoensso.timbre :as timbre]))
|
||||
|
||||
|
|
|
|||
|
|
@ -2,16 +2,13 @@
|
|||
(ns ^{:doc "Render a page as HTML."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.layout
|
||||
(:require [clojure.java.io :as cjio]
|
||||
[clojure.string :as s]
|
||||
(:require [clojure.string :as s]
|
||||
[compojure.response :refer [Renderable]]
|
||||
[environ.core :refer [env]]
|
||||
[hiccup.core :refer [html]]
|
||||
[ring.util.anti-forgery :refer [anti-forgery-field]]
|
||||
[ring.util.response :refer [content-type response]]
|
||||
[selmer.parser :as parser]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.sanity :refer :all]
|
||||
[smeagol.sanity :refer [show-sanity-check-error]]
|
||||
[smeagol.util :as util]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
@ -61,7 +58,7 @@
|
|||
;; be rendered.
|
||||
[template params]
|
||||
Renderable
|
||||
(render [this request]
|
||||
(render [_ request]
|
||||
(try
|
||||
(content-type
|
||||
(->> (assoc params
|
||||
|
|
@ -69,7 +66,7 @@
|
|||
:i18n (util/get-messages request)
|
||||
:dev (env :dev)
|
||||
:servlet-context
|
||||
(if-let [context (:servlet-context request)]
|
||||
(when-let [context (:servlet-context request)]
|
||||
;; If we're not inside a serlvet environment (for
|
||||
;; example when using mock requests), then
|
||||
;; .getContextPath might not exist
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
(ns ^{:doc "Format Semagol's local links."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.local-links
|
||||
(:require [clojure.data.json :as json]
|
||||
[clojure.string :as cs]
|
||||
[cemerick.url :refer (url url-encode url-decode)]))
|
||||
(:require [clojure.string :as cs]
|
||||
[cemerick.url :refer (url-encode)]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@
|
|||
|
||||
(def production-middleware
|
||||
[#(wrap-internal-error % :log (fn [e] (log/error e)))
|
||||
wrap-anti-forgery
|
||||
#(wrap-resource % "public")
|
||||
smeagol-wrap-content-type
|
||||
#(try
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
(ns ^{:doc "Functions to allow the wiki to be started and stopped from the REPL."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.repl
|
||||
(:use smeagol.handler
|
||||
ring.server.standalone
|
||||
[ring.middleware file-info file]))
|
||||
(:require
|
||||
[ring.middleware.file :refer [wrap-file]]
|
||||
[ring.middleware.file-info :refer [wrap-file-info]]
|
||||
[ring.server.standalone :refer [app serve]]
|
||||
[smeagol.handler :refer [destroy init]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
(ns ^{:doc "Render all the main pages of a very simple Wiki engine."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.routes.admin
|
||||
(:require [clojure.walk :refer :all]
|
||||
(:require [clojure.walk :refer [keywordize-keys]]
|
||||
[noir.session :as session]
|
||||
[taoensso.timbre :as timbre]
|
||||
[smeagol.authenticate :as auth]
|
||||
|
|
@ -35,12 +35,10 @@
|
|||
(defn edit-users
|
||||
"Render a page showing a list of users for editing."
|
||||
[request]
|
||||
(let [params (keywordize-keys (:params request))
|
||||
user (session/get :user)]
|
||||
(layout/render "edit-users.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (:edit-users-title (util/get-messages request))
|
||||
:users (auth/list-users)}))))
|
||||
(layout/render "edit-users.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (:edit-users-title (util/get-messages request))
|
||||
:users (auth/list-users)})))
|
||||
|
||||
(defn delete-user
|
||||
"Render a form allowing a user to be deleted; and
|
||||
|
|
@ -49,8 +47,8 @@
|
|||
(let [params (keywordize-keys (:params request))
|
||||
target (:target params)
|
||||
deleted (auth/delete-user target)
|
||||
message (if deleted (str (:del-user-success (util/get-messages request)) " " target "."))
|
||||
error (if (not deleted) (str (:del-user-fail (util/get-messages request)) " " target "."))]
|
||||
message (when deleted (str (:del-user-success (util/get-messages request)) " " target "."))
|
||||
error (when-not deleted (str (:del-user-fail (util/get-messages request)) " " target "."))]
|
||||
(layout/render "edit-users.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (:edit-users-title (util/get-messages request))
|
||||
|
|
@ -69,8 +67,8 @@
|
|||
pass1 (:pass1 params)
|
||||
pass2 (:pass2 params)
|
||||
check-pass (auth/evaluate-password pass1 pass2)
|
||||
password (if (and pass1 (true? check-pass)) pass1)
|
||||
stored (if
|
||||
password (when (and pass1 (true? check-pass)) pass1)
|
||||
stored (when
|
||||
(and
|
||||
(:email params)
|
||||
(or
|
||||
|
|
@ -78,18 +76,18 @@
|
|||
(zero? (count pass1))
|
||||
(true? check-pass)))
|
||||
(auth/add-user target password (:email params) (:admin params)))
|
||||
message (if stored (str (:save-user-success (util/get-messages request)) " " target "."))
|
||||
error (if
|
||||
message (when stored (str (:save-user-success (util/get-messages request)) " " target "."))
|
||||
error (when
|
||||
(and (:email params) (not stored))
|
||||
(str
|
||||
(:save-user-fail (util/get-messages request))
|
||||
" " target ". "
|
||||
(if (keyword? check-pass) (check-pass (util/get-messages request)))))
|
||||
(when (keyword? check-pass) (check-pass (util/get-messages request)))))
|
||||
page (if stored "edit-users.html" "edit-user.html")
|
||||
details (auth/fetch-user-details target)]
|
||||
(if message
|
||||
(when message
|
||||
(timbre/info message))
|
||||
(if error
|
||||
(when error
|
||||
(timbre/warn error))
|
||||
(layout/render page
|
||||
(merge (util/standard-params request)
|
||||
|
|
|
|||
|
|
@ -1,17 +1,16 @@
|
|||
(ns ^{:doc "Render all the main pages of a very simple Wiki engine."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.routes.wiki
|
||||
(:require [cemerick.url :refer (url url-encode url-decode)]
|
||||
(:require [cemerick.url :refer (url-encode url-decode)]
|
||||
[clj-jgit.porcelain :as git]
|
||||
[clojure.java.io :as cjio]
|
||||
[clojure.pprint :refer [pprint]]
|
||||
[clojure.string :as cs]
|
||||
[clojure.walk :refer :all]
|
||||
[compojure.core :refer :all]
|
||||
[clojure.walk :refer [keywordize-keys]]
|
||||
[compojure.core :refer [defroutes GET POST]]
|
||||
[java-time :as jt]
|
||||
[markdown.core :as md]
|
||||
[me.raynes.fs :as fs]
|
||||
[noir.io :as io]
|
||||
[noir.response :as response]
|
||||
[noir.util.route :as route]
|
||||
[noir.session :as session]
|
||||
|
|
@ -22,18 +21,17 @@
|
|||
[smeagol.formatting :refer [md->html]]
|
||||
[smeagol.history :as hist]
|
||||
[smeagol.layout :as layout]
|
||||
[smeagol.local-links :refer :all]
|
||||
[smeagol.local-links :refer [local-links]]
|
||||
[smeagol.routes.admin :as admin]
|
||||
[smeagol.sanity :refer [show-sanity-check-error]]
|
||||
[smeagol.util :as util]
|
||||
[smeagol.uploads :as ul]
|
||||
[taoensso.timbre :as log]
|
||||
[com.stuartsierra.component :as component]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.include.resolve-local-file :as resolve]
|
||||
[smeagol.include :as include]
|
||||
[smeagol.util :refer [content-dir get-servlet-context-path
|
||||
local-url local-url-base upload-dir]]))
|
||||
[smeagol.util :refer [content-dir get-message get-servlet-context-path
|
||||
local-url local-url-base standard-params
|
||||
start-page upload-dir]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
|
|
@ -66,9 +64,8 @@
|
|||
(let [source-text (:src params)
|
||||
page (:page params)
|
||||
file-name (str page suffix)
|
||||
file-path (cjio/file util/content-dir file-name)
|
||||
exists? (.exists (cjio/as-file file-path))
|
||||
git-repo (hist/load-or-init-repo util/content-dir)
|
||||
file-path (cjio/file content-dir file-name)
|
||||
git-repo (hist/load-or-init-repo content-dir)
|
||||
user (session/get :user)
|
||||
email (auth/get-email user)
|
||||
summary (format "%s: %s" user (or (:summary params) "no summary"))]
|
||||
|
|
@ -82,14 +79,14 @@
|
|||
(if
|
||||
(= suffix ".md")
|
||||
(url-encode page)
|
||||
(util/get-message :default-page-title request))))))
|
||||
(get-message :default-page-title request))))))
|
||||
|
||||
|
||||
(defn edit-page
|
||||
"Render a page in a text-area for editing. This could have been done in the same function as wiki-page,
|
||||
and that would have been neat, but I couldn't see how to establish security if that were done."
|
||||
([request]
|
||||
(edit-page request (util/get-message :default-page-title request) ".md" "edit.html" "_edit-side-bar.md"))
|
||||
(edit-page request (get-message :default-page-title request) ".md" "edit.html" "_edit-side-bar.md"))
|
||||
([request default suffix template side-bar]
|
||||
(or
|
||||
(show-sanity-check-error)
|
||||
|
|
@ -97,7 +94,7 @@
|
|||
src-text (:src params)
|
||||
page (or (:page params) default)
|
||||
file-name (str page suffix)
|
||||
file-path (cjio/file util/content-dir file-name)
|
||||
file-path (cjio/file content-dir file-name)
|
||||
exists? (.exists (cjio/as-file file-path))
|
||||
user (session/get :user)]
|
||||
(log/info
|
||||
|
|
@ -107,10 +104,10 @@
|
|||
"User %s Opening '%s' for editing")
|
||||
user file-path))
|
||||
(cond src-text (process-source params suffix request)
|
||||
true
|
||||
:else
|
||||
(layout/render template
|
||||
(merge (util/standard-params request)
|
||||
{:title (str (util/get-message :edit-title-prefix request) " " page)
|
||||
(merge (standard-params request)
|
||||
{:title (str (get-message :edit-title-prefix request) " " page)
|
||||
:page page
|
||||
:side-bar (md/md-to-html-string
|
||||
(local-links
|
||||
|
|
@ -132,7 +129,7 @@
|
|||
investigate and document."
|
||||
(component/start
|
||||
(component/system-map
|
||||
:resolver (resolve/new-resolver util/content-dir)
|
||||
:resolver (resolve/new-resolver content-dir)
|
||||
:includer (component/using
|
||||
(include/new-includer)
|
||||
[:resolver]))))
|
||||
|
|
@ -180,7 +177,7 @@
|
|||
(-> processed-text :extensions extension-key
|
||||
resource-type requirement)
|
||||
requirement)]
|
||||
(if (empty? r)
|
||||
(when (empty? r)
|
||||
(log/warn "Found no valid URL for requirement"
|
||||
requirement "of extension" extension-key))
|
||||
r))
|
||||
|
|
@ -204,9 +201,9 @@
|
|||
(or
|
||||
(show-sanity-check-error)
|
||||
(let [params (keywordize-keys (:params request))
|
||||
page (or (:page params) util/start-page (util/get-message :default-page-title "Introduction" request))
|
||||
page (or (:page params) start-page (get-message :default-page-title "Introduction" request))
|
||||
file-name (str page ".md")
|
||||
file-path (cjio/file util/content-dir file-name)
|
||||
file-path (cjio/file content-dir file-name)
|
||||
exists? (.exists (cjio/as-file file-path))]
|
||||
(if exists?
|
||||
(do
|
||||
|
|
@ -217,7 +214,7 @@
|
|||
(:includer md-include-system)
|
||||
(slurp file-path))))]
|
||||
(layout/render "wiki.html"
|
||||
(merge (util/standard-params request)
|
||||
(merge (standard-params request)
|
||||
processed-text
|
||||
{:title page
|
||||
:scripts (collect-preferred processed-text :scripts)
|
||||
|
|
@ -233,13 +230,13 @@
|
|||
if any. If none, error?"
|
||||
[request]
|
||||
(let [params (keywordize-keys (:params request))
|
||||
page (url-decode (or (:page params) (util/get-message :default-page-title request)))
|
||||
page (url-decode (or (:page params) (get-message :default-page-title request)))
|
||||
file-name (str page ".md")
|
||||
repo-path util/content-dir]
|
||||
repo-path content-dir]
|
||||
(log/info (format "Showing history of page '%s'" page))
|
||||
(layout/render "history.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (str (util/get-message :history-title-prefix request)
|
||||
(merge (standard-params request)
|
||||
{:title (str (get-message :history-title-prefix request)
|
||||
" " page)
|
||||
:page page
|
||||
:history (hist/find-history repo-path file-name)}))))
|
||||
|
|
@ -280,24 +277,24 @@
|
|||
(and (fs/extension %)
|
||||
(image-extns (cs/lower-case (fs/extension %))))
|
||||
true false)
|
||||
(if
|
||||
(when
|
||||
(fs/mod-time %)
|
||||
(format-instant (fs/mod-time %)))
|
||||
(fs/name %)
|
||||
(util/local-url %)])
|
||||
(local-url %)])
|
||||
(remove
|
||||
#(or (cs/starts-with? (fs/name %) ".")
|
||||
(fs/directory? %))
|
||||
(file-seq (clojure.java.io/file util/upload-dir)))))]
|
||||
(file-seq (clojure.java.io/file upload-dir)))))]
|
||||
(log/info (with-out-str (pprint files)))
|
||||
(layout/render
|
||||
"list-uploads.html"
|
||||
(merge (util/standard-params request)
|
||||
(merge (standard-params request)
|
||||
{:title (str
|
||||
(util/get-message :list-files request)
|
||||
(if
|
||||
(get-message :list-files request)
|
||||
(when
|
||||
(:search params)
|
||||
(str " " (util/get-message :matching request))))
|
||||
(str " " (get-message :matching request))))
|
||||
:search (:search params)
|
||||
:files (if
|
||||
(:search params)
|
||||
|
|
@ -317,14 +314,14 @@
|
|||
"Render a form to allow the upload of a file."
|
||||
[request]
|
||||
(let [params (keywordize-keys (:params request))
|
||||
data-path (str util/content-dir "/uploads/")
|
||||
git-repo (hist/load-or-init-repo util/content-dir)
|
||||
data-path (str content-dir "/uploads/")
|
||||
git-repo (hist/load-or-init-repo content-dir)
|
||||
upload (:upload params)
|
||||
uploaded (if upload (ul/store-upload params data-path))
|
||||
uploaded (when upload (ul/store-upload params data-path))
|
||||
user (session/get :user)
|
||||
summary (format "%s: %s" user (or (:summary params) "no summary"))]
|
||||
(log/info (session/get :user) "has uploaded" (cs/join "; " (map :resource uploaded)))
|
||||
(if-not
|
||||
(when-not
|
||||
(empty? uploaded)
|
||||
(do
|
||||
(doall (map
|
||||
|
|
@ -332,8 +329,8 @@
|
|||
(remove nil? uploaded)))
|
||||
(git/git-commit git-repo summary {:name user :email (auth/get-email user)})))
|
||||
(layout/render "upload.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (util/get-message :file-upload-title request)
|
||||
(merge (standard-params request)
|
||||
{:title (get-message :file-upload-title request)
|
||||
:uploaded uploaded}))))
|
||||
|
||||
|
||||
|
|
@ -341,14 +338,14 @@
|
|||
"Render a specific historical version of a page"
|
||||
[request]
|
||||
(let [params (keywordize-keys (:params request))
|
||||
page (url-decode (or (:page params) (util/get-message :default-page-title request)))
|
||||
page (url-decode (or (:page params) (get-message :default-page-title request)))
|
||||
version (:version params)
|
||||
file-name (str page ".md")
|
||||
content (hist/fetch-version util/content-dir file-name version)]
|
||||
content (hist/fetch-version content-dir file-name version)]
|
||||
(log/info (format "Showing version '%s' of page '%s'" version page))
|
||||
(layout/render "wiki.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (str (util/get-message :vers-col-hdr request) " " version " " (util/get-message :of request) " " page)
|
||||
(merge (standard-params request)
|
||||
{:title (str (get-message :vers-col-hdr request) " " version " " (get-message :of request) " " page)
|
||||
:page page
|
||||
:content (md->html content)}))))
|
||||
|
||||
|
|
@ -357,24 +354,24 @@
|
|||
"Render a diff between two versions of a page"
|
||||
[request]
|
||||
(let [params (keywordize-keys (:params request))
|
||||
page (url-decode (or (:page params) (util/get-message :default-page-title request)))
|
||||
page (url-decode (or (:page params) (get-message :default-page-title request)))
|
||||
version (:version params)
|
||||
file-name (str page ".md")]
|
||||
(log/info (format "Showing diff between version '%s' of page '%s' and current" version page))
|
||||
(layout/render "wiki.html"
|
||||
(merge (util/standard-params request)
|
||||
(merge (standard-params request)
|
||||
{:title
|
||||
(str
|
||||
(util/get-message :diff-title-prefix request)
|
||||
(get-message :diff-title-prefix request)
|
||||
" "
|
||||
version
|
||||
" "
|
||||
(util/get-message :of request)
|
||||
(get-message :of request)
|
||||
" "
|
||||
page)
|
||||
:page page
|
||||
:content (d2h/diff2html
|
||||
(hist/diff util/content-dir file-name version))}))))
|
||||
(hist/diff content-dir file-name version))}))))
|
||||
|
||||
|
||||
(defn auth-page
|
||||
|
|
@ -389,9 +386,9 @@
|
|||
action (:action form-params)
|
||||
user (session/get :user)
|
||||
redirect-to (:redirect-to params)]
|
||||
(if redirect-to (log/info (str "After auth, redirect to: " redirect-to)))
|
||||
(when redirect-to (log/info (str "After auth, redirect to: " redirect-to)))
|
||||
(cond
|
||||
(= action (util/get-message :logout-label request))
|
||||
(= action (get-message :logout-label request))
|
||||
(do
|
||||
(log/info (str "User " user " logging out"))
|
||||
(session/remove! :user)
|
||||
|
|
@ -403,12 +400,12 @@
|
|||
(or
|
||||
redirect-to
|
||||
(get-servlet-context-path request))))
|
||||
true
|
||||
:else
|
||||
(layout/render "auth.html"
|
||||
(merge (util/standard-params request)
|
||||
(merge (standard-params request)
|
||||
{:title (if user
|
||||
(str (util/get-message :logout-link request) " " user)
|
||||
(util/get-message :login-link request))
|
||||
(str (get-message :logout-link request) " " user)
|
||||
(get-message :login-link request))
|
||||
:redirect-to redirect-to}))))))
|
||||
|
||||
(defn wrap-restricted-redirect
|
||||
|
|
@ -430,7 +427,7 @@
|
|||
request
|
||||
;; else merge a redirect target into the params
|
||||
(let
|
||||
[redirect-to (if (:uri request)
|
||||
[redirect-to (when (:uri request)
|
||||
(cs/join "?" [(:uri request) (:query-string request)]))]
|
||||
(assoc-in request [:params :redirect-to] redirect-to))))))
|
||||
|
||||
|
|
@ -447,14 +444,14 @@
|
|||
(true? check-pass)
|
||||
(auth/change-pass user oldpass pass2))]
|
||||
(layout/render "passwd.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (str (util/get-message :chpass-title-prefix request) " " user)
|
||||
:message (if changed? (util/get-message :chpass-success request))
|
||||
(merge (standard-params request)
|
||||
{:title (str (get-message :chpass-title-prefix request) " " user)
|
||||
:message (when changed? (get-message :chpass-success request))
|
||||
:error (cond
|
||||
(nil? oldpass) nil
|
||||
changed? nil
|
||||
(keyword? check-pass) (util/get-message check-pass request)
|
||||
true (util/get-message :chpass-fail request))}))))
|
||||
(keyword? check-pass) (get-message check-pass request)
|
||||
:else (get-message :chpass-fail request))}))))
|
||||
|
||||
|
||||
(defroutes wiki-routes
|
||||
|
|
|
|||
|
|
@ -4,16 +4,13 @@
|
|||
(:require [clojure.string :as cs]
|
||||
[clojure.java.io :as io]
|
||||
[image-resizer.core :refer [resize]]
|
||||
[image-resizer.scale-methods :as sm]
|
||||
[image-resizer.util :refer :all]
|
||||
[image-resizer.util :refer [buffered-image dimensions]]
|
||||
[me.raynes.fs :as fs]
|
||||
[noir.io :as nio]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.util :as util]
|
||||
[taoensso.timbre :as log])
|
||||
(:import [java.io File]
|
||||
[java.awt Image]
|
||||
[java.awt.image RenderedImage BufferedImageOp]
|
||||
[java.awt.image RenderedImage]
|
||||
[javax.imageio ImageIO ImageWriter ImageWriteParam IIOImage]
|
||||
[javax.imageio.stream FileImageOutputStream]))
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
smeagol.util
|
||||
(:require [clojure.java.io :as cjio]
|
||||
[clojure.string :as cs]
|
||||
[environ.core :refer [env]]
|
||||
[markdown.core :as md]
|
||||
[me.raynes.fs :as fs]
|
||||
[noir.io :as io]
|
||||
|
|
@ -11,7 +10,7 @@
|
|||
[scot.weft.i18n.core :as i18n]
|
||||
[smeagol.authenticate :as auth]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.local-links :refer :all]
|
||||
[smeagol.local-links :refer [local-links]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
@ -79,15 +78,15 @@
|
|||
(cjio/file local-url-base file-path))]
|
||||
(cond
|
||||
(cs/includes? file-path "..")
|
||||
(cs/join " " file-path
|
||||
"Attempts to ascend the file hierarchy are disallowed.")
|
||||
(cs/join " " [file-path
|
||||
"Attempts to ascend the file hierarchy are disallowed."])
|
||||
(not (cs/starts-with? path local-url-base))
|
||||
(cs/join " " [path "is not servable"])
|
||||
(not (fs/exists? path))
|
||||
(cs/join " " [path "does not exist"])
|
||||
(not (fs/readable? path))
|
||||
(cs/join " " [path "is not readable"])))
|
||||
(catch Exception any (cs/join " " file-path "is not servable because" (.getMessage any)))))
|
||||
(catch Exception any (cs/join " " [file-path "is not servable because" (.getMessage any)]))))
|
||||
|
||||
|
||||
;; (not-servable-reason "/home/simon/workspace/smeagol/resources/public/content/vendor/node_modules/photoswipe/dist/photoswipe.min.js")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue