Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wiki-js
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
wiki-js
Commits
416755f1
You need to sign in or sign up before continuing.
Commit
416755f1
authored
May 28, 2018
by
NGPixel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: remove config namespaces
parent
b1499d1d
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
556 additions
and
283 deletions
+556
-283
nav-header.vue
client/components/nav-header.vue
+1
-1
profile.vue
client/components/profile.vue
+11
-0
preferences.vue
client/components/profile/preferences.vue
+22
-3
profile.vue
client/components/profile/profile.vue
+67
-33
setup.vue
client/components/setup.vue
+11
-1
app.scss
client/scss/app.scss
+1
-0
_error.scss
client/scss/pages/_error.scss
+64
-0
config.sample.yml
config.sample.yml
+1
-25
data.yml
server/app/data.yml
+1
-8
auth.js
server/core/auth.js
+36
-32
config.js
server/core/config.js
+14
-27
db.js
server/core/db.js
+16
-10
kernel.js
server/core/kernel.js
+29
-65
localization.js
server/core/localization.js
+3
-2
2.0.0.js
server/db/migrations/2.0.0.js
+36
-5
authentication.js
server/db/models/authentication.js
+64
-0
editors.js
server/db/models/editors.js
+62
-0
settings.js
server/db/models/settings.js
+16
-2
users.js
server/db/models/users.js
+3
-0
index.js
server/index.js
+3
-8
fetch-graph-locale.js
server/jobs/fetch-graph-locale.js
+5
-4
sync-graph-locales.js
server/jobs/sync-graph-locales.js
+4
-5
master.js
server/master.js
+1
-1
markdown.js
server/modules/editor/markdown.js
+10
-0
setup.js
server/setup.js
+39
-35
error.pug
server/views/error.pug
+23
-10
wiki.js
wiki.js
+13
-6
No files found.
client/components/nav-header.vue
View file @
416755f1
...
...
@@ -58,7 +58,7 @@
color='blue'
)
v-spacer
v-progress-circular.mr-3(indeterminate, color='blue', v-show='isLoading')
v-progress-circular.mr-3(indeterminate, color='blue',
:size='22', :width='2'
v-show='isLoading')
slot(name='actions')
transition(name='navHeaderSearch')
v-btn(icon, @click='searchToggle', v-if='!searchIsShown')
...
...
client/components/profile.vue
View file @
416755f1
...
...
@@ -41,6 +41,8 @@
import
VueRouter
from
'vue-router'
import
{
mapState
}
from
'vuex'
/* global WIKI */
const
router
=
new
VueRouter
({
mode
:
'history'
,
base
:
'/p'
,
...
...
@@ -53,6 +55,15 @@ const router = new VueRouter({
]
})
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
WIKI
.
$store
.
commit
(
'loadingStart'
,
'profile'
)
next
()
})
router
.
afterEach
((
to
,
from
)
=>
{
WIKI
.
$store
.
commit
(
'loadingStop'
,
'profile'
)
})
export
default
{
data
()
{
return
{
...
...
client/components/profile/preferences.vue
View file @
416755f1
...
...
@@ -12,13 +12,32 @@
v-toolbar(color='primary', dark, dense, flat)
v-toolbar-title
.subheading Display
v-subheader Locale
v-card-text
v-subheader.pl-0 Locale
v-select.grey.lighten-5(solo, flat)
v-divider
v-subheader.pl-0 Timezone
v-select.grey.lighten-5(solo, flat)
v-divider.my-0
v-card-actions.grey.lighten-4
v-spacer
v-btn(color='primary')
v-icon(left) chevron_right
span Save
v-flex(lg6 xs12)
v-card
v-toolbar(color='primary', dark, dense, flat)
v-toolbar-title
.subheading ---
v-card-text ---
.subheading Editing
v-card-text
v-subheader.pl-0 Default Editor
v-select.grey.lighten-5(solo, flat)
v-divider.my-0
v-card-actions.grey.lighten-4
v-spacer
v-btn(color='primary')
v-icon(left) chevron_right
span Save
</
template
>
...
...
client/components/profile/profile.vue
View file @
416755f1
<
template
lang=
'pug'
>
v-container(fluid,
fill-height,
grid-list-lg)
v-container(fluid, grid-list-lg)
v-layout(row wrap)
v-flex(xs
12
)
v-flex(xs
6
)
.headline.primary--text Profile
.subheading.grey--text Personal profile
v-form.pt-3
v-layout(row wrap)
v-flex(lg6 xs12)
v-form
v-card
v-toolbar(color='primary', dark, dense, flat)
v-toolbar-title
.subheading User Details
v-card-text
v-text-field(label='Name', :counter='255', v-model='name', prepend-icon='person')
v-divider
v-text-field(label='Email', :counter='255', prepend-icon='email')
v-divider.my-0
v-card-actions.grey.lighten-4
v-spacer
v-btn(color='primary')
v-icon(left) chevron_right
span Save
v-flex(lg6 xs12)
v-card
v-toolbar(color='primary', dark, dense, flat)
v-toolbar-title
.subheading Picture
v-card-text ---
v-card.mt-3
v-toolbar(color='teal', dark, dense, flat)
v-toolbar-title
.subheading Activity
v-card-text.grey--text.text--darken-2
.body-1 Joined #[strong January 1st, 2010]
.body-1 Last login on #[strong January 2nd, 2010]
v-flex(xs6).text-xs-right
v-btn(outline, color='primary').mr-0
v-icon(left) public
span View Public Profile
v-flex(lg6 xs12)
v-card
v-toolbar(color='primary', dark, dense, flat)
v-toolbar-title
.subheading User Details
v-card-text
v-text-field(label='Name', :counter='255', v-model='name', prepend-icon='person')
v-text-field(label='Job Title', :counter='255', prepend-icon='accessibility')
v-text-field(label='Location / Office', :counter='255', prepend-icon='location_on')
v-divider.my-0
v-card-actions.grey.lighten-4
v-spacer
v-btn(color='primary')
v-icon(left) chevron_right
span Save
v-card.mt-3
v-toolbar(color='purple darken-4', dark, dense, flat)
v-toolbar-title
.subheading Authentication
v-card-text
v-subheader.pl-0 Provider
v-toolbar(flat, color='purple lighten-5', dense).purple--text.text--darken-4
v-icon(color='purple darken-4') supervised_user_circle
.subheading.ml-3 Local
v-divider
v-subheader.pl-0 Two-Factor Authentication (2FA)
.caption.mb-2 2FA adds an extra layer of security by requiring a unique code generated on your smartphone when signing in.
v-btn(color='purple darken-4', dark, depressed).ml-0 Enable 2FA
v-btn(color='purple darken-4', dark, depressed, disabled).ml-0 Disable 2FA
v-divider
v-subheader.pl-0 Change Password
v-text-field(label='Current Password', prepend-icon='last_page')
v-text-field(label='New Password', prepend-icon='last_page')
v-text-field(label='Confirm New Password', prepend-icon='last_page')
v-btn(color='purple darken-4', dark, depressed).ml-0 Change Password
v-flex(lg6 xs12)
v-card
v-toolbar(color='primary', dark, dense, flat)
v-toolbar-title
.subheading Picture
v-card-title
v-avatar(size='64', color='grey')
v-icon(size='64', color='grey lighten-2') account_circle
v-btn(depressed).ml-4.elevation-1 Upload Picture
v-btn(depressed, disabled).elevation-1 Remove Picture
v-card.mt-3
v-toolbar(color='teal', dark, dense, flat)
v-toolbar-title
.subheading Activity
v-card-text.grey--text.text--darken-2
.body-2.grey--text Joined on
.body-1: strong January 1st, 2018 at 12:00 AM
.body-2.grey--text.mt-3 Profile last updated on
.body-1: strong January 1st, 2018 at 12:00 AM
.body-2.grey--text.mt-3 Last login on
.body-1: strong January 1st, 2018 at 12:00 AM
v-divider
.body-2.grey--text.mt-3 Pages created
.body-1: strong 0
.body-2.grey--text.mt-3 Comments posted
.body-1: strong 0
</
template
>
<
script
>
...
...
client/components/setup.vue
View file @
416755f1
...
...
@@ -209,8 +209,12 @@
v-flex.pr-3(xs6)
v-text-field(
ref='adminPassword',
counter='255'
v-model='conf.adminPassword',
label='Password',
:append-icon="pwdMode ? 'visibility' : 'visibility_off'"
:append-icon-cb="() => (pwdMode = !pwdMode)"
:type="pwdMode ? 'password' : 'text'"
hint='At least 8 characters long.',
v-validate='{ required: true, min: 8 }',
data-vv-name='adminPassword',
...
...
@@ -221,8 +225,12 @@
v-flex(xs6)
v-text-field(
ref='adminPasswordConfirm',
counter='255'
v-model='conf.adminPasswordConfirm',
label='Confirm Password',
:append-icon="pwdConfirmMode ? 'visibility' : 'visibility_off'"
:append-icon-cb="() => (pwdConfirmMode = !pwdConfirmMode)"
:type="pwdConfirmMode ? 'password' : 'text'"
hint='Verify your password again.',
v-validate='{ required: true, min: 8 }',
data-vv-name='adminPasswordConfirm',
...
...
@@ -339,7 +347,9 @@ export default {
title
:
siteConfig
.
title
||
'Wiki'
,
upgrade
:
false
,
upgMongo
:
'mongodb://'
}
},
pwdMode
:
true
,
pwdConfirmMode
:
true
}
},
methods
:
{
...
...
client/scss/app.scss
View file @
416755f1
...
...
@@ -15,6 +15,7 @@
// @import 'node_modules/diff2html/dist/diff2html.min';
@import
'pages/welcome'
;
@import
'pages/error'
;
@import
'layout/_rtl'
;
...
...
client/scss/pages/_error.scss
0 → 100644
View file @
416755f1
.app-error
{
background
:
linear-gradient
(
to
bottom
,
mc
(
'grey'
,
'900'
)
0%
,
mc
(
'grey'
,
'800'
)
100%
);
height
:
100%
;
display
:
flex
;
flex-direction
:
column
;
justify-content
:
center
;
align-items
:
center
;
color
:
mc
(
'grey'
,
'50'
);
img
{
width
:
250px
;
filter
:
grayscale
(
50%
)
brightness
(
120%
);
animation
:
errorlogo
5s
linear
infinite
;
margin-bottom
:
3rem
;
@include
until
(
$tablet
)
{
width
:
200px
;
}
}
@keyframes
errorlogo
{
0
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
);
}
10
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
)
invert
(
100%
);
}
15
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
)
invert
(
0%
);
}
30
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
);
}
32
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
2700deg
)
invert
(
100%
);
}
34
%
{
filter
:
blur
(
0
)
grayscale
(
100%
)
brightness
(
50%
)
hue-rotate
(
110deg
);
}
50
%
{
filter
:
blur
(
0
)
grayscale
(
100%
)
brightness
(
200%
)
hue-rotate
(
110deg
)
sepia
(
0%
);
}
55
%
{
filter
:
blur
(
0
)
grayscale
(
100%
)
brightness
(
100%
)
hue-rotate
(
110deg
)
sepia
(
100%
);
}
60
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
)
sepia
(
0%
);
}
90
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
);
}
95
%
{
filter
:
blur
(
5px
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
720deg
);
}
100
%
{
filter
:
blur
(
0
)
grayscale
(
50%
)
brightness
(
200%
)
hue-rotate
(
110deg
)
invert
(
100%
);
}
}
code
{
color
:
mc
(
'grey'
,
'500'
);
font-size
:
.8rem
;
}
}
config.sample.yml
View file @
416755f1
...
...
@@ -5,7 +5,7 @@
# https://docs.requarks.io/wiki/install
# ---------------------------------------------------------------------
# Port the
main
server should listen to
# Port the server should listen to
# ---------------------------------------------------------------------
port
:
80
...
...
@@ -55,27 +55,3 @@ redis:
# Possible values: error, warn, info (default), verbose, debug, silly
logLevel
:
info
# ---------------------------------------------------------------------
# Configuration Mode
# ---------------------------------------------------------------------
# Possible values: auto (default), file, setup
configMode
:
auto
# ---------------------------------------------------------------------
# Background Workers
# ---------------------------------------------------------------------
# Leave 0 for auto based on CPU cores
workers
:
0
# ---------------------------------------------------------------------
# High Availability
# ---------------------------------------------------------------------
# Read the docs BEFORE changing these settings!
ha
:
node
:
primary
uid
:
master
readonly
:
false
server/app/data.yml
View file @
416755f1
...
...
@@ -23,12 +23,6 @@ defaults:
port
:
6379
db
:
0
password
:
null
configMode
:
auto
workers
:
0
ha
:
node
:
primary
uid
:
master
readonly
:
false
# DB defaults
auth
:
public
:
false
...
...
@@ -36,8 +30,6 @@ defaults:
local
:
isEnabled
:
true
allowSelfRegister
:
false
git
:
enabled
:
false
logging
:
telemetry
:
false
loggers
:
...
...
@@ -48,6 +40,7 @@ defaults:
rtl
:
false
title
:
Wiki.js
# System defaults
setup
:
false
cors
:
credentials
:
true
maxAge
:
600
...
...
server/core/auth.js
View file @
416755f1
/* global WIKI */
const
_
=
require
(
'lodash'
)
const
passport
=
require
(
'passport'
)
const
fs
=
require
(
'fs-extra'
)
const
_
=
require
(
'lodash'
)
const
path
=
require
(
'path'
)
const
autoload
=
require
(
'auto-load'
)
/* global WIKI */
module
.
exports
=
{
strategies
:
{},
...
...
@@ -30,34 +29,39 @@ module.exports = {
})
})
// Load authentication strategies
const
modules
=
_
.
values
(
autoload
(
path
.
join
(
WIKI
.
SERVERPATH
,
'modules/authentication'
)))
_
.
forEach
(
modules
,
(
strategy
)
=>
{
const
strategyConfig
=
_
.
get
(
WIKI
.
config
.
auth
.
strategies
,
strategy
.
key
,
{
isEnabled
:
false
})
strategyConfig
.
callbackURL
=
`
${
WIKI
.
config
.
site
.
host
}${
WIKI
.
config
.
site
.
path
}
login/
${
strategy
.
key
}
/callback`
strategy
.
config
=
strategyConfig
if
(
strategyConfig
.
isEnabled
)
{
try
{
strategy
.
init
(
passport
,
strategyConfig
)
}
catch
(
err
)
{
WIKI
.
logger
.
error
(
`Authentication Provider
${
strategy
.
title
}
: [ FAILED ]`
)
WIKI
.
logger
.
error
(
err
)
}
}
fs
.
readFile
(
path
.
join
(
WIKI
.
ROOTPATH
,
`assets/svg/auth-icon-
${
strategy
.
key
}
.svg`
),
'utf8'
).
then
(
iconData
=>
{
strategy
.
icon
=
iconData
}).
catch
(
err
=>
{
if
(
err
.
code
===
'ENOENT'
)
{
strategy
.
icon
=
'[missing icon]'
}
else
{
WIKI
.
logger
.
warn
(
err
)
}
})
this
.
strategies
[
strategy
.
key
]
=
strategy
WIKI
.
logger
.
info
(
`Authentication Provider
${
strategy
.
title
}
: [ OK ]`
)
})
return
this
},
async
activateStrategies
()
{
try
{
// Unload any active strategies
WIKI
.
auth
.
strategies
=
[]
const
currentStrategies
=
_
.
keys
(
passport
.
_strategies
)
_
.
pull
(
currentStrategies
,
'session'
)
_
.
forEach
(
currentStrategies
,
stg
=>
{
passport
.
unuse
(
stg
)
})
// Load enable strategies
const
enabledStrategies
=
await
WIKI
.
db
.
authentication
.
getEnabledStrategies
()
for
(
let
idx
in
enabledStrategies
)
{
const
stg
=
enabledStrategies
[
idx
]
const
strategy
=
require
(
`../modules/authentication/
${
stg
.
key
}
`
)
stg
.
config
.
callbackURL
=
`
${
WIKI
.
config
.
site
.
host
}
/login/
${
stg
.
key
}
/callback`
strategy
.
init
(
passport
,
stg
.
config
)
fs
.
readFile
(
path
.
join
(
WIKI
.
ROOTPATH
,
`assets/svg/auth-icon-
${
strategy
.
key
}
.svg`
),
'utf8'
).
then
(
iconData
=>
{
strategy
.
icon
=
iconData
}).
catch
(
err
=>
{
if
(
err
.
code
===
'ENOENT'
)
{
strategy
.
icon
=
'[missing icon]'
}
else
{
WIKI
.
logger
.
warn
(
err
)
}
})
WIKI
.
auth
.
strategies
[
stg
.
key
]
=
strategy
WIKI
.
logger
.
info
(
`Authentication Strategy
${
stg
.
title
}
: [ OK ]`
)
}
}
catch
(
err
)
{
WIKI
.
logger
.
error
(
`Authentication Strategy: [ FAILED ]`
)
WIKI
.
logger
.
error
(
err
)
}
}
}
server/core/config.js
View file @
416755f1
...
...
@@ -50,45 +50,32 @@ module.exports = {
/**
* Load config from DB
*
* @param {Array} subsets Array of subsets to load
* @returns Promise
*/
async
loadFromDb
(
subsets
)
{
if
(
!
_
.
isArray
(
subsets
)
||
subsets
.
length
===
0
)
{
subsets
=
WIKI
.
data
.
configNamespaces
}
let
results
=
await
WIKI
.
db
.
settings
.
query
().
select
([
'key'
,
'value'
]).
whereIn
(
'key'
,
subsets
)
if
(
_
.
isArray
(
results
)
&&
results
.
length
===
subsets
.
length
)
{
results
.
forEach
(
result
=>
{
WIKI
.
config
[
result
.
key
]
=
result
.
value
})
return
true
async
loadFromDb
()
{
let
conf
=
await
WIKI
.
db
.
settings
.
getConfig
()
if
(
conf
)
{
WIKI
.
config
=
_
.
defaultsDeep
(
conf
,
WIKI
.
config
)
}
else
{
WIKI
.
logger
.
warn
(
'DB Configuration is empty or incomplete.'
)
return
fals
e
WIKI
.
logger
.
warn
(
'DB Configuration is empty or incomplete.
Switching to Setup mode...
'
)
WIKI
.
config
.
setup
=
tru
e
}
},
/**
* Save config to DB
*
* @param {Array}
subsets Array of subset
s to save
* @param {Array}
keys Array of key
s to save
* @returns Promise
*/
async
saveToDb
(
subsets
)
{
if
(
!
_
.
isArray
(
subsets
)
||
subsets
.
length
===
0
)
{
subsets
=
WIKI
.
data
.
configNamespaces
}
async
saveToDb
(
keys
)
{
let
trx
=
await
WIKI
.
db
.
Objection
.
transaction
.
start
(
WIKI
.
db
.
knex
)
try
{
for
(
let
set
of
subsets
)
{
console
.
info
(
set
)
await
WIKI
.
db
.
settings
.
query
(
trx
).
patch
({
value
:
_
.
get
(
WIKI
.
config
,
set
,
{})
}).
where
(
'key'
,
set
)
for
(
let
key
of
keys
)
{
const
value
=
_
.
get
(
WIKI
.
config
,
key
,
null
)
let
affectedRows
=
await
WIKI
.
db
.
settings
.
query
(
trx
).
patch
({
value
}).
where
(
'key'
,
key
)
if
(
affectedRows
===
0
&&
value
)
{
await
WIKI
.
db
.
settings
.
query
(
trx
).
insert
({
key
,
value
})
}
}
await
trx
.
commit
()
}
catch
(
err
)
{
...
...
server/core/db.js
View file @
416755f1
...
...
@@ -53,6 +53,20 @@ module.exports = {
client
:
dbClient
,
useNullAsDefault
:
true
,
connection
:
dbConfig
,
pool
:
{
async
afterCreate
(
conn
,
done
)
{
// -> Set Connection App Name
switch
(
WIKI
.
config
.
db
.
type
)
{
case
'postgres'
:
await
conn
.
query
(
`set application_name = 'Wiki.js'`
)
done
()
break
default
:
done
()
break
}
}
},
debug
:
WIKI
.
IS_DEBUG
})
...
...
@@ -71,21 +85,13 @@ module.exports = {
directory
:
path
.
join
(
WIKI
.
SERVERPATH
,
'db/migrations'
),
tableName
:
'migrations'
})
},
// -> Set Connection App Name
async
setAppName
()
{
switch
(
WIKI
.
config
.
db
.
type
)
{
case
'postgres'
:
return
self
.
knex
.
raw
(
`set application_name = 'Wiki.js'`
)
}
}
}
let
initTasksQueue
=
(
WIKI
.
IS_MASTER
)
?
[
initTasks
.
syncSchemas
,
initTasks
.
setAppName
initTasks
.
syncSchemas
]
:
[
initTasks
.
setAppName
()
=>
{
return
Promise
.
resolve
()
}
]
// Perform init tasks
...
...
server/core/kernel.js
View file @
416755f1
const
_
=
require
(
'lodash'
)
const
cluster
=
require
(
'cluster'
)
const
Promise
=
require
(
'bluebird'
)
/* global WIKI */
module
.
exports
=
{
numWorkers
:
1
,
workers
:
[],
init
()
{
if
(
cluster
.
isMaster
)
{
WIKI
.
logger
.
info
(
'======================================='
)
WIKI
.
logger
.
info
(
'= Wiki.js ============================='
)
WIKI
.
logger
.
info
(
'======================================='
)
async
init
()
{
WIKI
.
logger
.
info
(
'======================================='
)
WIKI
.
logger
.
info
(
'= Wiki.js ============================='
)
WIKI
.
logger
.
info
(
'======================================='
)
WIKI
.
redis
=
require
(
'./redis'
).
init
()
WIKI
.
queue
=
require
(
'./queue'
).
init
()
WIKI
.
db
=
require
(
'./db'
).
init
()
WIKI
.
redis
=
require
(
'./redis'
).
init
()
WIKI
.
queue
=
require
(
'./queue'
).
init
()
this
.
setWorkerLimit
()
this
.
bootMaster
()
}
else
{
this
.
bootWorker
()
}
await
this
.
preBootMaster
()
this
.
bootMaster
()
},
/**
* Pre-Master Boot Sequence
*/
preBootMaster
()
{
return
Promise
.
mapSeries
([
()
=>
{
return
WIKI
.
db
.
onReady
},
()
=>
{
return
WIKI
.
configSvc
.
loadFromDb
()
},
()
=>
{
return
WIKI
.
queue
.
clean
()
}
],
fn
=>
{
return
fn
()
})
async
preBootMaster
()
{
try
{
await
WIKI
.
db
.
onReady
await
WIKI
.
configSvc
.
loadFromDb
()
await
WIKI
.
queue
.
clean
()
}
catch
(
err
)
{
WIKI
.
logger
.
error
(
err
)
process
.
exit
(
1
)
}
},
/**
* Boot Master Process
*/
bootMaster
()
{
this
.
preBootMaster
().
then
(
sequenceResults
=>
{
if
(
_
.
every
(
sequenceResults
,
rs
=>
rs
===
true
)
&&
WIKI
.
config
.
configMode
!==
'setup'
)
{
this
.
postBootMaster
()
}
else
{
WIKI
.
logger
.
info
(
'Starting configuration manager...'
)
async
bootMaster
()
{
try
{
if
(
WIKI
.
config
.
setup
)
{
WIKI
.
logger
.
info
(
'Starting setup wizard...'
)
require
(
'../setup'
)()
}
else
{
await
require
(
'../master'
)()
this
.
postBootMaster
()
}
return
true
}).
catch
(
err
=>
{
}
catch
(
err
)
{
WIKI
.
logger
.
error
(
err
)
process
.
exit
(
1
)
}
)
}
},
/**
* Post-Master Boot Sequence
*/
async
postBootMaster
()
{
await
require
(
'../master'
)()
WIKI
.
queue
.
start
()
cluster
.
on
(
'exit'
,
(
worker
,
code
,
signal
)
=>
{
if
(
!
global
.
DEV
)
{
WIKI
.
logger
.
info
(
`Background Worker #
${
worker
.
id
}
was terminated.`
)
}
})
},
/**
* Boot Worker Process
*/
bootWorker
()
{
WIKI
.
logger
.
info
(
`Background Worker #
${
cluster
.
worker
.
id
}
is initializing...`
)
require
(
'../worker'
)
},
/**
* Spawn new Worker process
*/
spawnWorker
()
{
this
.
workers
.
push
(
cluster
.
fork
())
},
/**
* Set Worker count based on config + system capabilities
*/
setWorkerLimit
()
{
const
numCPUs
=
require
(
'os'
).
cpus
().
length
this
.
numWorkers
=
(
WIKI
.
config
.
workers
>
0
)
?
WIKI
.
config
.
workers
:
numCPUs
if
(
this
.
numWorkers
>
numCPUs
)
{
this
.
numWorkers
=
numCPUs
}
await
WIKI
.
auth
.
activateStrategies
()
await
WIKI
.
queue
.
start
()
}
}
server/core/localization.js
View file @
416755f1
...
...
@@ -17,7 +17,7 @@ module.exports = {
ns
:
this
.
namespaces
,
defaultNS
:
'common'
,
saveMissing
:
false
,
lng
:
WIKI
.
config
.
site
.
lang
,
lng
:
WIKI
.
config
.
lang
,
fallbackLng
:
'en'
})
...
...
@@ -31,7 +31,7 @@ module.exports = {
}
// Load current language
this
.
loadLocale
(
WIKI
.
config
.
site
.
lang
,
{
silent
:
true
})
this
.
loadLocale
(
WIKI
.
config
.
lang
,
{
silent
:
true
})
return
this
},
...
...
@@ -55,6 +55,7 @@ module.exports = {
const
res
=
await
WIKI
.
db
.
locales
.
query
().
findOne
(
'code'
,
locale
)
if
(
res
)
{
if
(
_
.
isPlainObject
(
res
.
strings
))
{
console
.
info
(
res
.
strings
)
_
.
forOwn
(
res
.
strings
,
(
data
,
ns
)
=>
{
this
.
namespaces
.
push
(
ns
)
this
.
engine
.
addResourceBundle
(
locale
,
ns
,
data
,
true
,
true
)
...
...
server/db/migrations/2.0.0.js
View file @
416755f1
...
...
@@ -23,6 +23,15 @@ exports.up = knex => {
table
.
string
(
'slug'
).
notNullable
()
table
.
integer
(
'parentId'
).
unsigned
().
references
(
'id'
).
inTable
(
'assetFolders'
)
})
// AUTHENTICATION ----------------------
.
createTable
(
'authentication'
,
table
=>
{
table
.
increments
(
'id'
).
primary
()
table
.
string
(
'key'
).
notNullable
().
unique
()
table
.
string
(
'title'
).
notNullable
()
table
.
boolean
(
'isEnabled'
).
notNullable
().
defaultTo
(
false
)
table
.
boolean
(
'useForm'
).
notNullable
().
defaultTo
(
false
)
table
.
jsonb
(
'config'
).
notNullable
()
})
// COMMENTS ----------------------------
.
createTable
(
'comments'
,
table
=>
{
table
.
increments
(
'id'
).
primary
()
...
...
@@ -30,6 +39,14 @@ exports.up = knex => {
table
.
string
(
'createdAt'
).
notNullable
()
table
.
string
(
'updatedAt'
).
notNullable
()
})
// EDITORS -----------------------------
.
createTable
(
'editors'
,
table
=>
{
table
.
increments
(
'id'
).
primary
()
table
.
string
(
'key'
).
notNullable
().
unique
()
table
.
string
(
'title'
).
notNullable
()
table
.
boolean
(
'isEnabled'
).
notNullable
().
defaultTo
(
false
)
table
.
jsonb
(
'config'
)
})
// GROUPS ------------------------------
.
createTable
(
'groups'
,
table
=>
{
table
.
increments
(
'id'
).
primary
()
...
...
@@ -54,6 +71,7 @@ exports.up = knex => {
table
.
string
(
'path'
).
notNullable
()
table
.
string
(
'title'
).
notNullable
()
table
.
string
(
'description'
)
table
.
boolean
(
'isPrivate'
).
notNullable
().
defaultTo
(
false
)
table
.
boolean
(
'isPublished'
).
notNullable
().
defaultTo
(
false
)
table
.
string
(
'publishStartDate'
)
table
.
string
(
'publishEndDate'
)
...
...
@@ -66,9 +84,16 @@ exports.up = knex => {
table
.
increments
(
'id'
).
primary
()
table
.
string
(
'key'
).
notNullable
().
unique
()
table
.
jsonb
(
'value'
)
table
.
string
(
'createdAt'
).
notNullable
()
table
.
string
(
'updatedAt'
).
notNullable
()
})
// STORAGE -----------------------------
.
createTable
(
'storage'
,
table
=>
{
table
.
increments
(
'id'
).
primary
()
table
.
string
(
'key'
).
notNullable
().
unique
()
table
.
string
(
'title'
).
notNullable
()
table
.
boolean
(
'isEnabled'
).
notNullable
().
defaultTo
(
false
)
table
.
jsonb
(
'config'
)
})
// TAGS --------------------------------
.
createTable
(
'tags'
,
table
=>
{
table
.
increments
(
'id'
).
primary
()
...
...
@@ -82,16 +107,17 @@ exports.up = knex => {
table
.
increments
(
'id'
).
primary
()
table
.
string
(
'email'
).
notNullable
()
table
.
string
(
'name'
).
notNullable
()
table
.
string
(
'provider'
).
notNullable
().
defaultTo
(
'local'
)
table
.
string
(
'providerId'
)
table
.
string
(
'password'
)
table
.
boolean
(
'tfaIsActive'
).
notNullable
().
defaultTo
(
false
)
table
.
string
(
'tfaSecret'
)
table
.
enum
(
'role'
,
[
'admin'
,
'guest'
,
'user'
]).
notNullable
().
defaultTo
(
'guest'
)
table
.
string
(
'jobTitle'
).
defaultTo
(
''
)
table
.
string
(
'location'
).
defaultTo
(
''
)
table
.
string
(
'pictureUrl'
)
table
.
string
(
'timezone'
).
notNullable
().
defaultTo
(
'America/New_York'
)
table
.
string
(
'createdAt'
).
notNullable
()
table
.
string
(
'updatedAt'
).
notNullable
()
table
.
unique
([
'provider'
,
'email'
])
})
// =====================================
// RELATION TABLES
...
...
@@ -120,11 +146,16 @@ exports.up = knex => {
table
.
integer
(
'authorId'
).
unsigned
().
references
(
'id'
).
inTable
(
'users'
)
})
.
table
(
'pages'
,
table
=>
{
table
.
string
(
'editor'
).
references
(
'key'
).
inTable
(
'editors'
)
table
.
string
(
'locale'
,
2
).
references
(
'code'
).
inTable
(
'locales'
)
table
.
integer
(
'authorId'
).
unsigned
().
references
(
'id'
).
inTable
(
'users'
)
})
.
table
(
'users'
,
table
=>
{
table
.
string
(
'locale'
,
2
).
references
(
'code'
).
inTable
(
'locales'
)
table
.
string
(
'provider'
).
references
(
'key'
).
inTable
(
'authentication'
).
notNullable
().
defaultTo
(
'local'
)
table
.
string
(
'locale'
,
2
).
references
(
'code'
).
inTable
(
'locales'
).
notNullable
().
defaultTo
(
'en'
)
table
.
string
(
'defaultEditor'
).
references
(
'key'
).
inTable
(
'editors'
).
notNullable
().
defaultTo
(
'markdown'
)
table
.
unique
([
'provider'
,
'email'
])
})
}
...
...
server/db/models/authentication.js
0 → 100644
View file @
416755f1
const
Model
=
require
(
'objection'
).
Model
const
autoload
=
require
(
'auto-load'
)
const
path
=
require
(
'path'
)
const
_
=
require
(
'lodash'
)
/* global WIKI */
/**
* Authentication model
*/
module
.
exports
=
class
Authentication
extends
Model
{
static
get
tableName
()
{
return
'authentication'
}
static
get
jsonSchema
()
{
return
{
type
:
'object'
,
required
:
[
'key'
,
'title'
,
'isEnabled'
,
'useForm'
],
properties
:
{
id
:
{
type
:
'integer'
},
key
:
{
type
:
'string'
},
title
:
{
type
:
'string'
},
isEnabled
:
{
type
:
'boolean'
},
useForm
:
{
type
:
'boolean'
},
config
:
{
type
:
'object'
}
}
}
}
static
async
getEnabledStrategies
()
{
return
WIKI
.
db
.
authentication
.
query
().
where
({
isEnabled
:
true
})
}
static
async
refreshStrategiesFromDisk
()
{
try
{
const
dbStrategies
=
await
WIKI
.
db
.
authentication
.
query
()
const
diskStrategies
=
autoload
(
path
.
join
(
WIKI
.
SERVERPATH
,
'modules/authentication'
))
let
newStrategies
=
[]
_
.
forOwn
(
diskStrategies
,
(
strategy
,
strategyKey
)
=>
{
if
(
!
_
.
some
(
dbStrategies
,
[
'key'
,
strategy
.
key
]))
{
newStrategies
.
push
({
key
:
strategy
.
key
,
title
:
strategy
.
title
,
isEnabled
:
false
,
useForm
:
strategy
.
useForm
,
config
:
_
.
reduce
(
strategy
.
props
,
(
result
,
value
,
key
)
=>
{
_
.
set
(
result
,
value
,
''
)
return
result
},
{})
})
}
})
if
(
newStrategies
.
length
>
0
)
{
await
WIKI
.
db
.
authentication
.
query
().
insert
(
newStrategies
)
WIKI
.
logger
.
info
(
`Loaded
${
newStrategies
.
length
}
new authentication strategies: [ OK ]`
)
}
else
{
WIKI
.
logger
.
info
(
`No new authentication strategies found: [ SKIPPED ]`
)
}
}
catch
(
err
)
{
WIKI
.
logger
.
error
(
`Failed to scan or load new authentication providers: [ FAILED ]`
)
WIKI
.
logger
.
error
(
err
)
}
}
}
server/db/models/editors.js
0 → 100644
View file @
416755f1
const
Model
=
require
(
'objection'
).
Model
const
autoload
=
require
(
'auto-load'
)
const
path
=
require
(
'path'
)
const
_
=
require
(
'lodash'
)
/* global WIKI */
/**
* Editor model
*/
module
.
exports
=
class
Editor
extends
Model
{
static
get
tableName
()
{
return
'editors'
}
static
get
jsonSchema
()
{
return
{
type
:
'object'
,
required
:
[
'key'
,
'title'
,
'isEnabled'
],
properties
:
{
id
:
{
type
:
'integer'
},
key
:
{
type
:
'string'
},
title
:
{
type
:
'string'
},
isEnabled
:
{
type
:
'boolean'
},
config
:
{
type
:
'object'
}
}
}
}
static
async
getEnabledEditors
()
{
return
WIKI
.
db
.
editors
.
query
().
where
({
isEnabled
:
true
})
}
static
async
refreshEditorsFromDisk
()
{
try
{
const
dbEditors
=
await
WIKI
.
db
.
editors
.
query
()
const
diskEditors
=
autoload
(
path
.
join
(
WIKI
.
SERVERPATH
,
'modules/editor'
))
let
newEditors
=
[]
_
.
forOwn
(
diskEditors
,
(
strategy
,
strategyKey
)
=>
{
if
(
!
_
.
some
(
dbEditors
,
[
'key'
,
strategy
.
key
]))
{
newEditors
.
push
({
key
:
strategy
.
key
,
title
:
strategy
.
title
,
isEnabled
:
false
,
config
:
_
.
reduce
(
strategy
.
props
,
(
result
,
value
,
key
)
=>
{
_
.
set
(
result
,
value
,
''
)
return
result
},
{})
})
}
})
if
(
newEditors
.
length
>
0
)
{
await
WIKI
.
db
.
editors
.
query
().
insert
(
newEditors
)
WIKI
.
logger
.
info
(
`Loaded
${
newEditors
.
length
}
new editors: [ OK ]`
)
}
else
{
WIKI
.
logger
.
info
(
`No new editors found: [ SKIPPED ]`
)
}
}
catch
(
err
)
{
WIKI
.
logger
.
error
(
`Failed to scan or load new editors: [ FAILED ]`
)
WIKI
.
logger
.
error
(
err
)
}
}
}
server/db/models/settings.js
View file @
416755f1
const
Model
=
require
(
'objection'
).
Model
const
_
=
require
(
'lodash'
)
/* global WIKI */
/**
* Settings model
*/
module
.
exports
=
class
User
extends
Model
{
module
.
exports
=
class
Setting
extends
Model
{
static
get
tableName
()
{
return
'settings'
}
static
get
jsonSchema
()
{
...
...
@@ -25,7 +28,18 @@ module.exports = class User extends Model {
this
.
updatedAt
=
new
Date
().
toISOString
()
}
$beforeInsert
()
{
this
.
createdAt
=
new
Date
().
toISOString
()
this
.
updatedAt
=
new
Date
().
toISOString
()
}
static
async
getConfig
()
{
const
settings
=
await
WIKI
.
db
.
settings
.
query
()
if
(
settings
.
length
>
0
)
{
return
_
.
reduce
(
settings
,
(
res
,
val
,
key
)
=>
{
_
.
set
(
res
,
val
.
key
,
(
val
.
value
.
v
)
?
val
.
value
.
v
:
val
.
value
)
return
res
},
{})
}
else
{
return
false
}
}
}
server/db/models/users.js
View file @
416755f1
...
...
@@ -30,6 +30,9 @@ module.exports = class User extends Model {
tfaIsActive
:
{
type
:
'boolean'
,
default
:
false
},
tfaSecret
:
{
type
:
'string'
},
locale
:
{
type
:
'string'
},
jobTitle
:
{
type
:
'string'
},
location
:
{
type
:
'string'
},
pictureUrl
:
{
type
:
'string'
},
createdAt
:
{
type
:
'string'
},
updatedAt
:
{
type
:
'string'
}
}
...
...
server/index.js
View file @
416755f1
...
...
@@ -4,11 +4,10 @@
// ===========================================
const
path
=
require
(
'path'
)
const
cluster
=
require
(
'cluster'
)
let
WIKI
=
{
IS_DEBUG
:
process
.
env
.
NODE_ENV
===
'development'
,
IS_MASTER
:
cluster
.
isMaster
,
IS_MASTER
:
true
,
ROOTPATH
:
process
.
cwd
(),
SERVERPATH
:
path
.
join
(
process
.
cwd
(),
'server'
),
Error
:
require
(
'./helpers/error'
),
...
...
@@ -32,19 +31,15 @@ WIKI.logger = require('./core/logger').init('MASTER')
WIKI
.
telemetry
=
require
(
'./core/telemetry'
).
init
()
process
.
on
(
'unhandledRejection'
,
(
err
)
=>
{
WIKI
.
logger
.
warn
(
err
)
WIKI
.
telemetry
.
sendError
(
err
)
})
process
.
on
(
'uncaughtException'
,
(
err
)
=>
{
WIKI
.
logger
.
warn
(
err
)
WIKI
.
telemetry
.
sendError
(
err
)
})
// ----------------------------------------
// Init DB
// ----------------------------------------
WIKI
.
db
=
require
(
'./core/db'
).
init
()
// ----------------------------------------
// Start Kernel
// ----------------------------------------
...
...
server/jobs/fetch-graph-locale.js
View file @
416755f1
...
...
@@ -7,14 +7,15 @@ const { createApolloFetch } = require('apollo-fetch')
WIKI
.
redis
=
require
(
'../core/redis'
).
init
()
WIKI
.
db
=
require
(
'../core/db'
).
init
()
const
apollo
=
createApolloFetch
({
uri
:
'https://graph.requarks.io'
})
module
.
exports
=
async
(
job
)
=>
{
WIKI
.
logger
.
info
(
`Fetching locale
${
job
.
data
.
locale
}
from Graph endpoint...`
)
try
{
await
WIKI
.
configSvc
.
loadFromDb
()
const
apollo
=
createApolloFetch
({
uri
:
WIKI
.
config
.
graphEndpoint
})
const
respStrings
=
await
apollo
({
query
:
`query ($code: String!) {
localization {
...
...
server/jobs/sync-graph-locales.js
View file @
416755f1
...
...
@@ -7,15 +7,14 @@ const { createApolloFetch } = require('apollo-fetch')
WIKI
.
redis
=
require
(
'../core/redis'
).
init
()
WIKI
.
db
=
require
(
'../core/db'
).
init
()
const
apollo
=
createApolloFetch
({
uri
:
'https://graph.requarks.io'
})
module
.
exports
=
async
(
job
)
=>
{
WIKI
.
logger
.
info
(
'Syncing locales with Graph endpoint...'
)
try
{
await
WIKI
.
configSvc
.
loadFromDb
([
'site'
])
await
WIKI
.
configSvc
.
loadFromDb
()
const
apollo
=
createApolloFetch
({
uri
:
WIKI
.
config
.
graphEndpoint
})
// -> Fetch locales list
...
...
server/master.js
View file @
416755f1
...
...
@@ -75,7 +75,7 @@ module.exports = async () => {
app
.
use
(
session
({
name
:
'wikijs.sid'
,
store
:
sessionStore
,
secret
:
WIKI
.
config
.
s
ite
.
s
essionSecret
,
secret
:
WIKI
.
config
.
sessionSecret
,
resave
:
false
,
saveUninitialized
:
false
}))
...
...
server/modules/editor/markdown.js
0 → 100644
View file @
416755f1
// ------------------------------------
// Markdown Editor (default)
// ------------------------------------
module
.
exports
=
{
key
:
'markdown'
,
title
:
'Markdown (default)'
,
props
:
[],
init
(
conf
)
{}
}
server/setup.js
View file @
416755f1
...
...
@@ -250,8 +250,6 @@ module.exports = () => {
app
.
post
(
'/finalize'
,
async
(
req
,
res
)
=>
{
WIKI
.
telemetry
.
sendEvent
(
'setup'
,
'finalize'
)
console
.
error
(
'DUDE'
)
try
{
// Upgrade from WIKI.js 1.x?
if
(
req
.
body
.
upgrade
)
{
...
...
@@ -272,41 +270,31 @@ module.exports = () => {
confRaw
=
yaml
.
safeDump
(
conf
)
await
fs
.
writeFileAsync
(
path
.
join
(
WIKI
.
ROOTPATH
,
'config.yml'
),
confRaw
)
_
.
set
(
WIKI
.
config
,
'port'
,
req
.
body
.
port
)
// Set config
_
.
set
(
WIKI
.
config
,
'defaultEditor'
,
true
)
_
.
set
(
WIKI
.
config
,
'graphEndpoint'
,
'https://graph.requarks.io'
)
_
.
set
(
WIKI
.
config
,
'lang'
,
'en'
)
_
.
set
(
WIKI
.
config
,
'langAutoUpdate'
,
true
)
_
.
set
(
WIKI
.
config
,
'langRTL'
,
false
)
_
.
set
(
WIKI
.
config
,
'paths.content'
,
req
.
body
.
pathContent
)
// Populate config namespaces
WIKI
.
config
.
auth
=
WIKI
.
config
.
auth
||
{}
WIKI
.
config
.
features
=
WIKI
.
config
.
features
||
{}
WIKI
.
config
.
logging
=
WIKI
.
config
.
logging
||
{}
WIKI
.
config
.
site
=
WIKI
.
config
.
site
||
{}
WIKI
.
config
.
theme
=
WIKI
.
config
.
theme
||
{}
WIKI
.
config
.
uploads
=
WIKI
.
config
.
uploads
||
{}
// Site namespace
_
.
set
(
WIKI
.
config
.
site
,
'title'
,
req
.
body
.
title
)
_
.
set
(
WIKI
.
config
.
site
,
'lang'
,
'en'
)
_
.
set
(
WIKI
.
config
.
site
,
'langAutoUpdate'
,
true
)
_
.
set
(
WIKI
.
config
.
site
,
'rtl'
,
false
)
_
.
set
(
WIKI
.
config
.
site
,
'sessionSecret'
,
(
await
crypto
.
randomBytesAsync
(
32
)).
toString
(
'hex'
))
// Auth namespace
_
.
set
(
WIKI
.
config
.
auth
,
'public'
,
req
.
body
.
public
===
'true'
)
_
.
set
(
WIKI
.
config
.
auth
,
'strategies.local.isEnabled'
,
true
)
_
.
set
(
WIKI
.
config
.
auth
,
'strategies.local.allowSelfRegister'
,
req
.
body
.
selfRegister
===
'true'
)
// Logging namespace
WIKI
.
config
.
logging
.
telemetry
=
(
req
.
body
.
telemetry
===
'true'
)
_
.
set
(
WIKI
.
config
,
'port'
,
req
.
body
.
port
)
_
.
set
(
WIKI
.
config
,
'public'
,
req
.
body
.
public
===
'true'
)
_
.
set
(
WIKI
.
config
,
'sessionSecret'
,
(
await
crypto
.
randomBytesAsync
(
32
)).
toString
(
'hex'
))
_
.
set
(
WIKI
.
config
,
'telemetry'
,
req
.
body
.
telemetry
===
'true'
)
_
.
set
(
WIKI
.
config
,
'title'
,
req
.
body
.
title
)
// Save config to DB
WIKI
.
logger
.
info
(
'Persisting config to DB...'
)
await
WIKI
.
db
.
settings
.
query
().
insert
([
{
key
:
'auth'
,
value
:
WIKI
.
config
.
auth
},
{
key
:
'features'
,
value
:
WIKI
.
config
.
features
},
{
key
:
'logging'
,
value
:
WIKI
.
config
.
logging
},
{
key
:
'site'
,
value
:
WIKI
.
config
.
site
},
{
key
:
'theme'
,
value
:
WIKI
.
config
.
theme
},
{
key
:
'uploads'
,
value
:
WIKI
.
config
.
uploads
}
{
key
:
'defaultEditor'
,
value
:
{
v
:
WIKI
.
config
.
defaultEditor
}
},
{
key
:
'graphEndpoint'
,
value
:
{
v
:
WIKI
.
config
.
graphEndpoint
}
},
{
key
:
'lang'
,
value
:
{
v
:
WIKI
.
config
.
lang
}
},
{
key
:
'langAutoUpdate'
,
value
:
{
v
:
WIKI
.
config
.
langAutoUpdate
}
},
{
key
:
'langRTL'
,
value
:
{
v
:
WIKI
.
config
.
langRTL
}
},
{
key
:
'public'
,
value
:
{
v
:
WIKI
.
config
.
public
}
},
{
key
:
'sessionSecret'
,
value
:
{
v
:
WIKI
.
config
.
sessionSecret
}
},
{
key
:
'telemetry'
,
value
:
{
v
:
WIKI
.
config
.
telemetry
}
},
{
key
:
'title'
,
value
:
{
v
:
WIKI
.
config
.
title
}
}
])
// Create default locale
...
...
@@ -319,8 +307,20 @@ module.exports = () => {
nativeName
:
'English'
})
// Load authentication strategies + enable local
await
WIKI
.
db
.
authentication
.
refreshStrategiesFromDisk
()
await
WIKI
.
db
.
authentication
.
query
().
patch
({
isEnabled
:
true
}).
where
(
'key'
,
'local'
)
// Load editors + enable default
await
WIKI
.
db
.
editors
.
refreshEditorsFromDisk
()
await
WIKI
.
db
.
editors
.
query
().
patch
({
isEnabled
:
true
}).
where
(
'key'
,
'markdown'
)
// Create root administrator
WIKI
.
logger
.
info
(
'Creating root administrator...'
)
await
WIKI
.
db
.
users
.
query
().
delete
().
where
({
provider
:
'local'
,
email
:
req
.
body
.
adminEmail
})
await
WIKI
.
db
.
users
.
query
().
insert
({
email
:
req
.
body
.
adminEmail
,
provider
:
'local'
,
...
...
@@ -328,11 +328,12 @@ module.exports = () => {
name
:
'Administrator'
,
role
:
'admin'
,
locale
:
'en'
,
defaultEditor
:
'markdown'
,
tfaIsActive
:
false
})
// Create Guest account
WIKI
.
logger
.
info
(
'Creating
root administrator
...'
)
WIKI
.
logger
.
info
(
'Creating
guest account
...'
)
const
guestUsr
=
await
WIKI
.
db
.
users
.
query
().
findOne
({
provider
:
'local'
,
email
:
'guest@example.com'
...
...
@@ -345,6 +346,7 @@ module.exports = () => {
password
:
''
,
role
:
'guest'
,
locale
:
'en'
,
defaultEditor
:
'markdown'
,
tfaIsActive
:
false
})
}
...
...
@@ -356,6 +358,8 @@ module.exports = () => {
redirectPort
:
WIKI
.
config
.
port
}).
end
()
WIKI
.
config
.
setup
=
false
WIKI
.
logger
.
info
(
'Stopping Setup...'
)
WIKI
.
server
.
destroy
(()
=>
{
WIKI
.
logger
.
info
(
'Setup stopped. Starting Wiki.js...'
)
...
...
@@ -392,7 +396,7 @@ module.exports = () => {
// Start HTTP server
// ----------------------------------------
WIKI
.
logger
.
info
(
`HTTP Server on port:
${
WIKI
.
config
.
port
}
`
)
WIKI
.
logger
.
info
(
`HTTP Server on port:
[
${
WIKI
.
config
.
port
}
]
`
)
app
.
set
(
'port'
,
WIKI
.
config
.
port
)
WIKI
.
server
=
http
.
createServer
(
app
)
...
...
@@ -433,6 +437,6 @@ module.exports = () => {
})
WIKI
.
server
.
on
(
'listening'
,
()
=>
{
WIKI
.
logger
.
info
(
'HTTP Server:
RUNNING
'
)
WIKI
.
logger
.
info
(
'HTTP Server:
[ RUNNING ]
'
)
})
}
server/views/error.pug
View file @
416755f1
extends ./master.pug
block body
body(class='is-error')
.container
a(href='/'): img(src=config.site.path + '/images/logo.png')
h1= message
h2= t('errors:generic')
a.button.is-amber.is-inverted.is-featured(href=config.site.path+ '/')= t('errors:actions.gohome')
if error.stack
h3= t('errors:debugmsg')
pre: code #{error.stack}
#app.is-fullscreen
v-app(dark)
.app-error
v-container
.pt-5
v-layout(row)
v-flex(xs10)
a(href='/'): img(src='/svg/logo-wikijs.svg')
v-flex(xs2).text-xs-right
v-btn(href='/', depressed, color='red darken-3')
v-icon(left) home
span Home
v-alert(color='grey', outline, :value='true', icon='error')
strong.red--text.text--lighten-3 Oops, something went wrong...
.body-1.red--text.text--lighten-2= message
if error.stack
v-expansion-panel.mt-5
v-expansion-panel-content.red.darken-3(:value='true')
div(slot='header') View Debug Trace
v-card(color='grey darken-4')
v-card-text
pre: code #{error.stack}
wiki.js
View file @
416755f1
...
...
@@ -87,19 +87,26 @@ const init = {
const
devWatcher
=
chokidar
.
watch
([
'./server'
,
'!./server/views/master.pug'
])
],
{
ignoreInitial
:
true
,
atomic
:
400
})
devWatcher
.
on
(
'ready'
,
()
=>
{
devWatcher
.
on
(
'all'
,
()
=>
{
devWatcher
.
on
(
'all'
,
async
()
=>
{
console
.
warn
(
'--- >>>>>>>>>>>>>>>>>>>>>>>>>>>> ---'
)
console
.
warn
(
'--- Changes detected: Restarting ---'
)
console
.
warn
(
'--- <<<<<<<<<<<<<<<<<<<<<<<<<<<< ---'
)
console
.
warn
(
'--- Closing DB connections...'
)
await
global
.
WIKI
.
db
.
knex
.
destroy
()
console
.
warn
(
'--- Closing Redis connections...'
)
await
global
.
WIKI
.
redis
.
quit
()
console
.
warn
(
'--- Closing Server connections...'
)
global
.
WIKI
.
server
.
destroy
(()
=>
{
global
.
WIKI
=
{}
for
(
const
workerId
in
cluster
.
workers
)
{
cluster
.
workers
[
workerId
].
kill
()
}
Object
.
keys
(
require
.
cache
).
forEach
(
function
(
id
)
{
if
(
/
[/\\]
server
[/\\]
/
.
test
(
id
))
delete
require
.
cache
[
id
]
if
(
/
[/\\]
server
[/\\]
/
.
test
(
id
))
{
delete
require
.
cache
[
id
]
}
})
require
(
'./server'
)
})
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment