· 9 years ago · Apr 12, 2017, 02:52 AM
1var express = require('express');
2var app = express();
3var bodyParser = require('body-parser');
4var path = require('path');
5var formidable = require('formidable');
6var fs = require('fs');
7app.use(express.static(path.join(__dirname, 'public')));
8app.use(bodyParser.json());
9app.use(bodyParser.urlencoded({
10 extended: true
11}));
12
13
14//passport for login credentials
15var passport = require('passport');
16var LocalStrategy = require('passport-local').Strategy; //here we implement the strategy that passport uses
17
18var crypto = require('crypto');
19var sqlite3 = require('sqlite3');
20
21var db = new sqlite3.Database('users.sqlite3');
22var check;
23db.serialize(function() {
24
25 db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, salt TEXT)");
26 console.log('user table created');
27 db.run("DELETE FROM users"); //clear table on run for debug
28 var stmt = db.prepare("INSERT INTO users VALUES (?,?,?,?)");
29 stmt.run('15', 'tg', 'tg', "333");
30 stmt.finalize();
31
32 db.each("SELECT username, password, id, salt FROM users", function(err, row) {
33 console.log(row.username + ": " + row.password + ": " + row.id + ': ' + row.salt);
34 });
35});
36
37//db.close();
38
39
40function hashPassword(password, salt) {
41 console.log('password hashing');
42 var hash = crypto.createHash('sha256');
43 hash.update(password);
44 hash.update(salt);
45 return hash.digest('hex');
46}
47
48passport.use(new LocalStrategy(function(username, password, done) {
49 console.log('using local strat for passport');
50 db.get('SELECT salt FROM users WHERE username = ?', username, function(err, row) {
51 if (!row) return done(null, false);
52 var hash = hashPassword(password, row.salt);
53 console.log('done hashing');
54 db.get('SELECT username, id FROM users WHERE username = ? AND password = ?', username, hash, function(err, row) {
55 if (!row){
56 console.log('failure');
57 return done(null, false);
58 }
59 console.log('success');
60 return done(null, row);
61 });
62 });
63}));
64
65passport.serializeUser(function(user, done) {
66 console.log('serializing');
67 return done(null, user.id);
68});
69
70passport.deserializeUser(function(id, done) {
71 console.log('deserializing')
72 db.get('SELECT id, username FROM users WHERE id = ?', id, function(err, row) {
73 if (!row) return done(null, false);
74 return done(null, row);
75 });
76});
77
78///end user authentication
79
80//on access to site, serve the user the login page
81app.get('/', function(req, res){
82 res.sendFile(path.join(__dirname, 'views/home.html'));
83
84});
85
86//providing routing access for success/failure on login attempt
87app.post('/login',
88 passport.authenticate('local', { successRedirect: '/home',
89 failureRedirect: '/fail' }));
90
91app.get('/fail', function(req,res){
92 res.sendFile(path.join(__dirname, 'views/error.html'));
93});
94
95app.get('/home', function(req,res){
96 res.sendFile(path.join(__dirname, 'views/home.html'));
97});
98
99app.get('/login', function(req,res){
100 res.sendFile(path.join(__dirname, 'views/login.html'));
101 console.log('login unsuccessful');
102});
103
104app.get('/home', function(request, response) {
105 response.render('views/home');
106});
107
108app.get('/upload' , function(req, res){
109 res.sendFile(__dirname + '/uploads');
110});
111
112app.post('/upload', function(req, res){
113
114 // create an incoming form object
115 var form = new formidable.IncomingForm();
116
117 // specify that we want to allow the user to upload multiple files in a single request
118 form.multiples = true;
119
120 // store all uploads in the /uploads directory
121 form.uploadDir = path.join(__dirname, '/uploads');
122
123 // every time a file has been uploaded successfully,
124 // rename it to it's orignal name
125 form.on('file', function(field, file) {
126 fs.rename(file.path, path.join(form.uploadDir, file.name));
127 });
128
129 // log any errors that occur
130 form.on('error', function(err) {
131 console.log('An error has occured: n' + err);
132 });
133
134 // once all the files have been uploaded, send a response to the client
135 form.on('end', function() {
136 res.end('success');
137 });
138
139 // parse the incoming request containing the form data
140 form.parse(req);
141
142});
143
144var server = app.listen(3000, function(){
145 console.log('Server listening on port 3000');
146});
147
148'use strict'
149
150$('.upload-btn').on('click', function (){
151 $('#upload-input').click();
152 $('.progress-bar').text('0%');
153 $('.progress-bar').width('0%');
154});
155
156$('#upload-input').on('change', function(){
157
158 var files = $(this).get(0).files;
159
160 if (files.length > 0){
161 // create a FormData object which will be sent as the data payload in the
162 // AJAX request
163 var formData = new FormData();
164
165 // loop through all the selected files and add them to the formData object
166 for (var i = 0; i < files.length; i++) {
167 var file = files[i];
168
169 // add the files to formData object for the data payload
170 formData.append('uploads[]', file, file.name);
171 }
172
173 $.ajax({
174 url: '/upload',
175 type: 'POST',
176 data: formData,
177 processData: false,
178 contentType: false,
179 success: function(data){
180 console.log('upload success');
181 },
182 xhr: function() {
183 // create an XMLHttpRequest
184 var xhr = new XMLHttpRequest();
185
186 // listen to the 'progress' event
187 xhr.upload.addEventListener('progress', function(evt) {
188
189 if (evt.lengthComputable) {
190 // calculate the percentage of upload completed
191 var percentComplete = evt.loaded / evt.total;
192 percentComplete = parseInt(percentComplete * 100);
193
194 // update the Bootstrap progress bar with the new percentage
195 $('.progress-bar').text(percentComplete + '%');
196 $('.progress-bar').width(percentComplete + '%');
197
198 // once the upload reaches 100%, set the progress bar text to done
199 if (percentComplete === 100) {
200 $('.progress-bar').html('Done');
201 console.log(formData);
202 showUploadedItem(file.name);
203 }
204
205
206 }
207
208
209 }, false);
210
211 return xhr;
212 }
213 });
214
215 }
216});
217
218
219function showUploadedItem (source) {
220 var list = document.getElementById("image-list"),
221 li = document.createElement("li"),
222 img = document.createElement("img");
223 img.src = source;
224 li.appendChild(img);
225 list.appendChild(li);
226}