generating git_secret at start
This commit is contained in:
+2
-1
@@ -3,4 +3,5 @@
|
|||||||
/config.json
|
/config.json
|
||||||
/config.example.json
|
/config.example.json
|
||||||
/data
|
/data
|
||||||
/test_data
|
/test_data
|
||||||
|
/git_secret
|
||||||
+49
-7
@@ -14,6 +14,16 @@ const cons = {
|
|||||||
error: '\x1b[31m✘\x1b[0m %s',
|
error: '\x1b[31m✘\x1b[0m %s',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const randStr = (length) => {
|
||||||
|
let result = '';
|
||||||
|
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
const charactersLength = characters.length;
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = (config) => {
|
module.exports = (config) => {
|
||||||
const fw = require('./file_walker')(config);
|
const fw = require('./file_walker')(config);
|
||||||
const renderer = require('./renderer')(config);
|
const renderer = require('./renderer')(config);
|
||||||
@@ -25,16 +35,18 @@ module.exports = (config) => {
|
|||||||
|
|
||||||
const articles = {};
|
const articles = {};
|
||||||
let lastRSS = '';
|
let lastRSS = '';
|
||||||
|
let webhookSecret;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch articles from the data folder and send success as a response
|
* Fetch articles from the data folder and send success as a response
|
||||||
* @param callback
|
* @param success
|
||||||
|
* @param error
|
||||||
*/
|
*/
|
||||||
const reload = (callback) => {
|
const reload = (success, error) => {
|
||||||
fw.fetchArticles((err, dict) => {
|
fw.fetchArticles((err, dict) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
callback(false);
|
console.error(cons.error, 'error loading articles : ' + err);
|
||||||
return console.error(cons.error, 'loading articles : ' + err);
|
return error ? error() : null;
|
||||||
}
|
}
|
||||||
Object.keys(articles).forEach((key) => delete articles[key]);
|
Object.keys(articles).forEach((key) => delete articles[key]);
|
||||||
Object.keys(dict).forEach((key) => articles[key] = dict[key]);
|
Object.keys(dict).forEach((key) => articles[key] = dict[key]);
|
||||||
@@ -46,12 +58,41 @@ module.exports = (config) => {
|
|||||||
|
|
||||||
lastRSS = '';
|
lastRSS = '';
|
||||||
|
|
||||||
callback(true);
|
success();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
if (config['test'])
|
if (config['test'])
|
||||||
app.reload = reload;
|
app.reload = reload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch or create secret token for git webhook
|
||||||
|
* @param success
|
||||||
|
* @param error
|
||||||
|
*/
|
||||||
|
const checkSecret = (success, error) => {
|
||||||
|
if (!config['modules']['webhook'])
|
||||||
|
success();
|
||||||
|
fs.readFile(config['webhook']['secret_file'], {encoding: 'UTF-8'}, (err, data) => {
|
||||||
|
if (err) {
|
||||||
|
webhookSecret = randStr(32);
|
||||||
|
fs.writeFile(config['webhook']['secret_file'], webhookSecret, {encoding: 'UTF-8'}, (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(cons.error, 'error creating secret : ' + err);
|
||||||
|
return error ? error() : null;
|
||||||
|
}
|
||||||
|
console.log(cons.ok,'created git secret at '+config['webhook']['secret_file']);
|
||||||
|
success();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
webhookSecret = data;
|
||||||
|
console.log(cons.ok,'loaded git secret from '+config['webhook']['secret_file']);
|
||||||
|
success();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (config['test'])
|
||||||
|
app.checkSecret = checkSecret;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render the page with the view engine and catch errors
|
* Render the page with the view engine and catch errors
|
||||||
* @param res
|
* @param res
|
||||||
@@ -180,11 +221,12 @@ module.exports = (config) => {
|
|||||||
|
|
||||||
// must be use in a server.js to start the server
|
// must be use in a server.js to start the server
|
||||||
app.start = () => {
|
app.start = () => {
|
||||||
reload((res) => {
|
reload(() => {
|
||||||
if (res)
|
checkSecret(() => {
|
||||||
app.listen(config['node_port'], () => {
|
app.listen(config['node_port'], () => {
|
||||||
console.log(cons.ok, `gitblog.md server listening on port ${config['node_port']}`);
|
console.log(cons.ok, `gitblog.md server listening on port ${config['node_port']}`);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
"endpoint": "/webhook",
|
"endpoint": "/webhook",
|
||||||
"secretFile": "git_secret"
|
"secret_file": "git_secret"
|
||||||
},
|
},
|
||||||
"showdown": {
|
"showdown": {
|
||||||
"parseImgDimensions": true,
|
"parseImgDimensions": true,
|
||||||
|
|||||||
+68
-33
@@ -22,13 +22,10 @@ config['rss']['length'] = 2;
|
|||||||
|
|
||||||
const app = require('../src/app')(config);
|
const app = require('../src/app')(config);
|
||||||
|
|
||||||
beforeEach((done) => {
|
beforeEach((done, fail) => {
|
||||||
utils.deleteFolderSync(dataDir);
|
utils.deleteFolderSync(dataDir);
|
||||||
fs.mkdirSync(dataDir);
|
fs.mkdirSync(dataDir);
|
||||||
app.reload((res) => {
|
app.reload(done, fail);
|
||||||
expect(res).toBe(true);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(() => {
|
afterAll(() => {
|
||||||
@@ -60,7 +57,7 @@ describe('Test root path', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
test('200 2 articles', (done) => {
|
test('200 2 articles', (done, fail) => {
|
||||||
utils.createEmptyDirs([
|
utils.createEmptyDirs([
|
||||||
path.join(dataDir, '2019', '05', '05'),
|
path.join(dataDir, '2019', '05', '05'),
|
||||||
path.join(dataDir, '2018', '05', '05')
|
path.join(dataDir, '2018', '05', '05')
|
||||||
@@ -70,18 +67,62 @@ describe('Test root path', () => {
|
|||||||
path.join(dataDir, '2018', '05', '05', 'index.md')
|
path.join(dataDir, '2018', '05', '05', 'index.md')
|
||||||
]);
|
]);
|
||||||
fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= articles.length %>');
|
fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= articles.length %>');
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/').then((response) => {
|
request(app).get('/').then((response) => {
|
||||||
expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
expect(response.text).toBe('articles 2');
|
expect(response.text).toBe('articles 2');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
}, fail);
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Test check secret', () => {
|
||||||
|
const secretFile = 'git_secret';
|
||||||
|
const tmpSecretFile = 'tmp_git_secret';
|
||||||
|
beforeEach(() => {
|
||||||
|
if (fs.existsSync(secretFile))
|
||||||
|
fs.renameSync(secretFile, tmpSecretFile);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
if (fs.existsSync(tmpSecretFile)) {
|
||||||
|
fs.renameSync(tmpSecretFile, secretFile);
|
||||||
|
} else if (fs.existsSync(secretFile)) {
|
||||||
|
fs.unlinkSync(secretFile); //remove secret file if remaining
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test('no check if not activated', (done, fail) => {
|
||||||
|
config['modules']['webhook'] = false;
|
||||||
|
app.checkSecret(() => {
|
||||||
|
config['modules']['webhook'] = true;
|
||||||
|
done();
|
||||||
|
}, () => {
|
||||||
|
config['modules']['webhook'] = true;
|
||||||
|
fail();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
test('create if not exists', (done, fail) => {
|
||||||
|
if (fs.existsSync(secretFile))
|
||||||
|
fs.unlinkSync(secretFile);
|
||||||
|
app.checkSecret(() => {
|
||||||
|
expect(fs.existsSync(secretFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(secretFile).length).toBeGreaterThan(0);
|
||||||
|
done();
|
||||||
|
}, fail);
|
||||||
|
});
|
||||||
|
test('read if exists', (done, fail) => {
|
||||||
|
fs.writeFileSync(secretFile,'secret value');
|
||||||
|
app.checkSecret(() => {
|
||||||
|
expect(fs.existsSync(secretFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(secretFile, {encoding:'UTF-8'})).toBe('secret value');
|
||||||
|
done();
|
||||||
|
}, fail);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('Test RSS feed', () => {
|
describe('Test RSS feed', () => {
|
||||||
test('404 rss deactivated', (done) => {
|
test('404 rss deactivated', (done) => {
|
||||||
config['modules']['rss'] = false;
|
config['modules']['rss'] = false;
|
||||||
@@ -99,7 +140,7 @@ describe('Test RSS feed', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
test('200 2 rss items', (done) => {
|
test('200 2 rss items', (done, fail) => {
|
||||||
utils.createEmptyDirs([
|
utils.createEmptyDirs([
|
||||||
path.join(dataDir, '2019', '05', '05'),
|
path.join(dataDir, '2019', '05', '05'),
|
||||||
path.join(dataDir, '2018', '05', '05')
|
path.join(dataDir, '2018', '05', '05')
|
||||||
@@ -108,17 +149,16 @@ describe('Test RSS feed', () => {
|
|||||||
path.join(dataDir, '2019', '05', '05', 'index.md'),
|
path.join(dataDir, '2019', '05', '05', 'index.md'),
|
||||||
path.join(dataDir, '2018', '05', '05', 'index.md')
|
path.join(dataDir, '2018', '05', '05', 'index.md')
|
||||||
]);
|
]);
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/rsstest').then((response) => {
|
request(app).get('/rsstest').then((response) => {
|
||||||
expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
expect(response.text.length).toBeGreaterThan(0);
|
expect(response.text.length).toBeGreaterThan(0);
|
||||||
expect(response.text.split('<item>').length).toBe(3);
|
expect(response.text.split('<item>').length).toBe(3);
|
||||||
done();
|
done();
|
||||||
});
|
}, fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
test('200 max rss items', (done) => {
|
test('200 max rss items', (done, fail) => {
|
||||||
utils.createEmptyDirs([
|
utils.createEmptyDirs([
|
||||||
path.join(dataDir, '2019', '05', '05'),
|
path.join(dataDir, '2019', '05', '05'),
|
||||||
path.join(dataDir, '2018', '05', '05'),
|
path.join(dataDir, '2018', '05', '05'),
|
||||||
@@ -129,14 +169,13 @@ describe('Test RSS feed', () => {
|
|||||||
path.join(dataDir, '2018', '05', '05', 'index.md'),
|
path.join(dataDir, '2018', '05', '05', 'index.md'),
|
||||||
path.join(dataDir, '2017', '05', '05', 'index.md')
|
path.join(dataDir, '2017', '05', '05', 'index.md')
|
||||||
]);
|
]);
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/rsstest').then((response) => {
|
request(app).get('/rsstest').then((response) => {
|
||||||
expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
expect(response.text.length).toBeGreaterThan(0);
|
expect(response.text.length).toBeGreaterThan(0);
|
||||||
expect(response.text.split('<item>').length).toBe(3);
|
expect(response.text.split('<item>').length).toBe(3);
|
||||||
done();
|
done();
|
||||||
});
|
}, fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -149,59 +188,55 @@ describe('Test articles rendering', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('500 no template', (done) => {
|
test('500 no template', (done, fail) => {
|
||||||
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
||||||
fs.writeFileSync(path.join(dataDir, '2019', '05', '05', 'index.md'), '# Hello');
|
fs.writeFileSync(path.join(dataDir, '2019', '05', '05', 'index.md'), '# Hello');
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/2019/05/05/hello/').then((response) => {
|
request(app).get('/2019/05/05/hello/').then((response) => {
|
||||||
expect(response.statusCode).toBe(500);
|
expect(response.statusCode).toBe(500);
|
||||||
done();
|
done();
|
||||||
});
|
}, fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('200 rendered article', (done) => {
|
test('200 rendered article', (done, fail) => {
|
||||||
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
||||||
fs.writeFileSync(path.join(dataDir, '2019', '05', '05', 'index.md'), '# Hello');
|
fs.writeFileSync(path.join(dataDir, '2019', '05', '05', 'index.md'), '# Hello');
|
||||||
fs.writeFileSync(path.join(dataDir, testTemplate), '<%- article.content %><%- `<a href="${article.url}">reload</a>` %>');
|
fs.writeFileSync(path.join(dataDir, testTemplate), '<%- article.content %><%- `<a href="${article.url}">reload</a>` %>');
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/2019/05/05/hello/').then((response) => {
|
request(app).get('/2019/05/05/hello/').then((response) => {
|
||||||
expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
expect(response.text).toBe('<h1 id="hello">Hello</h1><a href="/2019/05/05/hello/">reload</a>');
|
expect(response.text).toBe('<h1 id="hello">Hello</h1><a href="/2019/05/05/hello/">reload</a>');
|
||||||
done();
|
done();
|
||||||
});
|
}, fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('200 other url', (done) => {
|
test('200 other url', (done, fail) => {
|
||||||
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
||||||
utils.createEmptyFiles([
|
utils.createEmptyFiles([
|
||||||
path.join(dataDir, '2019', '05', '05', 'index.md'),
|
path.join(dataDir, '2019', '05', '05', 'index.md'),
|
||||||
path.join(dataDir, testTemplate)
|
path.join(dataDir, testTemplate)
|
||||||
]);
|
]);
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/2019/05/05/anything/').then((response) => {
|
request(app).get('/2019/05/05/anything/').then((response) => {
|
||||||
expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
done();
|
done();
|
||||||
});
|
}, fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('200 other url 2', (done) => {
|
test('200 other url 2', (done, fail) => {
|
||||||
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
utils.createEmptyDirs([path.join(dataDir, '2019', '05', '05'),]);
|
||||||
utils.createEmptyFiles([
|
utils.createEmptyFiles([
|
||||||
path.join(dataDir, '2019', '05', '05', 'index.md'),
|
path.join(dataDir, '2019', '05', '05', 'index.md'),
|
||||||
path.join(dataDir, testTemplate)
|
path.join(dataDir, testTemplate)
|
||||||
]);
|
]);
|
||||||
app.reload((res) => {
|
app.reload(() => {
|
||||||
expect(res).toBe(true);
|
|
||||||
request(app).get('/2019/05/05/').then((response) => {
|
request(app).get('/2019/05/05/').then((response) => {
|
||||||
expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
done();
|
done();
|
||||||
});
|
}, fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user