diff --git a/help/en/whitelist.myco b/help/en/whitelist.myco new file mode 100644 index 0000000..7190d7e --- /dev/null +++ b/help/en/whitelist.myco @@ -0,0 +1,15 @@ +# Whitelist +If you want to limit what people can authorize to your wiki, you may want to use the **whitelist**. + +In `config.ini`, in the `[Authorization]` section, enable the white list in `UseWhiteList` and list all allowed usernames in the `WhiteList` field separated by comma: +``` +... +[Authorization] +UseWhiteList = true +WhiteList = fish,pesce,рыба +... +``` + +Reload the wiki. + +From now on, only these usernames can be used, ie you can only register and log in with these names. Others will be rejected. \ No newline at end of file diff --git a/views/auth.qtpl.go b/views/auth.qtpl.go index dd46040..fab2f12 100644 --- a/views/auth.qtpl.go +++ b/views/auth.qtpl.go @@ -416,22 +416,22 @@ func StreamLockHTML(qw422016 *qt422016.Writer) {

🔒

Locked

- -
- -
- -
- -
- -
- - `) -//line views/auth.qtpl:140 + +
+ +
+ +
+ +
+ + + `) +//line views/auth.qtpl:139 streamtelegramWidgetHTML(qw422016) -//line views/auth.qtpl:140 +//line views/auth.qtpl:139 qw422016.N().S(` + diff --git a/views/stuff.qtpl b/views/stuff.qtpl index 7939c91..84be5d1 100644 --- a/views/stuff.qtpl +++ b/views/stuff.qtpl @@ -152,6 +152,14 @@ It outputs a poorly formatted JSON, but it works and is valid. +
  • + Configuration + +
  • {% endfunc %} diff --git a/views/stuff.qtpl.go b/views/stuff.qtpl.go index 7046747..ac0f9e4 100644 --- a/views/stuff.qtpl.go +++ b/views/stuff.qtpl.go @@ -501,47 +501,55 @@ func streamhelpTopicsHTML(qw422016 *qt422016.Writer) { +
  • + Configuration + +
  • `) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 } -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 func writehelpTopicsHTML(qq422016 qtio422016.Writer) { -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 qw422016 := qt422016.AcquireWriter(qq422016) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 streamhelpTopicsHTML(qw422016) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 qt422016.ReleaseWriter(qw422016) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 } -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 func helpTopicsHTML() string { -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 qb422016 := qt422016.AcquireByteBuffer() -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 writehelpTopicsHTML(qb422016) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 qs422016 := string(qb422016.B) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 qt422016.ReleaseByteBuffer(qb422016) -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 return qs422016 -//line views/stuff.qtpl:157 +//line views/stuff.qtpl:165 } -//line views/stuff.qtpl:159 +//line views/stuff.qtpl:167 func StreamUserListHTML(qw422016 *qt422016.Writer) { -//line views/stuff.qtpl:159 +//line views/stuff.qtpl:167 qw422016.N().S(`

    List of users

    `) -//line views/stuff.qtpl:164 +//line views/stuff.qtpl:172 var ( admins = make([]string, 0) moderators = make([]string, 0) @@ -558,345 +566,345 @@ func StreamUserListHTML(qw422016 *qt422016.Writer) { } } -//line views/stuff.qtpl:179 +//line views/stuff.qtpl:187 qw422016.N().S(`

    Admins

      `) -//line views/stuff.qtpl:182 +//line views/stuff.qtpl:190 for _, name := range admins { -//line views/stuff.qtpl:182 +//line views/stuff.qtpl:190 qw422016.N().S(`
    1. `) -//line views/stuff.qtpl:183 +//line views/stuff.qtpl:191 qw422016.E().S(name) -//line views/stuff.qtpl:183 +//line views/stuff.qtpl:191 qw422016.N().S(`
    2. `) -//line views/stuff.qtpl:184 +//line views/stuff.qtpl:192 } -//line views/stuff.qtpl:184 +//line views/stuff.qtpl:192 qw422016.N().S(`

    Moderators

      `) -//line views/stuff.qtpl:188 +//line views/stuff.qtpl:196 for _, name := range moderators { -//line views/stuff.qtpl:188 +//line views/stuff.qtpl:196 qw422016.N().S(`
    1. `) -//line views/stuff.qtpl:189 +//line views/stuff.qtpl:197 qw422016.E().S(name) -//line views/stuff.qtpl:189 +//line views/stuff.qtpl:197 qw422016.N().S(`
    2. `) -//line views/stuff.qtpl:190 +//line views/stuff.qtpl:198 } -//line views/stuff.qtpl:190 +//line views/stuff.qtpl:198 qw422016.N().S(`

    Editors

      `) -//line views/stuff.qtpl:194 +//line views/stuff.qtpl:202 for _, name := range editors { -//line views/stuff.qtpl:194 +//line views/stuff.qtpl:202 qw422016.N().S(`
    1. `) -//line views/stuff.qtpl:195 +//line views/stuff.qtpl:203 qw422016.E().S(name) -//line views/stuff.qtpl:195 +//line views/stuff.qtpl:203 qw422016.N().S(`
    2. `) -//line views/stuff.qtpl:196 +//line views/stuff.qtpl:204 } -//line views/stuff.qtpl:196 +//line views/stuff.qtpl:204 qw422016.N().S(`
    `) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 } -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 func WriteUserListHTML(qq422016 qtio422016.Writer) { -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 qw422016 := qt422016.AcquireWriter(qq422016) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 StreamUserListHTML(qw422016) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 qt422016.ReleaseWriter(qw422016) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 } -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 func UserListHTML() string { -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 qb422016 := qt422016.AcquireByteBuffer() -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 WriteUserListHTML(qb422016) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 qs422016 := string(qb422016.B) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 qt422016.ReleaseByteBuffer(qb422016) -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 return qs422016 -//line views/stuff.qtpl:200 +//line views/stuff.qtpl:208 } -//line views/stuff.qtpl:202 +//line views/stuff.qtpl:210 func StreamHyphaListHTML(qw422016 *qt422016.Writer) { -//line views/stuff.qtpl:202 +//line views/stuff.qtpl:210 qw422016.N().S(`

    List of hyphae

    This wiki has `) -//line views/stuff.qtpl:206 +//line views/stuff.qtpl:214 qw422016.N().D(hyphae.Count()) -//line views/stuff.qtpl:206 +//line views/stuff.qtpl:214 qw422016.N().S(` hyphae.

    `) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 } -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 func WriteHyphaListHTML(qq422016 qtio422016.Writer) { -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 qw422016 := qt422016.AcquireWriter(qq422016) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 StreamHyphaListHTML(qw422016) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 qt422016.ReleaseWriter(qw422016) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 } -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 func HyphaListHTML() string { -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 qb422016 := qt422016.AcquireByteBuffer() -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 WriteHyphaListHTML(qb422016) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 qs422016 := string(qb422016.B) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 qt422016.ReleaseByteBuffer(qb422016) -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 return qs422016 -//line views/stuff.qtpl:219 +//line views/stuff.qtpl:227 } -//line views/stuff.qtpl:221 +//line views/stuff.qtpl:229 func StreamAboutHTML(qw422016 *qt422016.Writer) { -//line views/stuff.qtpl:221 +//line views/stuff.qtpl:229 qw422016.N().S(`

    About `) -//line views/stuff.qtpl:225 +//line views/stuff.qtpl:233 qw422016.E().S(cfg.WikiName) -//line views/stuff.qtpl:225 +//line views/stuff.qtpl:233 qw422016.N().S(`

    See /list for information about hyphae on this wiki.

    `) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 } -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 func WriteAboutHTML(qq422016 qtio422016.Writer) { -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 qw422016 := qt422016.AcquireWriter(qq422016) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 StreamAboutHTML(qw422016) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 qt422016.ReleaseWriter(qw422016) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 } -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 func AboutHTML() string { -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 qb422016 := qt422016.AcquireByteBuffer() -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 WriteAboutHTML(qb422016) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 qs422016 := string(qb422016.B) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 qt422016.ReleaseByteBuffer(qb422016) -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 return qs422016 -//line views/stuff.qtpl:243 +//line views/stuff.qtpl:251 } -//line views/stuff.qtpl:245 +//line views/stuff.qtpl:253 func StreamCommonScripts(qw422016 *qt422016.Writer) { -//line views/stuff.qtpl:245 +//line views/stuff.qtpl:253 qw422016.N().S(` `) -//line views/stuff.qtpl:246 +//line views/stuff.qtpl:254 for _, scriptPath := range cfg.CommonScripts { -//line views/stuff.qtpl:246 +//line views/stuff.qtpl:254 qw422016.N().S(` `) -//line views/stuff.qtpl:248 +//line views/stuff.qtpl:256 } -//line views/stuff.qtpl:248 +//line views/stuff.qtpl:256 qw422016.N().S(` `) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 } -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 func WriteCommonScripts(qq422016 qtio422016.Writer) { -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 qw422016 := qt422016.AcquireWriter(qq422016) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 StreamCommonScripts(qw422016) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 qt422016.ReleaseWriter(qw422016) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 } -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 func CommonScripts() string { -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 qb422016 := qt422016.AcquireByteBuffer() -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 WriteCommonScripts(qb422016) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 qs422016 := string(qb422016.B) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 qt422016.ReleaseByteBuffer(qb422016) -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 return qs422016 -//line views/stuff.qtpl:249 +//line views/stuff.qtpl:257 } diff --git a/web/stuff.go b/web/stuff.go index 63239a9..4fd3076 100644 --- a/web/stuff.go +++ b/web/stuff.go @@ -24,7 +24,7 @@ import ( ) func initStuff(r *mux.Router) { - r.PathPrefix("/help/").HandlerFunc(handlerHelp) + r.PathPrefix("/help").HandlerFunc(handlerHelp) r.HandleFunc("/list", handlerList) r.HandleFunc("/reindex", handlerReindex) r.HandleFunc("/update-header-links", handlerUpdateHeaderLinks) @@ -37,7 +37,11 @@ func initStuff(r *mux.Router) { // handlerHelp gets the appropriate documentation or tells you where you (personally) have failed. func handlerHelp(w http.ResponseWriter, rq *http.Request) { - content, err := help.Get(rq.URL.Path[6:]) // Drop /help/ + articlePath := strings.TrimPrefix(strings.TrimPrefix(rq.URL.Path, "/help/"), "/help") + if articlePath == "" { + articlePath = "en" + } + content, err := help.Get(articlePath) if err != nil && strings.HasPrefix(err.Error(), "open") { w.WriteHeader(http.StatusNotFound) _, _ = io.WriteString( @@ -60,10 +64,9 @@ func handlerHelp(w http.ResponseWriter, rq *http.Request) { } // TODO: change for the function that uses byte array when there is such function in mycomarkup. - ctx, _ := mycocontext.ContextFromStringInput(rq.URL.Path[1:3], string(content)) + ctx, _ := mycocontext.ContextFromStringInput(articlePath, string(content)) ast := mycomarkup.BlockTree(ctx) result := mycomarkup.BlocksToHTML(ctx, ast) - // TODO: styled output idk w.WriteHeader(http.StatusOK) _, _ = io.WriteString( w,