#110 Merged implementation of StandardJS
commit
0b330ac931
|
@ -2,6 +2,7 @@
|
|||
|
||||
const nodemailer = require('nodemailer')
|
||||
const env = require('./env/env.js')
|
||||
const debug = require('debug')('tracman-mail')
|
||||
|
||||
let transporter = nodemailer.createTransport({
|
||||
host: env.mailserver,
|
||||
|
@ -15,27 +16,28 @@ let transporter = nodemailer.createTransport({
|
|||
|
||||
module.exports = {
|
||||
|
||||
verify: () => {
|
||||
transporter.verify((err, success) => {
|
||||
if (err) { console.error(`SMTP Error: ${err}`) }
|
||||
console.log(`📧 SMTP ${!success ? 'not ' : ''}ready`)
|
||||
})
|
||||
},
|
||||
verify: () => {
|
||||
debug(`Verifying SMTP connection...`)
|
||||
transporter.verify( (err,success) => {
|
||||
if (err){ console.error(`📧 SMTP ${err}`); }
|
||||
console.log(`📧 SMTP${(success)?'':' not'} ready`)
|
||||
} )
|
||||
},
|
||||
|
||||
send: transporter.sendMail.bind(transporter),
|
||||
send: transporter.sendMail.bind(transporter),
|
||||
|
||||
text: (text) => {
|
||||
return `Tracman\n\n${text}\n\nDo not reply to this email\nFor information about why you received this email, see the privacy policy at ${env.url}/privacyy#email`
|
||||
},
|
||||
text: (text) => {
|
||||
return `Tracman\n\n${text}\n\nDo not reply to this email\nFor information about why you received this email, see the privacy policy at ${env.url}/privacyy#email`
|
||||
},
|
||||
|
||||
html: (text) => {
|
||||
return `<h1><a href="/" style="text-decoration:none;"><span style="color:#000;font-family:sans-serif;font-size:36px;font-weight:bold"><img src="${env.url}/static/img/icon/by/32.png" alt="+" style="margin-right:10px">Tracman</span></a></h1>${text}<p style="font-size:8px;">Do not reply to this email. For information about why you recieved this email, see our <a href="${env.url}/privacy#email">privacy policy</a>. </p>`
|
||||
},
|
||||
html: (text)=>{
|
||||
return `<h1><a href="/" style="text-decoration:none;"><span style="color:#000;font-family:sans-serif;font-size:36px;font-weight:bold"><img src="${env.url}/static/img/icon/by/32.png" alt="+" style="margin-right:10px">Tracman</span></a></h1>${text}<p style="font-size:8px;">Do not reply to this email. For information about why you recieved this email, see our <a href="${env.url}/privacy#email">privacy policy</a>. </p>`
|
||||
},
|
||||
|
||||
noReply: `"Tracman" <NoReply@tracman.org>`,
|
||||
noReply: '"Tracman" <NoReply@tracman.org>',
|
||||
|
||||
to: (user) => {
|
||||
return `"${user.name}" <${user.email}>`
|
||||
}
|
||||
to: (user) => {
|
||||
return `"${user.name}" <${user.email}>`
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,45 +1,53 @@
|
|||
'use strict'
|
||||
|
||||
const env = require('./env/env.js')
|
||||
const debug = require('debug')('tracman-middleware')
|
||||
|
||||
module.exports = {
|
||||
|
||||
// Throw error
|
||||
throwErr: (err, req = null) => {
|
||||
console.error(`❌️ ${err.stack}`)
|
||||
if (req) {
|
||||
if (env.mode === 'production') {
|
||||
req.flash('danger', 'An error occured. <br>Would you like to <a href="https://github.com/Tracman-org/Server/issues/new">report it</a>?')
|
||||
} else { // development
|
||||
req.flash('danger', err.message)
|
||||
}
|
||||
}
|
||||
},
|
||||
// Throw error
|
||||
throwErr: (err, req=null) => {
|
||||
debug(`throwErr(${err.message},${req.url})`)
|
||||
console.error(`❌️ ${err.stack}`)
|
||||
if (req){
|
||||
if (env.mode==='production') {
|
||||
req.flash('danger', 'An error occured. <br>Would you like to <a href="https://github.com/Tracman-org/Server/issues/new">report it</a>?');
|
||||
} else { // development
|
||||
req.flash('danger', err.message)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Capitalize the first letter of a string
|
||||
capitalize: (str) => {
|
||||
return str.charAt(0).toUpperCase() + str.slice(1)
|
||||
},
|
||||
// Capitalize the first letter of a string
|
||||
capitalize: (str) => {
|
||||
debug(`capitalize(${str})`)
|
||||
return str.charAt(0).toUpperCase() + str.slice(1)
|
||||
},
|
||||
|
||||
// Validate an email address
|
||||
validateEmail: (email) => {
|
||||
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||
return re.test(email)
|
||||
},
|
||||
// Validate an email address
|
||||
validateEmail: (email) => {
|
||||
debug(`validateEmail(${email})`)
|
||||
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||
return re.test(email)
|
||||
},
|
||||
|
||||
// Ensure authentication
|
||||
ensureAuth: (req, res, next) => {
|
||||
if (req.isAuthenticated()) { return next() } else { res.redirect('/login') }
|
||||
},
|
||||
// Ensure authentication
|
||||
ensureAuth: (req, res, next) => {
|
||||
debug(`ensureAuth(${req.url}, ${res.status}, ${next})`)
|
||||
if (req.isAuthenticated()) { return next()
|
||||
} else { res.redirect('/login'); }
|
||||
},
|
||||
|
||||
// Ensure administrator
|
||||
ensureAdmin: (req, res, next) => {
|
||||
if (req.isAuthenticated() && req.user.isAdmin) { return next() } else {
|
||||
let err = new Error('Unauthorized')
|
||||
err.status = 401
|
||||
next(err)
|
||||
}
|
||||
// TODO: test this by logging in as !isAdmin and go to /admin
|
||||
}
|
||||
// Ensure administrator
|
||||
ensureAdmin: (req, res, next) => {
|
||||
debug(`ensureAdmin(${req.url}, ${res.status}, ${next})`)
|
||||
if (req.isAuthenticated() && req.user.isAdmin){ return next()
|
||||
} else {
|
||||
let err = new Error("Unauthorized")
|
||||
err.status = 401
|
||||
next(err)
|
||||
}
|
||||
//TODO: test this by logging in as !isAdmin and go to /admin
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
{
|
||||
"verbose": true,
|
||||
"ext": "html, js, json, css",
|
||||
"events": {
|
||||
"start": "npm run build & npm run minify"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -467,6 +467,12 @@
|
|||
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
|
||||
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
|
||||
},
|
||||
"browser-stdout": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
|
||||
"integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
|
||||
"dev": true
|
||||
},
|
||||
"browserify-aes": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz",
|
||||
|
@ -654,7 +660,7 @@
|
|||
"cookiejar": "2.0.6",
|
||||
"is-ip": "1.0.0",
|
||||
"methods": "1.1.2",
|
||||
"qs": "6.4.0",
|
||||
"qs": "6.5.1",
|
||||
"superagent": "2.3.0"
|
||||
}
|
||||
},
|
||||
|
@ -1301,6 +1307,12 @@
|
|||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
|
||||
"integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
|
||||
"dev": true
|
||||
},
|
||||
"diffie-hellman": {
|
||||
"version": "5.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
|
||||
|
@ -2290,6 +2302,12 @@
|
|||
"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
|
||||
"integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
|
||||
},
|
||||
"growl": {
|
||||
"version": "1.10.3",
|
||||
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
|
||||
"integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
|
||||
"dev": true
|
||||
},
|
||||
"har-schema": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||
|
@ -2378,6 +2396,12 @@
|
|||
"sntp": "2.0.2"
|
||||
}
|
||||
},
|
||||
"he": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
|
||||
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
|
||||
"dev": true
|
||||
},
|
||||
"hmac-drbg": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
|
||||
|
@ -3403,6 +3427,56 @@
|
|||
"minimist": "0.0.8"
|
||||
}
|
||||
},
|
||||
"mocha": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz",
|
||||
"integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"browser-stdout": "1.3.0",
|
||||
"commander": "2.11.0",
|
||||
"debug": "3.1.0",
|
||||
"diff": "3.3.1",
|
||||
"escape-string-regexp": "1.0.5",
|
||||
"glob": "7.1.2",
|
||||
"growl": "1.10.3",
|
||||
"he": "1.1.1",
|
||||
"mkdirp": "0.5.1",
|
||||
"supports-color": "4.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"commander": {
|
||||
"version": "2.11.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
|
||||
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
|
||||
"dev": true
|
||||
},
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
|
||||
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
|
||||
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.18.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
|
||||
|
@ -3618,7 +3692,7 @@
|
|||
"dev": true,
|
||||
"requires": {
|
||||
"chokidar": "1.7.0",
|
||||
"debug": "2.6.8",
|
||||
"debug": "2.6.9",
|
||||
"es6-promise": "3.2.1",
|
||||
"ignore-by-default": "1.0.1",
|
||||
"lodash.defaults": "3.1.2",
|
||||
|
@ -4264,6 +4338,7 @@
|
|||
"pinkie": "2.0.4"
|
||||
}
|
||||
},
|
||||
<<<<<<< HEAD
|
||||
"pkg-conf": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz",
|
||||
|
@ -4351,6 +4426,8 @@
|
|||
"integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
|
||||
"dev": true
|
||||
},
|
||||
=======
|
||||
>>>>>>> 72141a31873b674ed23daf262ce14be38dda50ff
|
||||
"postcss": {
|
||||
"version": "5.2.17",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz",
|
||||
|
@ -5181,7 +5258,7 @@
|
|||
"integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"rc": "1.1.7"
|
||||
"rc": "1.2.1"
|
||||
}
|
||||
},
|
||||
"regjsgen": {
|
||||
|
@ -5275,6 +5352,7 @@
|
|||
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
|
||||
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
|
||||
},
|
||||
<<<<<<< HEAD
|
||||
"require-uncached": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
|
||||
|
@ -5293,6 +5371,8 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
=======
|
||||
>>>>>>> 72141a31873b674ed23daf262ce14be38dda50ff
|
||||
"require_optional": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
|
||||
|
@ -5302,6 +5382,7 @@
|
|||
"semver": "5.3.0"
|
||||
}
|
||||
},
|
||||
<<<<<<< HEAD
|
||||
"resolve": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
|
||||
|
@ -5311,6 +5392,8 @@
|
|||
"path-parse": "1.0.5"
|
||||
}
|
||||
},
|
||||
=======
|
||||
>>>>>>> 72141a31873b674ed23daf262ce14be38dda50ff
|
||||
"resolve-from": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
|
||||
|
@ -5842,13 +5925,13 @@
|
|||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"cookiejar": "2.0.6",
|
||||
"debug": "2.6.8",
|
||||
"debug": "2.6.9",
|
||||
"extend": "3.0.1",
|
||||
"form-data": "1.0.0-rc4",
|
||||
"formidable": "1.1.1",
|
||||
"methods": "1.1.2",
|
||||
"mime": "1.3.4",
|
||||
"qs": "6.4.0",
|
||||
"qs": "6.5.1",
|
||||
"readable-stream": "2.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
|
@ -5889,13 +5972,13 @@
|
|||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"cookiejar": "2.0.6",
|
||||
"debug": "2.6.8",
|
||||
"debug": "2.6.9",
|
||||
"extend": "3.0.1",
|
||||
"form-data": "2.1.4",
|
||||
"form-data": "2.3.1",
|
||||
"formidable": "1.1.1",
|
||||
"methods": "1.1.2",
|
||||
"mime": "1.3.4",
|
||||
"qs": "6.4.0",
|
||||
"qs": "6.5.1",
|
||||
"readable-stream": "2.3.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
"devDependencies": {
|
||||
"chai": "^4.0.2",
|
||||
"chai-http": "^3.0.0",
|
||||
"mocha": "^4.0.1",
|
||||
"nodemon": "^1.11.0",
|
||||
"standard": "^10.0.3",
|
||||
"supertest": "^3.0.0"
|
||||
|
|
156
test.js
156
test.js
|
@ -2,6 +2,7 @@ const chai = require('chai')
|
|||
const chaiHttp = require('chai-http')
|
||||
const request = require('supertest')
|
||||
const server = require('./server')
|
||||
<<<<<<< HEAD
|
||||
chai.use(chaiHttp)
|
||||
|
||||
describe('Public', function () {
|
||||
|
@ -144,3 +145,158 @@ describe('User', function () {
|
|||
|
||||
// })
|
||||
})
|
||||
=======
|
||||
const chai.use(chaiHttp);
|
||||
|
||||
|
||||
describe('Public Pages', () => {
|
||||
|
||||
function getPublicPage(url,done){
|
||||
request(server.get(url)
|
||||
.expect(200)
|
||||
.end( (err,res)=>{ done(); } )
|
||||
}
|
||||
|
||||
it('Displays homepage', (done) => {
|
||||
getPublicPage ('/', done)
|
||||
})
|
||||
|
||||
it('Displays help page', (done) => {
|
||||
getPublicPage('/help',done)
|
||||
})
|
||||
|
||||
it('Displays terms of service', (done) => {
|
||||
getPublicPage ('/terms',done)
|
||||
})
|
||||
|
||||
it('Displays privacy policy', (done) => {
|
||||
getPublicPage ('/privacy', done)
|
||||
})
|
||||
|
||||
it('Displays robots.txt', done) => {
|
||||
request(server).get('/robots.txt')
|
||||
.expect(200)
|
||||
.expect('Content-Type', /text/)
|
||||
.end( (err,res) => { done(); } )
|
||||
})
|
||||
|
||||
it('Displays demo map', (done) => {
|
||||
getPublicPage ('/map/demo', done)
|
||||
})
|
||||
|
||||
it('Displays help page', (done) => {
|
||||
getPublicPage ('/help', done)
|
||||
})
|
||||
|
||||
it('Displays contact page', (done) => {
|
||||
getPublicPage('/contact', done)
|
||||
})
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
describe('Accounts', () => {
|
||||
|
||||
it('Creates an account', (done) => {
|
||||
request(server).post('/signup',{"email":"test@tracman.org"})
|
||||
.expect(200)
|
||||
.end( (err,res) => { done(); } );
|
||||
});
|
||||
|
||||
//TODO: it('Creates a password', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Logs in', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Logs out', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Forgets password', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Changes forgotten password', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Logs back in', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Changes email address', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Changes password', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Changes settings', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Connects a Google account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Connects a Facebook account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Connects a Twitter account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Logs in with Google', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Logs in with Facebook', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Logs in with Twitter', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Disconnects a Google account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Disconnects a Facebook account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Disconnects a Twitter account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Shows own map', (done) => {
|
||||
// request(server).get('/map')
|
||||
// .expect(200)
|
||||
// .end(function(err,res){ done(); });
|
||||
// });
|
||||
|
||||
//TODO: it('Sets own location', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Tracks own location', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Clears own location', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
//TODO: it('Deletes account', (done) => {
|
||||
|
||||
// });
|
||||
|
||||
});
|
||||
>>>>>>> 72141a31873b674ed23daf262ce14be38dda50ff
|
||||
|
|
Loading…
Reference in New Issue