mirror of
https://github.com/journeyman-cc/smeagol.git
synced 2026-04-12 18:05:06 +00:00
Version 0.99.9-SNAPSHOT
This commit is contained in:
parent
d4ac9b3586
commit
c76c821770
9 changed files with 135 additions and 109 deletions
|
|
@ -1,4 +1,4 @@
|
|||
(defproject smeagol "0.99.8"
|
||||
(defproject smeagol "0.99.9-SNAPSHOT"
|
||||
:description "A simple Git-backed Wiki inspired by Gollum"
|
||||
:url "https://github.com/simon-brooke/smeagol"
|
||||
:license {:name "GNU General Public License,version 2.0 or (at your option) any later version"
|
||||
|
|
@ -14,6 +14,7 @@
|
|||
[com.taoensso/tower "3.0.2" :exclusions [com.taoensso/encore]]
|
||||
[crypto-password "0.2.0"]
|
||||
[environ "1.1.0"]
|
||||
[hiccup "1.0.5"]
|
||||
[im.chit/cronj "1.4.4"]
|
||||
[lib-noir "0.9.9" :exclusions [org.clojure/tools.reader]]
|
||||
[markdown-clj "0.9.99" :exclusions [com.keminglabs/cljx]]
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@ To deploy Smeagol as a stand-alone application, either download the jar file for
|
|||
|
||||
This will create a jar file in the `target` directory, named `smeagol-`*VERSION*`-standalone.jar`.
|
||||
|
||||
Smeagol cannot access either its configuration or its content from the jar file. Consequently you should set up three environment variables:
|
||||
Smeagol cannot access either its configuration or its content from the jar file, as otherwise they would not be editable. Consequently you should set up three environment variables:
|
||||
|
||||
1. **SMEAGOL_CONFIG** should be the full or relative pathname of a Smeagol [[Configuration]] file;
|
||||
2. **SMEAGOL\_CONTENT\_DIR** should be the full or relative pathname of the directory from which Smeagol should serve content (which may initially be empty, but must be writable by the process which runs Smeagol)'
|
||||
3. **SMEAGOL_PASSWD** should be the full or relative pathname of a Smeagol Passwd file - see [[Security and authentication]]. This file must contain an entry for at least your initial user, and, if you want to administer users through the user interface, must be writable by the process which runs Smeagol);
|
||||
1. `SMEAGOL_CONFIG` should be the full or relative pathname of a Smeagol [[Configuration]] file;
|
||||
2. `SMEAGOL_CONTENT_DIR` should be the full or relative pathname of the directory from which Smeagol should serve content (which may initially be empty, but must be writable by the process which runs Smeagol)'
|
||||
3. `SMEAGOL_PASSWD` should be the full or relative pathname of a Smeagol Passwd file - see [[Security and authentication]]. This file must contain an entry for at least your initial user, and, if you want to administer users through the user interface, must be writable by the process which runs Smeagol;
|
||||
|
||||
You can run the jar file with:
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ To start a web server for the application during development, run:
|
|||
This should start a development server, and open a new window or tab in your default browser with the default page of the wiki loaded into it.
|
||||
|
||||
## Editing
|
||||
I generally use [LightTable]() as my `Clojure` editor, but it doesn't really matter what you use; if you run Smeagol as described above, then all changes you make in the code (and save) will instantly be applied to the running system. This makes for a productive development environment.
|
||||
I generally use [LightTable](http://lighttable.com/) as my `Clojure` editor, but it doesn't really matter what you use; if you run Smeagol as described above, then all changes you make in the code (and save) will instantly be applied to the running system. This makes for a productive development environment.
|
||||
|
||||
## Documentation
|
||||
It is my intention that the code should be sufficiently well documented to be easy to understand. Documentation may be generated from the code by running
|
||||
|
|
|
|||
|
|
@ -46,4 +46,7 @@
|
|||
|
||||
(def config
|
||||
"The actual configuration, as a map."
|
||||
(read-string (slurp config-file-path)))
|
||||
(try
|
||||
(read-string (slurp config-file-path))
|
||||
(catch Exception any
|
||||
(throw (Exception. "Could not load configuration" any)))))
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
(ns ^{:doc "Set up, configure, and clean up after the wiki server."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.handler
|
||||
(:require [compojure.core :refer [defroutes]]
|
||||
(:require [clojure.java.io :as cjio]
|
||||
[compojure.core :refer [defroutes]]
|
||||
[compojure.route :as route]
|
||||
[cronj.core :as cronj]
|
||||
[environ.core :refer [env]]
|
||||
|
|
@ -46,23 +47,6 @@
|
|||
(route/resources "/")
|
||||
(route/not-found "Not Found"))
|
||||
|
||||
(defn init
|
||||
"init will be called once when
|
||||
app is deployed as a servlet on
|
||||
an app server such as Tomcat
|
||||
put any initialization code here"
|
||||
[]
|
||||
(timbre/merge-config!
|
||||
{:appenders
|
||||
{:rotor (rotor/rotor-appender
|
||||
{:path "smeagol.log"
|
||||
:max-size (* 512 1024)
|
||||
:backlog 10})}})
|
||||
(if (env :dev) (parser/cache-off!))
|
||||
;;start the expired session cleanup job
|
||||
(cronj/start! session-manager/cleanup-job)
|
||||
(timbre/info "\n-=[ smeagol started successfully"
|
||||
(when (env :dev) "using the development profile") "]=-"))
|
||||
|
||||
(defn destroy
|
||||
"destroy will be called when your application
|
||||
|
|
@ -72,24 +56,49 @@
|
|||
(cronj/shutdown! session-manager/cleanup-job)
|
||||
(timbre/info "shutdown complete!"))
|
||||
|
||||
|
||||
(defn init
|
||||
"init will be called once when
|
||||
app is deployed as a servlet on
|
||||
an app server such as Tomcat
|
||||
put any initialization code here"
|
||||
[]
|
||||
(try
|
||||
(timbre/merge-config!
|
||||
{:appenders
|
||||
{:rotor (rotor/rotor-appender
|
||||
{:path "smeagol.log"
|
||||
:max-size (* 512 1024)
|
||||
:backlog 10})}})
|
||||
(cronj/start! session-manager/cleanup-job)
|
||||
(if (env :dev) (parser/cache-off!))
|
||||
;;start the expired session cleanup job
|
||||
(timbre/info "\n-=[ smeagol started successfully"
|
||||
(when (env :dev) "using the development profile") "]=-")
|
||||
(catch Exception any
|
||||
(timbre/error "Failure during startup" any)
|
||||
(destroy))))
|
||||
|
||||
;; timeout sessions after 30 minutes
|
||||
(def session-defaults
|
||||
{:timeout (* 60 30)
|
||||
:timeout-response (redirect "/")})
|
||||
|
||||
(defn- mk-defaults
|
||||
|
||||
(defn- make-defaults
|
||||
"set to true to enable XSS protection"
|
||||
[xss-protection?]
|
||||
(-> site-defaults
|
||||
(update-in [:session] merge session-defaults)
|
||||
(assoc-in [:security :anti-forgery] xss-protection?)))
|
||||
|
||||
|
||||
(def app (app-handler
|
||||
;; add your application routes here
|
||||
[wiki-routes base-routes]
|
||||
;; add custom middleware here
|
||||
:middleware (load-middleware)
|
||||
:ring-defaults (mk-defaults false)
|
||||
:ring-defaults (make-defaults true)
|
||||
;; add access rules here
|
||||
:access-rules [{:redirect "/auth"
|
||||
:rule user-access}]
|
||||
|
|
|
|||
|
|
@ -2,12 +2,16 @@
|
|||
(ns ^{:doc "Render a page as HTML."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.layout
|
||||
(:require [clojure.string :as s]
|
||||
(:require [clojure.java.io :as cjio]
|
||||
[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.util :as util]
|
||||
[taoensso.timbre :as timbre]))
|
||||
|
||||
|
|
@ -51,6 +55,7 @@
|
|||
(deftype RenderableTemplate [template params]
|
||||
Renderable
|
||||
(render [this request]
|
||||
(try
|
||||
(content-type
|
||||
(->> (assoc params
|
||||
(keyword (s/replace template #".html" "-selected")) "active"
|
||||
|
|
@ -65,9 +70,15 @@
|
|||
(catch IllegalArgumentException _ context))))
|
||||
(parser/render-file (str template-path template))
|
||||
response)
|
||||
"text/html; charset=utf-8")))
|
||||
"text/html; charset=utf-8")
|
||||
(catch Exception any
|
||||
(show-sanity-check-error any)))))
|
||||
|
||||
|
||||
(defn render [template & [params]]
|
||||
(RenderableTemplate. template params))
|
||||
(defn render
|
||||
[template & [params]]
|
||||
(try
|
||||
(RenderableTemplate. template params)
|
||||
(catch Exception any
|
||||
(show-sanity-check-error any))))
|
||||
|
||||
|
|
|
|||
|
|
@ -40,13 +40,11 @@
|
|||
|
||||
(def development-middleware
|
||||
[wrap-error-page
|
||||
wrap-exceptions
|
||||
wrap-anti-forgery])
|
||||
wrap-exceptions])
|
||||
|
||||
|
||||
(def production-middleware
|
||||
[#(wrap-internal-error % :log (fn [e] (timbre/error e)))
|
||||
wrap-anti-forgery])
|
||||
[#(wrap-internal-error % :log (fn [e] (timbre/error e)))])
|
||||
|
||||
|
||||
(defn load-middleware []
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
[smeagol.history :as hist]
|
||||
[smeagol.layout :as layout]
|
||||
[smeagol.routes.admin :as admin]
|
||||
[smeagol.sanity :refer [show-sanity-check-error]]
|
||||
[smeagol.util :as util]
|
||||
[smeagol.uploads :as ul]
|
||||
[taoensso.timbre :as timbre]))
|
||||
|
|
@ -83,6 +84,7 @@
|
|||
([request]
|
||||
(edit-page request (util/get-message :default-page-title request) ".md" "edit.html" "_edit-side-bar.md"))
|
||||
([request default suffix template side-bar]
|
||||
(show-sanity-check-error)
|
||||
(let [params (keywordize-keys (:params request))
|
||||
src-text (:src params)
|
||||
page (or (:page params) default)
|
||||
|
|
@ -113,6 +115,8 @@
|
|||
(defn wiki-page
|
||||
"Render the markdown page specified in this `request`, if any. If none found, redirect to edit-page"
|
||||
[request]
|
||||
(or
|
||||
(show-sanity-check-error)
|
||||
(let [params (keywordize-keys (:params request))
|
||||
page (or (:page params) (util/get-message :default-page-title "Introduction" request))
|
||||
file-name (str page ".md")
|
||||
|
|
@ -127,7 +131,7 @@
|
|||
:page page
|
||||
:content (md->html (slurp file-path))
|
||||
:editable true})))
|
||||
true (response/redirect (str "/edit?page=" page)))))
|
||||
true (response/redirect (str "/edit?page=" page))))))
|
||||
|
||||
|
||||
(defn history-page
|
||||
|
|
@ -202,6 +206,8 @@
|
|||
(defn auth-page
|
||||
"Render the auth page"
|
||||
[request]
|
||||
(or
|
||||
(show-sanity-check-error)
|
||||
(let [params (keywordize-keys (:form-params request))
|
||||
username (:username params)
|
||||
password (:password params)
|
||||
|
|
@ -222,7 +228,7 @@
|
|||
(layout/render "auth.html"
|
||||
(merge (util/standard-params request)
|
||||
{:title (if user (str (util/get-message :logout-link request) " " user) (util/get-message :login-link request))
|
||||
:redirect-to ((:headers request) "referer")})))))
|
||||
:redirect-to ((:headers request) "referer")}))))))
|
||||
|
||||
|
||||
(defn passwd-page
|
||||
|
|
|
|||
|
|
@ -51,18 +51,16 @@
|
|||
:version (System/getProperty "smeagol.version")}))
|
||||
|
||||
|
||||
(defn raw-get-messages
|
||||
(defn- raw-get-messages
|
||||
"Return the most acceptable messages collection we have given the
|
||||
`Accept-Language` header in this `request`."
|
||||
[request]
|
||||
(merge
|
||||
(i18n/get-messages
|
||||
((:headers request) "accept-language")
|
||||
;; (cjio/file (io/resource-path) "i18n")
|
||||
"i18n"
|
||||
"en-GB")
|
||||
config)
|
||||
)
|
||||
config))
|
||||
|
||||
|
||||
(def get-messages (memoize raw-get-messages))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue