#110 Merged implementation of StandardJS

master
Keith Irwin 2017-12-13 00:50:07 +00:00
commit 0b330ac931
No known key found for this signature in database
GPG Key ID: 378933C743E2BBC0
6 changed files with 316 additions and 69 deletions

View File

@ -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,
@ -14,28 +15,29 @@ let transporter = nodemailer.createTransport({
})
module.exports = {
verify: () => {
transporter.verify((err, success) => {
if (err) { console.error(`SMTP Error: ${err}`) }
console.log(`📧 SMTP ${!success ? 'not ' : ''}ready`)
})
},
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`
},
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>`,
to: (user) => {
return `"${user.name}" <${user.email}>`
}
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),
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>`
},
noReply: '"Tracman" <NoReply@tracman.org>',
to: (user) => {
return `"${user.name}" <${user.email}>`
}
}

View File

@ -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) => {
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)
},
// 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)
},
// Ensure authentication
ensureAuth: (req, res, next) => {
debug(`ensureAuth(${req.url}, ${res.status}, ${next})`)
if (req.isAuthenticated()) { return next()
} else { res.redirect('/login'); }
},
// Ensure authentication
ensureAuth: (req, res, 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
}
}

View File

@ -1,7 +1,4 @@
{
"verbose": true,
"ext": "html, js, json, css",
"events": {
"start": "npm run build & npm run minify"
}
}

99
package-lock.json generated
View File

@ -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"
}
}

View File

@ -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
View File

@ -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