diff --git a/config/mail.js b/config/mail.js index 5818897..d5e3e2e 100644 --- a/config/mail.js +++ b/config/mail.js @@ -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 `

+Tracman

${text}

Do not reply to this email. For information about why you recieved this email, see our privacy policy.

` - }, - - noReply: `"Tracman" `, - - 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 `

+Tracman

${text}

Do not reply to this email. For information about why you recieved this email, see our privacy policy.

` + }, + + noReply: '"Tracman" ', + + to: (user) => { + return `"${user.name}" <${user.email}>` + } + } diff --git a/config/middleware.js b/config/middleware.js index 2c2d5ba..ee1739f 100644 --- a/config/middleware.js +++ b/config/middleware.js @@ -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.
Would you like to report it?') - } 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.
Would you like to report it?'); + } 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 + } } diff --git a/nodemon.json b/nodemon.json index 40c8d36..d9c19b6 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,7 +1,4 @@ { "verbose": true, "ext": "html, js, json, css", - "events": { - "start": "npm run build & npm run minify" - } } diff --git a/package-lock.json b/package-lock.json index 6617e36..dcd7fdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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" } } diff --git a/package.json b/package.json index c26fedf..34a6650 100644 --- a/package.json +++ b/package.json @@ -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" diff --git a/test.js b/test.js index 9545405..f6c7e87 100755 --- a/test.js +++ b/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