List of commits:
Subject Hash Author Date (UTC)
Initial Commit 37c741a4c5b2635ec05ddfed999928f2354bc6df EyadMohammedOsama 2019-10-10 20:20:17
Commit 37c741a4c5b2635ec05ddfed999928f2354bc6df - Initial Commit
Author: EyadMohammedOsama
Author date (UTC): 2019-10-10 20:20
Committer name: EyadMohammedOsama
Committer date (UTC): 2019-10-10 20:20
Parent(s):
Signing key:
Tree: 01bb452766e94a76539883868e820ba3257ba316
File Lines added Lines deleted
.gitignore 1 0
LoginExample.sql 76 0
app.js 76 0
bin/www 90 0
models/db-credentials.js 10 0
models/db.js 15 0
models/users.js 13 0
package-lock.json 578 0
package.json 19 0
public/stylesheets/style.css 8 0
routes/index.js 11 0
routes/login.js 25 0
routes/logout.js 9 0
routes/user.js 14 0
views/Layout/body.ejs 9 0
views/Layout/header.ejs 3 0
views/error.ejs 3 0
views/index.ejs 37 0
views/user.ejs 13 0
File .gitignore added (mode: 100644) (index 0000000..40b878d)
1 node_modules/
File LoginExample.sql added (mode: 100644) (index 0000000..144b490)
1 -- phpMyAdmin SQL Dump
2 -- version 4.8.2
3 -- https://www.phpmyadmin.net/
4 --
5 -- Host: 127.0.0.1
6 -- Generation Time: Oct 10, 2019 at 10:18 PM
7 -- Server version: 10.1.34-MariaDB
8 -- PHP Version: 7.2.7
9
10 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
11 SET AUTOCOMMIT = 0;
12 START TRANSACTION;
13 SET time_zone = "+00:00";
14
15
16 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
17 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
18 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
19 /*!40101 SET NAMES utf8mb4 */;
20
21 --
22 -- Database: `LoginExample`
23 --
24 CREATE DATABASE IF NOT EXISTS `LoginExample` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
25 USE `LoginExample`;
26
27 -- --------------------------------------------------------
28
29 --
30 -- Table structure for table `Sessions`
31 --
32
33 CREATE TABLE `Sessions` (
34 `ID` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
35 `ExpirationDate` int(11) UNSIGNED NOT NULL,
36 `Data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
37 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
38
39 -- --------------------------------------------------------
40
41 --
42 -- Table structure for table `Users`
43 --
44
45 CREATE TABLE `Users` (
46 `Username` varchar(40) COLLATE utf8_bin NOT NULL,
47 `Password` varchar(1024) COLLATE utf8_bin NOT NULL
48 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
49
50 --
51 -- Dumping data for table `Users`
52 --
53
54 INSERT INTO `Users` (`Username`, `Password`) VALUES
55 ('Someone', '1234');
56
57 --
58 -- Indexes for dumped tables
59 --
60
61 --
62 -- Indexes for table `Sessions`
63 --
64 ALTER TABLE `Sessions`
65 ADD PRIMARY KEY (`ID`);
66
67 --
68 -- Indexes for table `Users`
69 --
70 ALTER TABLE `Users`
71 ADD PRIMARY KEY (`Username`);
72 COMMIT;
73
74 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
75 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
76 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
File app.js added (mode: 100644) (index 0000000..30b3f19)
1 let createError = require("http-errors");
2 let express = require("express");
3 let path = require("path");
4 let cookieParser = require("cookie-parser");
5 let logger = require("morgan");
6 let session = require("express-session");
7 let MySQLStore = require("express-mysql-session")(session);
8
9 let indexRouter = require("./routes/index");
10 let loginRouter = require("./routes/login");
11 let userRouter = require("./routes/user");
12 let logoutRouter = require("./routes/logout");
13
14 let app = express();
15 let credentials = require("./models/db-credentials");
16 let sessionStore = new MySQLStore({
17 host : credentials.host,
18 port : credentials.port,
19 user : credentials.user,
20 password : credentials.password,
21 database : credentials.database,
22 clearExpired : true,
23 checkExpirationInterval : 3600000, // Each hour, let's check whether there are expired sessions to remove
24 charset : "utf8_bin",
25 schema : {
26 tableName : "Sessions",
27 columnNames : {
28 session_id : "ID",
29 expires : "ExpirationDate",
30 data : "Data"
31 }
32 }
33 });
34
35 // view engine setup
36 app.set("views", path.join(__dirname, "views"));
37 app.set("view engine", "ejs");
38
39 app.use(logger("dev"));
40 app.use(express.json());
41 app.use(express.urlencoded({ extended: false }));
42 app.use(cookieParser());
43 app.use(express.static(path.join(__dirname, "public")));
44 app.use(session({
45 key : "global_session_cookie",
46 secret : "This is a secret",
47 store : sessionStore,
48 resave : false,
49 saveUninitialized : false,
50 cookie : {
51 maxAge : 1440000 // Each session is valid for 24 minutes
52 }
53 }));
54
55 app.use("/", indexRouter);
56 app.use("/login", loginRouter);
57 app.use("/user", userRouter);
58 app.use("/logout", logoutRouter);
59
60 // catch 404 and forward to error handler
61 app.use(function(req, res, next) {
62 next(createError(404));
63 });
64
65 // error handler
66 app.use(function(err, req, res, next) {
67 // set locals, only providing error in development
68 res.locals.message = err.message;
69 res.locals.error = req.app.get("env") === "development" ? err : {};
70
71 // render the error page
72 res.status(err.status || 500);
73 res.render("error");
74 });
75
76 module.exports = app;
File bin/www added (mode: 100644) (index 0000000..1d49d91)
1 #!/usr/bin/env node
2
3 /**
4 * Module dependencies.
5 */
6
7 var app = require('../app');
8 var debug = require('debug')('express-login-example:server');
9 var http = require('http');
10
11 /**
12 * Get port from environment and store in Express.
13 */
14
15 var port = normalizePort(process.env.PORT || '3000');
16 app.set('port', port);
17
18 /**
19 * Create HTTP server.
20 */
21
22 var server = http.createServer(app);
23
24 /**
25 * Listen on provided port, on all network interfaces.
26 */
27
28 server.listen(port);
29 server.on('error', onError);
30 server.on('listening', onListening);
31
32 /**
33 * Normalize a port into a number, string, or false.
34 */
35
36 function normalizePort(val) {
37 var port = parseInt(val, 10);
38
39 if (isNaN(port)) {
40 // named pipe
41 return val;
42 }
43
44 if (port >= 0) {
45 // port number
46 return port;
47 }
48
49 return false;
50 }
51
52 /**
53 * Event listener for HTTP server "error" event.
54 */
55
56 function onError(error) {
57 if (error.syscall !== 'listen') {
58 throw error;
59 }
60
61 var bind = typeof port === 'string'
62 ? 'Pipe ' + port
63 : 'Port ' + port;
64
65 // handle specific listen errors with friendly messages
66 switch (error.code) {
67 case 'EACCES':
68 console.error(bind + ' requires elevated privileges');
69 process.exit(1);
70 break;
71 case 'EADDRINUSE':
72 console.error(bind + ' is already in use');
73 process.exit(1);
74 break;
75 default:
76 throw error;
77 }
78 }
79
80 /**
81 * Event listener for HTTP server "listening" event.
82 */
83
84 function onListening() {
85 var addr = server.address();
86 var bind = typeof addr === 'string'
87 ? 'pipe ' + addr
88 : 'port ' + addr.port;
89 debug('Listening on ' + bind);
90 }
File models/db-credentials.js added (mode: 100644) (index 0000000..eb34f6d)
1 // Global database configuration
2 const DBCredentials = {
3 host : "localhost",
4 port : 3306,
5 user : "root",
6 password : "",
7 database : "LoginExample",
8 };
9
10 module.exports = DBCredentials;
File models/db.js added (mode: 100644) (index 0000000..5212519)
1 const mysql = require("mysql");
2 const credentials = require("./db-credentials");
3 const connection = mysql.createConnection({
4 host : credentials.host,
5 port : credentials.port,
6 user : credentials.user,
7 password : credentials.password,
8 database : credentials.database
9 });
10
11 connection.connect((err) => {
12 if (err) throw err;
13 });
14
15 module.exports = connection;
File models/users.js added (mode: 100644) (index 0000000..9b87117)
1 const db = require("./db");
2
3 let Users = {};
4
5 Users.UserExist = function(username, password, callback) {
6 let query = "SELECT * FROM `Users` WHERE `Username` = " + db.escape(username) + " AND `Password` = " + db.escape(password);
7 db.query(query, function(err, res, fields) {
8 if (err) throw err;
9 callback(res.length === 1);
10 });
11 };
12
13 module.exports = Users;
File package-lock.json added (mode: 100644) (index 0000000..7b396d3)
1 {
2 "name": "express-login-example",
3 "version": "0.0.0",
4 "lockfileVersion": 1,
5 "requires": true,
6 "dependencies": {
7 "accepts": {
8 "version": "1.3.7",
9 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
10 "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
11 "requires": {
12 "mime-types": "~2.1.24",
13 "negotiator": "0.6.2"
14 }
15 },
16 "array-flatten": {
17 "version": "1.1.1",
18 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
19 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
20 },
21 "basic-auth": {
22 "version": "2.0.1",
23 "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
24 "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
25 "requires": {
26 "safe-buffer": "5.1.2"
27 }
28 },
29 "bignumber.js": {
30 "version": "7.2.1",
31 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
32 "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ=="
33 },
34 "body-parser": {
35 "version": "1.18.3",
36 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
37 "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
38 "requires": {
39 "bytes": "3.0.0",
40 "content-type": "~1.0.4",
41 "debug": "2.6.9",
42 "depd": "~1.1.2",
43 "http-errors": "~1.6.3",
44 "iconv-lite": "0.4.23",
45 "on-finished": "~2.3.0",
46 "qs": "6.5.2",
47 "raw-body": "2.3.3",
48 "type-is": "~1.6.16"
49 }
50 },
51 "bytes": {
52 "version": "3.0.0",
53 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
54 "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
55 },
56 "content-disposition": {
57 "version": "0.5.2",
58 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
59 "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
60 },
61 "content-type": {
62 "version": "1.0.4",
63 "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
64 "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
65 },
66 "cookie": {
67 "version": "0.3.1",
68 "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
69 "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
70 },
71 "cookie-parser": {
72 "version": "1.4.4",
73 "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz",
74 "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==",
75 "requires": {
76 "cookie": "0.3.1",
77 "cookie-signature": "1.0.6"
78 }
79 },
80 "cookie-signature": {
81 "version": "1.0.6",
82 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
83 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
84 },
85 "core-util-is": {
86 "version": "1.0.2",
87 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
88 "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
89 },
90 "crc": {
91 "version": "3.4.4",
92 "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
93 "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
94 },
95 "debug": {
96 "version": "2.6.9",
97 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
98 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
99 "requires": {
100 "ms": "2.0.0"
101 }
102 },
103 "depd": {
104 "version": "1.1.2",
105 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
106 "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
107 },
108 "destroy": {
109 "version": "1.0.4",
110 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
111 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
112 },
113 "ee-first": {
114 "version": "1.1.1",
115 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
116 "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
117 },
118 "ejs": {
119 "version": "2.6.2",
120 "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz",
121 "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q=="
122 },
123 "encodeurl": {
124 "version": "1.0.2",
125 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
126 "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
127 },
128 "escape-html": {
129 "version": "1.0.3",
130 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
131 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
132 },
133 "etag": {
134 "version": "1.8.1",
135 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
136 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
137 },
138 "express": {
139 "version": "4.16.4",
140 "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
141 "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
142 "requires": {
143 "accepts": "~1.3.5",
144 "array-flatten": "1.1.1",
145 "body-parser": "1.18.3",
146 "content-disposition": "0.5.2",
147 "content-type": "~1.0.4",
148 "cookie": "0.3.1",
149 "cookie-signature": "1.0.6",
150 "debug": "2.6.9",
151 "depd": "~1.1.2",
152 "encodeurl": "~1.0.2",
153 "escape-html": "~1.0.3",
154 "etag": "~1.8.1",
155 "finalhandler": "1.1.1",
156 "fresh": "0.5.2",
157 "merge-descriptors": "1.0.1",
158 "methods": "~1.1.2",
159 "on-finished": "~2.3.0",
160 "parseurl": "~1.3.2",
161 "path-to-regexp": "0.1.7",
162 "proxy-addr": "~2.0.4",
163 "qs": "6.5.2",
164 "range-parser": "~1.2.0",
165 "safe-buffer": "5.1.2",
166 "send": "0.16.2",
167 "serve-static": "1.13.2",
168 "setprototypeof": "1.1.0",
169 "statuses": "~1.4.0",
170 "type-is": "~1.6.16",
171 "utils-merge": "1.0.1",
172 "vary": "~1.1.2"
173 }
174 },
175 "express-mysql-session": {
176 "version": "2.1.0",
177 "resolved": "https://registry.npmjs.org/express-mysql-session/-/express-mysql-session-2.1.0.tgz",
178 "integrity": "sha512-GOS0/Z8X7NX9/9ZHNdyZsuJj1alvoWEdXurgZClFXCaKlggcmPelIxyr5NbcZoJse+QFHUTqcQ0Ol8OQcPA43Q==",
179 "requires": {
180 "debug": "4.1.0",
181 "express-session": "1.15.6",
182 "mysql": "2.16.0",
183 "underscore": "1.9.1"
184 },
185 "dependencies": {
186 "bignumber.js": {
187 "version": "4.1.0",
188 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz",
189 "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA=="
190 },
191 "debug": {
192 "version": "4.1.0",
193 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
194 "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
195 "requires": {
196 "ms": "^2.1.1"
197 }
198 },
199 "express-session": {
200 "version": "1.15.6",
201 "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz",
202 "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==",
203 "requires": {
204 "cookie": "0.3.1",
205 "cookie-signature": "1.0.6",
206 "crc": "3.4.4",
207 "debug": "2.6.9",
208 "depd": "~1.1.1",
209 "on-headers": "~1.0.1",
210 "parseurl": "~1.3.2",
211 "uid-safe": "~2.1.5",
212 "utils-merge": "1.0.1"
213 },
214 "dependencies": {
215 "debug": {
216 "version": "2.6.9",
217 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
218 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
219 "requires": {
220 "ms": "2.0.0"
221 }
222 },
223 "ms": {
224 "version": "2.0.0",
225 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
226 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
227 }
228 }
229 },
230 "ms": {
231 "version": "2.1.2",
232 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
233 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
234 },
235 "mysql": {
236 "version": "2.16.0",
237 "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz",
238 "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==",
239 "requires": {
240 "bignumber.js": "4.1.0",
241 "readable-stream": "2.3.6",
242 "safe-buffer": "5.1.2",
243 "sqlstring": "2.3.1"
244 }
245 }
246 }
247 },
248 "express-session": {
249 "version": "1.16.2",
250 "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.2.tgz",
251 "integrity": "sha512-oy0sRsdw6n93E9wpCNWKRnSsxYnSDX9Dnr9mhZgqUEEorzcq5nshGYSZ4ZReHFhKQ80WI5iVUUSPW7u3GaKauw==",
252 "requires": {
253 "cookie": "0.3.1",
254 "cookie-signature": "1.0.6",
255 "debug": "2.6.9",
256 "depd": "~2.0.0",
257 "on-headers": "~1.0.2",
258 "parseurl": "~1.3.3",
259 "safe-buffer": "5.1.2",
260 "uid-safe": "~2.1.5"
261 },
262 "dependencies": {
263 "depd": {
264 "version": "2.0.0",
265 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
266 "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
267 }
268 }
269 },
270 "finalhandler": {
271 "version": "1.1.1",
272 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
273 "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
274 "requires": {
275 "debug": "2.6.9",
276 "encodeurl": "~1.0.2",
277 "escape-html": "~1.0.3",
278 "on-finished": "~2.3.0",
279 "parseurl": "~1.3.2",
280 "statuses": "~1.4.0",
281 "unpipe": "~1.0.0"
282 }
283 },
284 "forwarded": {
285 "version": "0.1.2",
286 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
287 "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
288 },
289 "fresh": {
290 "version": "0.5.2",
291 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
292 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
293 },
294 "http-errors": {
295 "version": "1.6.3",
296 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
297 "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
298 "requires": {
299 "depd": "~1.1.2",
300 "inherits": "2.0.3",
301 "setprototypeof": "1.1.0",
302 "statuses": ">= 1.4.0 < 2"
303 }
304 },
305 "iconv-lite": {
306 "version": "0.4.23",
307 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
308 "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
309 "requires": {
310 "safer-buffer": ">= 2.1.2 < 3"
311 }
312 },
313 "inherits": {
314 "version": "2.0.3",
315 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
316 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
317 },
318 "ipaddr.js": {
319 "version": "1.9.0",
320 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
321 "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
322 },
323 "isarray": {
324 "version": "1.0.0",
325 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
326 "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
327 },
328 "media-typer": {
329 "version": "0.3.0",
330 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
331 "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
332 },
333 "merge-descriptors": {
334 "version": "1.0.1",
335 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
336 "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
337 },
338 "methods": {
339 "version": "1.1.2",
340 "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
341 "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
342 },
343 "mime": {
344 "version": "1.4.1",
345 "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
346 "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
347 },
348 "mime-db": {
349 "version": "1.40.0",
350 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
351 "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
352 },
353 "mime-types": {
354 "version": "2.1.24",
355 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
356 "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
357 "requires": {
358 "mime-db": "1.40.0"
359 }
360 },
361 "morgan": {
362 "version": "1.9.1",
363 "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
364 "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
365 "requires": {
366 "basic-auth": "~2.0.0",
367 "debug": "2.6.9",
368 "depd": "~1.1.2",
369 "on-finished": "~2.3.0",
370 "on-headers": "~1.0.1"
371 }
372 },
373 "ms": {
374 "version": "2.0.0",
375 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
376 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
377 },
378 "mysql": {
379 "version": "2.17.1",
380 "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz",
381 "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==",
382 "requires": {
383 "bignumber.js": "7.2.1",
384 "readable-stream": "2.3.6",
385 "safe-buffer": "5.1.2",
386 "sqlstring": "2.3.1"
387 }
388 },
389 "negotiator": {
390 "version": "0.6.2",
391 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
392 "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
393 },
394 "on-finished": {
395 "version": "2.3.0",
396 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
397 "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
398 "requires": {
399 "ee-first": "1.1.1"
400 }
401 },
402 "on-headers": {
403 "version": "1.0.2",
404 "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
405 "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
406 },
407 "parseurl": {
408 "version": "1.3.3",
409 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
410 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
411 },
412 "path-to-regexp": {
413 "version": "0.1.7",
414 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
415 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
416 },
417 "process-nextick-args": {
418 "version": "2.0.1",
419 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
420 "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
421 },
422 "proxy-addr": {
423 "version": "2.0.5",
424 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
425 "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
426 "requires": {
427 "forwarded": "~0.1.2",
428 "ipaddr.js": "1.9.0"
429 }
430 },
431 "qs": {
432 "version": "6.5.2",
433 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
434 "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
435 },
436 "random-bytes": {
437 "version": "1.0.0",
438 "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
439 "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
440 },
441 "range-parser": {
442 "version": "1.2.1",
443 "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
444 "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
445 },
446 "raw-body": {
447 "version": "2.3.3",
448 "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
449 "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
450 "requires": {
451 "bytes": "3.0.0",
452 "http-errors": "1.6.3",
453 "iconv-lite": "0.4.23",
454 "unpipe": "1.0.0"
455 }
456 },
457 "readable-stream": {
458 "version": "2.3.6",
459 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
460 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
461 "requires": {
462 "core-util-is": "~1.0.0",
463 "inherits": "~2.0.3",
464 "isarray": "~1.0.0",
465 "process-nextick-args": "~2.0.0",
466 "safe-buffer": "~5.1.1",
467 "string_decoder": "~1.1.1",
468 "util-deprecate": "~1.0.1"
469 }
470 },
471 "safe-buffer": {
472 "version": "5.1.2",
473 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
474 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
475 },
476 "safer-buffer": {
477 "version": "2.1.2",
478 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
479 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
480 },
481 "send": {
482 "version": "0.16.2",
483 "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
484 "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
485 "requires": {
486 "debug": "2.6.9",
487 "depd": "~1.1.2",
488 "destroy": "~1.0.4",
489 "encodeurl": "~1.0.2",
490 "escape-html": "~1.0.3",
491 "etag": "~1.8.1",
492 "fresh": "0.5.2",
493 "http-errors": "~1.6.2",
494 "mime": "1.4.1",
495 "ms": "2.0.0",
496 "on-finished": "~2.3.0",
497 "range-parser": "~1.2.0",
498 "statuses": "~1.4.0"
499 }
500 },
501 "serve-static": {
502 "version": "1.13.2",
503 "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
504 "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
505 "requires": {
506 "encodeurl": "~1.0.2",
507 "escape-html": "~1.0.3",
508 "parseurl": "~1.3.2",
509 "send": "0.16.2"
510 }
511 },
512 "setprototypeof": {
513 "version": "1.1.0",
514 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
515 "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
516 },
517 "sqlstring": {
518 "version": "2.3.1",
519 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
520 "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
521 },
522 "statuses": {
523 "version": "1.4.0",
524 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
525 "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
526 },
527 "string_decoder": {
528 "version": "1.1.1",
529 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
530 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
531 "requires": {
532 "safe-buffer": "~5.1.0"
533 }
534 },
535 "type-is": {
536 "version": "1.6.18",
537 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
538 "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
539 "requires": {
540 "media-typer": "0.3.0",
541 "mime-types": "~2.1.24"
542 }
543 },
544 "uid-safe": {
545 "version": "2.1.5",
546 "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
547 "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
548 "requires": {
549 "random-bytes": "~1.0.0"
550 }
551 },
552 "underscore": {
553 "version": "1.9.1",
554 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
555 "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
556 },
557 "unpipe": {
558 "version": "1.0.0",
559 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
560 "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
561 },
562 "util-deprecate": {
563 "version": "1.0.2",
564 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
565 "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
566 },
567 "utils-merge": {
568 "version": "1.0.1",
569 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
570 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
571 },
572 "vary": {
573 "version": "1.1.2",
574 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
575 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
576 }
577 }
578 }
File package.json added (mode: 100644) (index 0000000..f52ee92)
1 {
2 "name": "express-login-example",
3 "version": "0.0.0",
4 "private": true,
5 "scripts": {
6 "start": "nodemon ./bin/www"
7 },
8 "dependencies": {
9 "cookie-parser": "~1.4.4",
10 "debug": "~2.6.9",
11 "ejs": "~2.6.1",
12 "express": "~4.16.1",
13 "express-mysql-session": "^2.1.0",
14 "express-session": "^1.16.2",
15 "http-errors": "~1.6.3",
16 "morgan": "~1.9.1",
17 "mysql": "^2.17.1"
18 }
19 }
File public/stylesheets/style.css added (mode: 100644) (index 0000000..9453385)
1 body {
2 padding: 50px;
3 font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 }
5
6 a {
7 color: #00B7FF;
8 }
File routes/index.js added (mode: 100644) (index 0000000..5feb675)
1 var express = require("express");
2 var router = express.Router();
3
4 router.get("/", function(req, res, next) {
5 res.render("../views/Layout/Body", {
6 title: "Login page",
7 view : "../index"
8 });
9 });
10
11 module.exports = router;
File routes/login.js added (mode: 100644) (index 0000000..817a4bf)
1 let express = require("express");
2 let router = express.Router();
3 let Users = require("../models/users");
4
5 router.post("/", function(req, res, next) {
6 let username = req.body.username;
7 let password = req.body.password;
8 Users.UserExist(username, password, function(result) {
9 if (result === true) {
10 req.session.username = username;
11 res.send({
12 redirect : true,
13 message : "Logged in successfully, you're being redirected"
14 });
15 }
16 else {
17 res.send({
18 redirect : false,
19 message : "The user wasn't found"
20 });
21 }
22 });
23 });
24
25 module.exports = router;
File routes/logout.js added (mode: 100644) (index 0000000..689d7d3)
1 var express = require("express");
2 var router = express.Router();
3
4 router.get("/", function(req, res, next) {
5 req.session.destroy();
6 res.redirect("/");
7 });
8
9 module.exports = router;
File routes/user.js added (mode: 100644) (index 0000000..a255275)
1 var express = require("express");
2 var router = express.Router();
3
4 router.get("/", function(req, res, next) {
5 let loggedin = (typeof req.session.username !== "undefined");
6 res.render("../views/Layout/Body", {
7 title: "User profile",
8 view : "../user",
9 loggedin : loggedin,
10 username : req.session.username
11 });
12 });
13
14 module.exports = router;
File views/Layout/body.ejs added (mode: 100644) (index 0000000..060ad87)
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <%- include('./Header.ejs') -%>
5 </head>
6 <body>
7 <%- include(view) -%>
8 </body>
9 </html>
File views/Layout/header.ejs added (mode: 100644) (index 0000000..175ba03)
1 <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
2 <title><%= title %></title>
3 <meta charset="UTF-8"/>
File views/error.ejs added (mode: 100644) (index 0000000..58f8255)
1 <h1><%= message %></h1>
2 <h2><%= error.status %></h2>
3 <pre><%= error.stack %></pre>
File views/index.ejs added (mode: 100644) (index 0000000..69c3147)
1 <form id="login-form">
2 <p>
3 Enter your username:
4 <input type="text" id="username"/>
5 </p>
6 <p>
7 Enter your password:
8 <input type="password" id="password"/>
9 </p>
10 <button type="submit">Login</button>
11 <div id="result"></div>
12 </form>
13 <script>
14 $(document).ready(function() {
15 $("#login-form").on("submit", function(e) {
16 e.preventDefault();
17 let _username = $("#username").val();
18 let _password = $("#password").val();
19 $.ajax({
20 url : "login",
21 type : "POST",
22 data : {
23 username : _username,
24 password : _password
25 },
26 success : function(response, status, xhr) {
27 $("#result").html(response.message);
28 if (response.redirect) {
29 window.setTimeout(function() {
30 window.location.href = "user";
31 }, 2000);
32 }
33 }
34 });
35 });
36 });
37 </script>
File views/user.ejs added (mode: 100644) (index 0000000..2d9e64d)
1 <% if (loggedin) { %>
2 <p>Hello <%= username %></p>
3 <button type="button" id="logout">Logout</button>
4 <script>
5 $(document).ready(function() {
6 $("#logout").on("click", function() {
7 window.location.href = "logout";
8 });
9 });
10 </script>
11 <% } else { %>
12 <p>You're not loggedin</p>
13 <% } %>
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/EyadMohammedOsama/Express-Login-System

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/EyadMohammedOsama/Express-Login-System

Clone this repository using git:
git clone git://git.rocketgit.com/user/EyadMohammedOsama/Express-Login-System

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main