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 `
${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 `${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