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