-
Notifications
You must be signed in to change notification settings - Fork 443
/
Copy pathindex.js
199 lines (182 loc) · 6.01 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// Modules
import path from 'node:path';
import express from 'express';
import logger from 'morgan';
import cookie_parser from 'cookie-parser';
import body_parser from 'body-parser';
import moment from 'moment';
import helmet from 'helmet';
import hogan from 'hogan-express';
import session from 'express-session';
import passport from 'passport';
import language_load from './core/language.js';
import mw_authenticate from './middleware/authenticate.mw.js';
import mw_always_auth from './middleware/always_authenticate.mw.js';
import mw_auth_readonly from './middleware/authenticate_read_access.mw.js';
import mw_error_handler from './middleware/error_handler.mw.js';
import mw_oauth2 from './middleware/oauth2.mw.js';
import route_login from './routes/login.route.js';
import route_login_page from './routes/login_page.route.js';
import route_logout from './routes/logout.route.js';
import route_page_edit from './routes/page.edit.route.js';
import route_page_delete from './routes/page.delete.route.js';
import route_page_create from './routes/page.create.route.js';
import route_category_create from './routes/category.create.route.js';
import route_search from './routes/search.route.js';
import route_home from './routes/home.route.js';
import route_wildcard from './routes/wildcard.route.js';
import route_sitemap from './routes/sitemap.route.js';
const __dirname = import.meta.dirname;
function initialize(config) {
// Load Translations
if (!config.locale) {
config.locale = 'en';
}
if (!config.lang) {
config.lang = language_load(config.locale);
}
// Content_Dir requires trailing slash
if (config.content_dir[config.content_dir.length - 1] !== path.sep) {
config.content_dir += path.sep;
}
// Load Middleware
const authenticate = mw_authenticate(config);
const always_authenticate = mw_always_auth(config);
const error_handler = mw_error_handler(config);
// Load Multiple-Use Pages
const route_search_init = route_search(config);
const route_home_init = route_home(config);
const route_wildcard_init = route_wildcard(config);
const route_sitemap_init = route_sitemap(config);
// New Express App
const app = express();
const router = express.Router();
// Set IP Address and Port
app.set('host', process.env.HOST || '127.0.0.1');
app.set('port', process.env.PORT || 3000);
// set locale as date and time format
moment.locale(config.locale);
// Setup Views
if (!config.theme_dir) {
config.theme_dir = path.join(__dirname, '..', 'themes');
}
if (!config.theme_name) {
config.theme_name = 'default';
}
if (!config.public_dir) {
config.public_dir = path.join(
config.theme_dir,
config.theme_name,
'public',
);
}
app.set('views', path.join(config.theme_dir, config.theme_name, 'templates'));
app.set('layout', 'layout');
app.set('view engine', 'html');
app.enable('view cache');
app.engine('html', hogan);
// Setup Express
app.use(logger('dev'));
app.use(helmet({
// TODO: Refine
contentSecurityPolicy: false,
}));
app.use(body_parser.json());
app.use(body_parser.urlencoded({ extended: false }));
app.use(cookie_parser());
app.use(express.static(config.public_dir));
if (config.theme_dir !== path.join(__dirname, '..', 'themes')) {
router.use(
express.static(path.join(config.theme_dir, config.theme_name, 'public')),
);
}
router.use(
config.image_url,
express.static(path.normalize(config.content_dir + config.image_url)),
);
router.use(
'/translations',
express.static(path.normalize(path.join(__dirname, 'translations'))),
);
// HTTP Authentication
if (
config.authentication === true ||
config.authentication_for_edit ||
config.authentication_for_read
) {
app.use(
session({
secret: config.secret,
name: 'raneto.sid',
resave: false,
saveUninitialized: false,
}),
);
app.use(mw_auth_readonly(config));
// OAuth2
if (config.googleoauth === true) {
app.use(passport.initialize());
app.use(passport.session());
router.use(mw_oauth2.router(config));
app.use(mw_oauth2.template);
}
router.post('/rn-login', route_login(config));
router.get('/logout', route_logout(config));
router.get('/login', route_login_page(config));
}
// Online Editor Routes
if (config.allow_editing === true) {
let middlewareToUse = authenticate;
if (config.authentication_for_edit === true) {
middlewareToUse = always_authenticate;
}
if (config.googleoauth === true) {
middlewareToUse = mw_oauth2.required;
}
router.post('/rn-edit', middlewareToUse, route_page_edit(config));
router.post('/rn-delete', middlewareToUse, route_page_delete(config));
router.post('/rn-add-page', middlewareToUse, route_page_create(config));
router.post(
'/rn-add-category',
middlewareToUse,
route_category_create(config),
);
}
// Router for / and /index with or without search parameter
if (config.googleoauth === true) {
router.get(
'/:var(index)?',
mw_oauth2.required,
route_search_init,
route_home_init,
);
router.get(/^([^.]*)/, mw_oauth2.required, route_wildcard_init);
} else if (config.authentication_for_read === true) {
router.get('/sitemap.xml', authenticate, route_sitemap_init);
router.get(
'/:var(index)?',
authenticate,
route_search_init,
route_home_init,
);
router.get(/^([^.]*)/, authenticate, route_wildcard_init);
} else {
router.get('/sitemap.xml', route_sitemap_init);
router.get('/:var(index)?', route_search_init, route_home_init);
router.get(/^([^.]*)/, route_wildcard_init);
}
// Handle Errors
router.use(error_handler);
app.use(config.prefix_url || '/', router);
// Wrap App if base_url is set
if (config.base_url !== '' && config.nowrap !== true) {
const wrap_app = express();
wrap_app.set('port', process.env.PORT || 3000);
wrap_app.use(config.base_url, app);
return wrap_app;
} else {
return app;
}
}
// Exports
export default initialize;