diff --git a/README.md b/README.md index e846341..512f846 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,9 @@ npm install markdown npm install highlight.js npm install compression npm install memory-cache --save +npm install request +npm install nodemailer +npm install nodemailer-smtp-transport ``` diff --git a/admin.js b/admin.js index c81156f..574263a 100644 --- a/admin.js +++ b/admin.js @@ -29,7 +29,7 @@ const utils = require('./utils/utils.js'); //cache -- only used for static contents const cache = require('memory-cache'); -/** Initializes sessions for login */ +//Initializes sessions for login app.use(session({ secret: utils.getFileLine('../session_secret'), cookie: { maxAge: 6000000 }})); //port to listen for the admin server on diff --git a/includes/contact.html b/includes/contact.html index 22f0d3c..12f5f3c 100644 --- a/includes/contact.html +++ b/includes/contact.html @@ -35,7 +35,7 @@
- + diff --git a/includes/contact.js b/includes/contact.js index c6b36f2..6a79465 100644 --- a/includes/contact.js +++ b/includes/contact.js @@ -13,6 +13,96 @@ const includes = require('../includes/includes'); //for parsing post data const qs = require('querystring'); +const sanitizer = require('sanitizer'); + +const Request = require('request'); + + +const nodemailer = require("nodemailer"); + + +const smtpTransport = require('nodemailer-smtp-transport'); + + +const CAPTCHA_SECRET = utils.getFileLine("../captcha_secret"); + +const EMAIL_PASSWORD = utils.getFileLine("../email_password"); + + +const verifyCapcha = function(data) +{ + const recaptcha_url = "https://www.google.com/recaptcha/api/siteverify?" + + "secret=" + CAPTCHA_SECRET + "&" + + "response=" + data; + + return sync = new Promise(function(resolve, reject) + { + Request(recaptcha_url, + function (error, response, body) + { + if (!error && response.statusCode == 200) + { + const googleAnswer = JSON.parse(body); + + if(googleAnswer.success == true) + { + resolve(true); + } + else + { + resolve(false); + } + } + else + { + resolve(false); + } + } + ); + }); + +}; + + + +const sendEmail = function(name, email, message) +{ + + const transporter = nodemailer.createTransport(smtpTransport({ + service: 'gmail', + host: 'smtp.gmail.com', + auth: { + user: 'jrtechswebsite@gmail.com', + pass: EMAIL_PASSWORD + } + })); + + const mailOptions = + { + to: "jeffery@jrtechs.net", // list of receivers + subject: "Jrtechs.net form submission", // Subject line + text: message, // plaintext body + html: message + }; + + // send mail with defined transport object + transporter.sendMail(mailOptions, function(error, response) + { + if(error) + { + console.log(error); + } + else + { + console.log("Message sent: " + response); + } + + // if you don't want to use this transport object anymore, uncomment following line + transporter.close(); // shut down the connection pool, no more messages + }); +}; + + const processContactPage = function(request) { @@ -20,15 +110,24 @@ const processContactPage = function(request) { utils.getPostData(request).then(function(postData) { - const data = qs.parse(postData); - console.log(postData); - console.log(data); - if(data.name && data.email) + + if(data.name && data.email && data["g-recaptcha-response"] && data.message) { - //send email - resolve(utils.include("includes/messageSent.html")); + verifyCapcha(sanitizer.sanitize(data["g-recaptcha-response"])).then(function(valid) + { + if(valid) + { + resolve(utils.include("includes/messageSent.html")); + + sendEmail(data.name, data.email, data.message); + } + else + { + resolve(utils.include("includes/invalidCaptcha.html")); + } + }); } else { @@ -40,10 +139,9 @@ const processContactPage = function(request) reject(err); }) }); - - }; + module.exports = { main: function(request, result) diff --git a/includes/invalidCaptcha.html b/includes/invalidCaptcha.html new file mode 100644 index 0000000..7c08c78 --- /dev/null +++ b/includes/invalidCaptcha.html @@ -0,0 +1,4 @@ +
+

Invalid Captcha

+ +
\ No newline at end of file diff --git a/package.json b/package.json index 735923d..03375c9 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,23 @@ "description": "Personal wordpress replacement", "main": "server.js", "dependencies": { + "compression": "^1.7.3", + "crypto": "^1.0.1", + "express": "^4.16.3", + "express-session": "^1.15.6", "highlight": "^0.2.4", + "highlight.js": "^9.12.0", "markdown": "^0.5.0", "markdown-to-html": "^0.0.13", "memory-cache": "^0.2.0", - "mysql": "^2.15.0", + "mysql": "^2.16.0", + "nodemailer": "^4.6.8", + "nodemailer-smtp-transport": "^2.7.4", "promise": "^8.0.1", + "remarkable": "^1.7.1", + "request": "^2.88.0", "sanitizer": "^0.1.3", - "step": "^1.0.0", - "synchronize": "^2.0.0" + "sendmail": "^1.4.1" }, "devDependencies": {}, "scripts": { @@ -31,5 +39,5 @@ "bugs": { "url": "https://github.com/jrtechs/NodeJSBlog/issues" }, - "homepage": "https://github.com/jrtechs/NodeJSBlog#readme" + "homepage": "https://jrtechs.net" } diff --git a/utils/utils.js b/utils/utils.js index 79e87ea..bd494ad 100644 --- a/utils/utils.js +++ b/utils/utils.js @@ -47,7 +47,7 @@ module.exports= { console.log("Could not find " + fileName); } - return 0; + return ''; }, @@ -66,7 +66,7 @@ module.exports= { console.log("Could not find " + fileName); } - return 0; + return ''; },