From 7a73162607544204032aa66cce755daf21edebda Mon Sep 17 00:00:00 2001 From: Matt Strapp Date: Tue, 24 May 2022 11:18:46 -0500 Subject: Graduate Signed-off-by: Matt Strapp --- csci4131/hw7/api/utilities.js | 64 ++++++++++++++ csci4131/hw7/create_accounts_table.js | 41 +++++++++ csci4131/hw7/create_contacts_table.js | 44 ++++++++++ csci4131/hw7/dbconfig.xml | 8 ++ csci4131/hw7/dbio.js | 136 +++++++++++++++++++++++++++++ csci4131/hw7/index.js | 109 +++++++++++++++++++++++ csci4131/hw7/insert_into_accounts_table.js | 45 ++++++++++ csci4131/hw7/login.html | 48 ++++++++++ csci4131/hw7/package.json | 21 +++++ csci4131/hw7/public/contacts_old.html | 82 +++++++++++++++++ csci4131/hw7/public/stock.html | 123 ++++++++++++++++++++++++++ csci4131/hw7/public/welcome.html | 53 +++++++++++ 12 files changed, 774 insertions(+) create mode 100644 csci4131/hw7/api/utilities.js create mode 100644 csci4131/hw7/create_accounts_table.js create mode 100644 csci4131/hw7/create_contacts_table.js create mode 100644 csci4131/hw7/dbconfig.xml create mode 100644 csci4131/hw7/dbio.js create mode 100644 csci4131/hw7/index.js create mode 100644 csci4131/hw7/insert_into_accounts_table.js create mode 100644 csci4131/hw7/login.html create mode 100644 csci4131/hw7/package.json create mode 100644 csci4131/hw7/public/contacts_old.html create mode 100644 csci4131/hw7/public/stock.html create mode 100644 csci4131/hw7/public/welcome.html (limited to 'csci4131/hw7') diff --git a/csci4131/hw7/api/utilities.js b/csci4131/hw7/api/utilities.js new file mode 100644 index 0000000..12e06aa --- /dev/null +++ b/csci4131/hw7/api/utilities.js @@ -0,0 +1,64 @@ +const express = require('express') +const db = require ('../dbio') +const router = express.Router() +router.use(express.urlencoded({ extended: true })) + +router.get('/contacts', function (req, res) { + db.getContacts().then(function(table) { + res.send(table) + }); +}); + +router.post('/login', async function(req, res) { + var loginInfo = req.body; + var login = loginInfo.login; + var pwd = loginInfo.password; + let rows = []; + + // Query the database tbl_login with login and hashed password + db.query(login, pwd).then(function(rows) { + // Provided there is no error, and the results set is assigned to a variable named rows: + if (rows.length >= 1) {// the length should be 0 or 1, but this will work for now + //success, set the session, return success + req.session.user = login; + res.json({ status: 'success' }); + } else { + res.json({ status: 'fail' }); + } + }); + +}); + +router.get('/logout', function(req, res) { + if(!req.session.user) { + res.send('Session not started, can not logout!'); + } else { + req.session.destroy(); + res.redirect('/login'); + } +}); + +router.post('/addContact', function(req, res) { + var contact = req.body; + db.addContact(contact).then(function(r) { + res.send({flag: r}); + }).catch(function() { + + }) +}); + +router.post('/updateContact', function(req, res) { + var edit = req.body; + db.editContact(edit).then(function(f) { + res.send({flag:f}); + }); +}) + +router.post('/deleteContact', function(req, res) { + var contact = req.body.name; + db.deleteContact(contact).then(function(r) { + res.send({flag: r}); + }) +}) + +module.exports = router; diff --git a/csci4131/hw7/create_accounts_table.js b/csci4131/hw7/create_accounts_table.js new file mode 100644 index 0000000..61b2602 --- /dev/null +++ b/csci4131/hw7/create_accounts_table.js @@ -0,0 +1,41 @@ +/* +TO DO: +----- +READ ALL COMMENTS AND REPLACE VALUES ACCORDINGLY +*/ + +const mysql = require("mysql"); + +const dbCon = mysql.createConnection({ + host: "cse-mysql-classes-01.cse.umn.edu", + user: "C4131S21U83", // replace with the database user provided to you + password: "6919", // replace with the database password provided to you + database: "C4131S21U83", // replace with the database user provided to you + port: 3306 +}); + +console.log("Attempting database connection"); +dbCon.connect(function (err) { + if (err) { + throw err; + } + console.log("Connected to database!"); + + const sql = `CREATE TABLE tbl_accounts ( + acc_id INT NOT NULL AUTO_INCREMENT, + acc_name VARCHAR(20), + acc_login VARCHAR(20), + acc_password VARCHAR(200), + PRIMARY KEY (acc_id) + )`; + + console.log("Attempting to create table: tbl_accounts"); + dbCon.query(sql, function (err, result) { + if (err) { + throw err; + } + console.log("Table tbl_accounts created"); + }); + + dbCon.end(); +}); diff --git a/csci4131/hw7/create_contacts_table.js b/csci4131/hw7/create_contacts_table.js new file mode 100644 index 0000000..bcad389 --- /dev/null +++ b/csci4131/hw7/create_contacts_table.js @@ -0,0 +1,44 @@ +/* +TO DO: +----- +READ ALL COMMENTS AND REPLACE VALUES ACCORDINGLY +*/ + +const mysql = require("mysql"); + +const dbCon = mysql.createConnection({ + host: "cse-mysql-classes-01.cse.umn.edu", + user: "C4131S21U83", // replace with the database user provided to you + password: "6919", // replace with the database password provided to you + database: "C4131S21U83", // replace with the database user provided to you + port: 3306 +}); + +console.log("Attempting database connection"); +dbCon.connect(function (err) { + if (err) { + throw err; + } + console.log("Connected to database!"); + + const sql = `CREATE TABLE tbl_contacts ( + contact_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(30), + category VARCHAR(40), + location VARCHAR(300), + contact_info VARCHAR(200), + email VARCHAR(30), + website VARCHAR(300), + website_url VARCHAR(300) + )`; + + console.log("Attempting to create table: tbl_contacts"); + dbCon.query(sql, function (err, result) { + if (err) { + throw err; + } + console.log("Table tbl_accounts created"); + }); + + dbCon.end(); +}); diff --git a/csci4131/hw7/dbconfig.xml b/csci4131/hw7/dbconfig.xml new file mode 100644 index 0000000..a7e83ba --- /dev/null +++ b/csci4131/hw7/dbconfig.xml @@ -0,0 +1,8 @@ + + + cse-mysql-classes-01.cse.umn.edu + C4131S21U83 + 6919 + C4131S21U83 + 3306 + diff --git a/csci4131/hw7/dbio.js b/csci4131/hw7/dbio.js new file mode 100644 index 0000000..96faf93 --- /dev/null +++ b/csci4131/hw7/dbio.js @@ -0,0 +1,136 @@ +var mysql = require("mysql"); +var bcrypt = require("bcrypt"); +var fs = require("fs"); +var xml2js = require("xml2js"); +var parser = new xml2js.Parser(); +var conInfo; +var connection; + +fs.readFile(__dirname + '/dbconfig.xml', function (err, data) { + if (err) throw err; + parser.parseString(data, function (err, result) { + if (err) throw err; + conInfo = result; + }); + connection = mysql.createConnection({ + host: conInfo.dbconfig.host[0], + user: conInfo.dbconfig.user[0], + password: conInfo.dbconfig.password[0], + database: conInfo.dbconfig.database[0], + port: conInfo.dbconfig.port[0] + }); + + connection.connect(function (err) { + if (err) { + throw err; + }; + console.log("Connected to MYSQL database!"); + }); +}); + + + +function passcheck(user,pass) { + return new Promise(function(resolve, reject) { + connection.query('SELECT * FROM tbl_accounts', function(err, rows, fields) { + let ret = []; + if (err) { + return reject(err); + } + for (var i = 0; i < rows.length; i++) { + if (rows[i].acc_login.localeCompare(user) === 0) { + if (bcrypt.compareSync(pass, rows[i].acc_password)) { + ret += rows[i]; + } + } + } + resolve(ret); + }); + }); +} + +function getContacts() { + return new Promise (function(resolve, reject) { + let conTab = [] + connection.query('SELECT * FROM tbl_contacts', function (err, rows, fields) { + if (err) throw err; + resolve(rows); + }); + }); +} + +function addContacts(contact) { + let newCon = { + name: contact.name, + category: contact.category, + location: contact.location, + contact_info: contact.contact, + email: contact.email, + website: contact.website, + } + return new Promise (function (resolve, reject) { + connection.query('SELECT * FROM tbl_contacts where name=?', contact.name, function(err, rows, fields) { + if (err) throw err; + console.log("Table found") + if (rows.length > 0) { + // Duplicate + console.log("found Duplicate name!"); + resolve(false); + } else { + connection.query('INSERT tbl_contacts SET ?', newCon, function (err, result) { //Parameterized insert + if (err) throw err; + console.log("Values inserted."); + resolve(true); + }); + } + }); + }); +} + + + +function editContact(contact) { + let edit = { + name: contact.name, + category: contact.category, + location: contact.location, + contact_info: contact.contact, + email: contact.email, + website: contact.website, + } + + return new Promise(function (resolve, reject) { + connection.query('SELECT * FROM tbl_contacts where name=?', contact.name, function (err, rows, fields) { + if (err) throw err; + if (rows.length == 0) { + console.log("Name Changed!"); + resolve(false); + } else { + connection.query('UPDATE tbl_contacts SET ? WHERE name=?', [edit, edit.name], function(err, result) { + if (err) throw err; + console.log("Value edited successfully?") + resolve(true); + }); + } + }); + }); +} + +function deleteContact(contact) { + return new Promise(function(resolve, reject) { + connection.query('DELETE FROM tbl_contacts WHERE name=?', contact, function (err, result) { + if (err) throw err; + console.log("Row deleted!") + resolve(); + }) + }) +} + + + + +exports.addContact = addContacts; +exports.query = passcheck; +exports.getContacts = getContacts; +exports.deleteContact = deleteContact; +exports.editContact = editContact; diff --git a/csci4131/hw7/index.js b/csci4131/hw7/index.js new file mode 100644 index 0000000..851b096 --- /dev/null +++ b/csci4131/hw7/index.js @@ -0,0 +1,109 @@ +// YOU CAN USE THIS FILE AS REFERENCE FOR SERVER DEVELOPMENT +const createError = require('http-errors'); + +// Include the express module +const express = require('express'); + +// helps in extracting the body portion of an incoming request stream +var bodyparser = require('body-parser'); + +// Path module - provides utilities for working with file and directory paths. +const path = require('path'); + +// Helps in managing user sessions +const session = require('express-session'); + +// include the mysql module +var mysql = require('mysql'); + +// Bcrypt library for comparing password hashes +const bcrypt = require('bcrypt'); + +// Include the express router. +const utilities = require('./api/utilities'); + +const port = 9001; + +// create an express application +const app = express(); + +// Use express-session +// In-memory session is sufficient for this assignment +app.use(session({ + secret: "csci4131secretkey", + saveUninitialized: true, + resave: false + } +)); + +// middle ware to serve static files +app.use(express.static(path.join(__dirname, 'public'))); + +// server listens on port for incoming connections +app.listen(port, () => console.log('Listening on port', port)); + +app.get('/', function (req, res) { + res.sendFile(path.join(__dirname, 'public/welcome.html')); +}); + +// GET method route for the contacts page. +// It serves contact.html present in public folder +app.get('/contacts', function(req, res) { + if(!req.session.user) { + res.redirect('/login'); + } else { + res.sendFile(path.join(__dirname, 'public/contacts.html')); + } +}); + +app.get('/stocks', function(req, res) { + res.redirect('/stock'); +}) + +app.get('/stock', function (req, res) { + if (!req.session.user) { + res.redirect('/login'); + } else { + res.sendFile(path.join(__dirname, 'public/stock.html')); + } +}); + +app.get('/addContact', function (req, res) { + if (!req.session.user) { + res.redirect('/login'); + } else { + res.sendFile(path.join(__dirname, 'public/addContact.html')); + } +}); + +app.get('/login', function (req, res) { + if (req.session.user) { + res.redirect('/contacts'); + } else { + res.sendFile(path.join(__dirname, 'login.html')); + } +}); + +app.get('/logout', function(req, res) { + res.redirect('/api/logout') +}); + +// Makes Express use a router called utilities +app.use('/api', utilities); + +// function to return the 404 message and error to client +app.use(function (req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function (err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + // res.render('error'); + res.send(); +}); diff --git a/csci4131/hw7/insert_into_accounts_table.js b/csci4131/hw7/insert_into_accounts_table.js new file mode 100644 index 0000000..0be14ce --- /dev/null +++ b/csci4131/hw7/insert_into_accounts_table.js @@ -0,0 +1,45 @@ +/* +TO DO: +----- +READ ALL COMMENTS AND REPLACE VALUES ACCORDINGLY +*/ + +const mysql = require("mysql"); +const bcrypt = require('bcrypt'); + +const dbCon = mysql.createConnection({ + host: "cse-mysql-classes-01.cse.umn.edu", + user: "C4131S21U83", // replace with the database user provided to you + password: "6919", // replace with the database password provided to you + database: "C4131S21U83", // replace with the database user provided to you + port: 3306 +}); + +console.log("Attempting database connection"); +dbCon.connect(function (err) { + if (err) { + throw err; + } + + console.log("Connected to database!"); + + const saltRounds = 10; + const myPlaintextPassword = 'admin%'; // replace with password chosen by you OR retain the same value + const passwordHash = bcrypt.hashSync(myPlaintextPassword, saltRounds); + + const rowToBeInserted = { + acc_name: 'admin$', // replace with acc_name chosen by you OR retain the same value + acc_login: 'admin$', // replace with acc_login chosen by you OR retain the same value + acc_password: passwordHash + }; + + console.log("Attempting to insert record into tbl_accounts"); + dbCon.query('INSERT tbl_accounts SET ?', rowToBeInserted, function (err, result) { + if (err) { + throw err; + } + console.log("Table record inserted!"); + }); + + dbCon.end(); +}); diff --git a/csci4131/hw7/login.html b/csci4131/hw7/login.html new file mode 100644 index 0000000..9bb80cc --- /dev/null +++ b/csci4131/hw7/login.html @@ -0,0 +1,48 @@ + + + + + + + + + +
+

Login Page

+
+

+
+
+ + +
+
+ + +
+ +
+
+ + + diff --git a/csci4131/hw7/package.json b/csci4131/hw7/package.json new file mode 100644 index 0000000..0598cc4 --- /dev/null +++ b/csci4131/hw7/package.json @@ -0,0 +1,21 @@ +{ + "name": "strap012_hw7", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "node index.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "bcrypt": "^5.0.1", + "body-parser": "^1.19.0", + "express": "^4.17.1", + "express-session": "^1.17.1", + "http-errors": "^1.8.0", + "mysql": "^2.18.1", + "xml2js": "^0.4.23" + } +} diff --git a/csci4131/hw7/public/contacts_old.html b/csci4131/hw7/public/contacts_old.html new file mode 100644 index 0000000..d0131ee --- /dev/null +++ b/csci4131/hw7/public/contacts_old.html @@ -0,0 +1,82 @@ + + + + + + + + + + + +

+ +
+ + + + + + + + + + + + + +
NameCategoryLocationContact InformationEmailWebsite
(URL)
+
+ + + \ No newline at end of file diff --git a/csci4131/hw7/public/stock.html b/csci4131/hw7/public/stock.html new file mode 100644 index 0000000..ae9d077 --- /dev/null +++ b/csci4131/hw7/public/stock.html @@ -0,0 +1,123 @@ + + + + + + + + + + + + + +

+ +
+
+
Welcome to Stock Page
+
+
+ +
+
+
+ + + + + + + + + + +
Company +
+ +
+
+ +
+
+
+
+ +
+
+
+ +
+ + + + + + + +
+      
+ +
Company-MetaDataStock-Info
+
+ + + + diff --git a/csci4131/hw7/public/welcome.html b/csci4131/hw7/public/welcome.html new file mode 100644 index 0000000..095023e --- /dev/null +++ b/csci4131/hw7/public/welcome.html @@ -0,0 +1,53 @@ + + + + + + + + + Welcome to Node.js + + + + +
+

Welcome to Express (Node.js)

+

The objective of this assignment is to develop a basic website with:

+

Express which is a Node.js web application framework.

+
+

Following are some useful resources:

+ + + +
+
+ +
+ +
+
+
+ +
+
+
+ + -- cgit v1.2.3