Mingyu

Database Change to MongoDB

...@@ -17,6 +17,10 @@ var router = express.Router(); ...@@ -17,6 +17,10 @@ var router = express.Router();
17 var cookieParser = require('cookie-parser') 17 var cookieParser = require('cookie-parser')
18 var ExpressSession = require('express-session') 18 var ExpressSession = require('express-session')
19 19
20 +var database = require('./database/database');
21 +var config = require('./config');
22 +
23 +
20 // get port 24 // get port
21 var port = process.env.PORT || 3000; 25 var port = process.env.PORT || 3000;
22 app.set('port',port); 26 app.set('port',port);
...@@ -64,9 +68,25 @@ app.use(expressErrorHandler.httpError(404)); ...@@ -64,9 +68,25 @@ app.use(expressErrorHandler.httpError(404));
64 app.use(errorHandler); 68 app.use(errorHandler);
65 69
66 70
71 +// 프로세스 종료 시에 데이터베이스 연결 해제
72 +process.on('SIGTERM', function () {
73 + console.log("프로세스가 종료됩니다.");
74 + app.close();
75 +});
76 +
77 +app.on('close', function () {
78 + console.log("Express 서버 객체가 종료됩니다.");
79 + if (database.db) {
80 + database.db.close();
81 + }
82 +});
83 +
67 84
68 // for server listening 85 // for server listening
69 var server = http.createServer(app) 86 var server = http.createServer(app)
70 server.listen(port,function(){ 87 server.listen(port,function(){
71 console.log('익스프레스 서버를 시작했습니다.'); 88 console.log('익스프레스 서버를 시작했습니다.');
89 +
90 + database.init(app, config);
72 }) 91 })
92 +
......
1 +module.exports = {
2 + server_port: 3000,
3 + db_url: 'mongodb://oss:12341234@cluster0.us5lm.mongodb.net/?retryWrites=true&w=majority',
4 + db_schemas: [
5 + {file:'./user_schema', collection:'users3', schemaName:'UserSchema', modelName:'UserModel'}
6 + ]
7 +}
...\ No newline at end of file ...\ No newline at end of file
1 -const mysql = require('mysql')
2 -
3 -var pool = mysql.createPool({
4 - host: "localhost",
5 - user: "root",
6 - password: "1234",
7 - port: 3306,
8 - database: "rest_stop"
9 -})
10 -
11 -var adduser = function(name, id, password, callback) {
12 - console.log('addUser');
13 -
14 - pool.getConnection(function(err, conn) {
15 - if(err){
16 - if(conn){
17 - conn.release();
18 - }
19 -
20 - callback(err, null);
21 - return;
22 - }
23 -
24 - var data = {name:name, id:id, password:password};
25 -
26 - var exec = conn.query('insert into users set ?', data, function(err, result) {
27 - conn.release();
28 -
29 - if(err){
30 - console.log('SQL 실행 시 오류 발생');
31 - console.dir(err);
32 -
33 - callback(err,null);
34 -
35 - return;
36 - }
37 -
38 - callback(null, result);
39 - })
40 - })
41 -}
42 -
43 -var authUser = function(id, password, callback) {
44 - console.log('authUser 호출');
45 -
46 - pool.getConnection(function(err, conn) {
47 - if(err){
48 - if(conn){
49 - conn.release();
50 - }
51 -
52 - callback(err, null);
53 - return;
54 - }
55 -
56 - var colums = ['name', 'id'];
57 - var tablename = 'users';
58 -
59 - var exec = conn.query("select ?? from ?? where id = ? and password = ?",
60 - [colums, tablename, id, password], function(err, rows) {
61 - conn.release();
62 -
63 - if(rows.length >0){
64 - console.log('Id [%s], password [$s] 일치하는 사용자 찾음', id, password);
65 - callback(null, rows);
66 - } else {
67 - console.log('일치하는 사용자 없음');
68 - callback(null, null);
69 - }
70 - }
71 - );
72 - })
73 -}
74 -
75 -module.exports.pool = pool;
76 -module.exports.authUser = authUser;
77 -module.exports.adduser = adduser;
78 -//module.exports.listuser = listuser;
1 -const Connection = require('./Connection')
2 -
3 -var adduser = async (username,userId,userPassword) => {
4 - try {
5 - const query = `INSERT INTO ` +
6 - `accounts ` +
7 - `VALUES ` +
8 - `(null, '$(username)', '$(userId)', '$(userPassword)')`
9 -
10 - await Connection(query)
11 -
12 - return true;
13 - } catch (error) {
14 - return false;
15 - }
16 -};
17 -
18 -var login;
19 -
20 -var listuser = function(req, res) {
21 - console.log('user(user2.js) 모듈 안에 있는 listuser 호출됨.');
22 -
23 - // 데이터베이스 객체 참조
24 - var database = req.app.get('database');
25 -
26 - // 데이터베이스 객체가 초기화된 경우, 모델 객체의 findAll 메소드 호출
27 - if (database.db) {
28 - // 1. 모든 사용자 검색
29 - database.UserModel.findAll(function(err, results) {
30 - // 에러 발생 시, 클라이언트로 에러 전송
31 - if (err) {
32 - console.error('사용자 리스트 조회 중 에러 발생 : ' + err.stack);
33 -
34 - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
35 - res.write('<h2>사용자 리스트 조회 중 에러 발생</h2>');
36 - res.write('<p>' + err.stack + '</p>');
37 - res.end();
38 -
39 - return;
40 - }
41 -
42 - if (results) {
43 - console.dir(results);
44 -
45 - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
46 - res.write('<h2>사용자 리스트</h2>');
47 - res.write('<div><ul>');
48 -
49 - for (var i = 0; i < results.length; i++) {
50 - var curId = results[i]._doc.id;
51 - var curName = results[i]._doc.name;
52 - res.write(' <li>#' + i + ' : ' + curId + ', ' + curName + '</li>');
53 - }
54 -
55 - res.write('</ul></div>');
56 - res.end();
57 - } else {
58 - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
59 - res.write('<h2>사용자 리스트 조회 실패</h2>');
60 - res.end();
61 - }
62 - });
63 - } else {
64 - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
65 - res.write('<h2>데이터베이스 연결 실패</h2>');
66 - res.end();
67 - }
68 -
69 -};
70 -
71 -
72 -//사용자를 인증하는 함수 : 아이디로 먼저 찾고 비밀번호를 그 다음에 비교하도록 함
73 -var authUser = function(database, id, password, callback) {
74 - console.log('authUser 호출됨.');
75 -
76 - // 1. 아이디를 이용해 검색
77 - database.UserModel.findById(id, function(err, results) {
78 - if (err) {
79 - callback(err, null);
80 - return;
81 - }
82 -
83 - console.log('아이디 [%s]로 사용자 검색결과', id);
84 - console.dir(results);
85 -
86 - if (results.length > 0) {
87 - console.log('아이디와 일치하는 사용자 찾음.');
88 -
89 - // 2. 패스워드 확인 : 모델 인스턴스를 객체를 만들고 authenticate() 메소드 호출
90 - var user = new database.UserModel({id:id});
91 - var authenticated = user.authenticate(password, results[0]._doc.salt, results[0]._doc.hashed_password);
92 - if (authenticated) {
93 - console.log('비밀번호 일치함');
94 - callback(null, results);
95 - } else {
96 - console.log('비밀번호 일치하지 않음');
97 - callback(null, null);
98 - }
99 -
100 - } else {
101 - console.log("아이디와 일치하는 사용자를 찾지 못함.");
102 - callback(null, null);
103 - }
104 -
105 - });
106 -
107 -}
108 -
109 -
110 -//사용자를 등록하는 함수
111 -var addUser = function(database, id, password, name, callback) {
112 - console.log('addUser 호출됨.');
113 -
114 - // UserModel 인스턴스 생성
115 - var user = new database.UserModel({"id":id, "password":password, "name":name});
116 -
117 - // save()로 저장
118 - user.save(function(err) {
119 - if (err) {
120 - callback(err, null);
121 - return;
122 - }
123 -
124 - console.log("사용자 데이터 추가함.");
125 - callback(null, user);
126 -
127 - });
128 -}
129 -
130 -
131 -module.exports.login = login;
132 -module.exports.adduser = adduser;
133 -module.exports.listuser = listuser;
134 -
1 +var mongoose = require('mongoose');
2 +var db_url = 'mongodb+srv://oss:12341234@cluster0.us5lm.mongodb.net/?retryWrites=true&w=majority';
3 +// database 객체에 db, schema, model 모두 추가
4 +var database = {};
5 +
6 +// 초기화를 위해 호출하는 함수
7 +database.init = function(app, config) {
8 + console.log('init() 호출됨.');
9 +
10 + connect(app, config);
11 +}
12 +
13 +//데이터베이스에 연결하고 응답 객체의 속성으로 db 객체 추가
14 +function connect(app, config) {
15 + console.log('connect() 호출됨.');
16 +
17 + // 데이터베이스 연결 : config의 설정 사용
18 + mongoose.Promise = global.Promise; // mongoose의 Promise 객체는 global의 Promise 객체 사용하도록 함
19 + mongoose.connect(db_url);
20 +
21 + database.db = mongoose.connection;
22 +
23 + database.db.on('error', console.error.bind(console, 'mongoose connection error.'));
24 + database.db.on('open', function () {
25 + console.log('데이터베이스에 연결되었습니다. : ' + db_url);
26 +
27 + // config에 등록된 스키마 및 모델 객체 생성
28 + createSchema(app, config);
29 +
30 + });
31 + database.db.on('disconnected', connect);
32 +
33 +}
34 +
35 +// config에 정의된 스키마 및 모델 객체 생성
36 +function createSchema(app, config) {
37 + var schemaLen = config.db_schemas.length;
38 + console.log('설정에 정의된 스키마의 수 : %d', schemaLen);
39 +
40 + for (var i = 0; i < schemaLen; i++) {
41 + var curItem = config.db_schemas[i];
42 +
43 + // 모듈 파일에서 모듈 불러온 후 createSchema() 함수 호출하기
44 + var curSchema = require(curItem.file).createSchema(mongoose);
45 + console.log('%s 모듈을 불러들인 후 스키마 정의함.', curItem.file);
46 +
47 + // User 모델 정의
48 + var curModel = mongoose.model(curItem.collection, curSchema);
49 + console.log('%s 컬렉션을 위해 모델 정의함.', curItem.collection);
50 +
51 + // database 객체에 속성으로 추가
52 + database[curItem.schemaName] = curSchema;
53 + database[curItem.modelName] = curModel;
54 + console.log('스키마 이름 [%s], 모델 이름 [%s] 이 database 객체의 속성으로 추가됨.', curItem.schemaName, curItem.modelName);
55 + }
56 +
57 + app.set('database', database);
58 + console.log('database 객체가 app 객체의 속성으로 추가됨.');
59 +}
60 +
61 +
62 +// database 객체를 module.exports에 할당
63 +module.exports = database;
...\ No newline at end of file ...\ No newline at end of file
1 +var crypto = require('crypto');
2 +
3 +var Schema = {};
4 +
5 +Schema.createSchema = function(mongoose) {
6 +
7 + // 스키마 정의
8 + var UserSchema = mongoose.Schema({
9 + id: {type: String, required: true, unique: true, 'default':''},
10 + hashed_password: {type: String, required: true, 'default':''},
11 + salt: {type:String, required:true},
12 + name: {type: String, index: 'hashed', 'default':''},
13 + age: {type: Number, 'default': -1},
14 + created_at: {type: Date, index: {unique: false}, 'default': Date.now},
15 + updated_at: {type: Date, index: {unique: false}, 'default': Date.now}
16 + });
17 +
18 + // password를 virtual 메소드로 정의 : MongoDB에 저장되지 않는 편리한 속성임. 특정 속성을 지정하고 set, get 메소드를 정의함
19 + UserSchema
20 + .virtual('password')
21 + .set(function(password) {
22 + this._password = password;
23 + this.salt = this.makeSalt();
24 + this.hashed_password = this.encryptPassword(password);
25 + console.log('virtual password 호출됨 : ' + this.hashed_password);
26 + })
27 + .get(function() { return this._password });
28 +
29 + // 스키마에 모델 인스턴스에서 사용할 수 있는 메소드 추가
30 + // 비밀번호 암호화 메소드
31 + UserSchema.method('encryptPassword', function(plainText, inSalt) {
32 + if (inSalt) {
33 + return crypto.createHmac('sha1', inSalt).update(plainText).digest('hex');
34 + } else {
35 + return crypto.createHmac('sha1', this.salt).update(plainText).digest('hex');
36 + }
37 + });
38 +
39 + // salt 값 만들기 메소드
40 + UserSchema.method('makeSalt', function() {
41 + return Math.round((new Date().valueOf() * Math.random())) + '';
42 + });
43 +
44 + // 인증 메소드 - 입력된 비밀번호와 비교 (true/false 리턴)
45 + UserSchema.method('authenticate', function(plainText, inSalt, hashed_password) {
46 + if (inSalt) {
47 + console.log('authenticate 호출됨 : %s -> %s : %s', plainText, this.encryptPassword(plainText, inSalt), hashed_password);
48 + return this.encryptPassword(plainText, inSalt) === hashed_password;
49 + } else {
50 + console.log('authenticate 호출됨 : %s -> %s : %s', plainText, this.encryptPassword(plainText), this.hashed_password);
51 + return this.encryptPassword(plainText) === this.hashed_password;
52 + }
53 + });
54 +
55 + // 값이 유효한지 확인하는 함수 정의
56 + var validatePresenceOf = function(value) {
57 + return value && value.length;
58 + };
59 +
60 + // 저장 시의 트리거 함수 정의 (password 필드가 유효하지 않으면 에러 발생)
61 + UserSchema.pre('save', function(next) {
62 + if (!this.isNew) return next();
63 +
64 + if (!validatePresenceOf(this.password)) {
65 + next(new Error('유효하지 않은 password 필드입니다.'));
66 + } else {
67 + next();
68 + }
69 + })
70 +
71 + // 필수 속성에 대한 유효성 확인 (길이값 체크)
72 + UserSchema.path('id').validate(function (id) {
73 + return id.length;
74 + }, 'id 칼럼의 값이 없습니다.');
75 +
76 + UserSchema.path('name').validate(function (name) {
77 + return name.length;
78 + }, 'name 칼럼의 값이 없습니다.');
79 +
80 + UserSchema.path('hashed_password').validate(function (hashed_password) {
81 + return hashed_password.length;
82 + }, 'hashed_password 칼럼의 값이 없습니다.');
83 +
84 +
85 + // 스키마에 static 메소드 추가
86 + UserSchema.static('findById', function(id, callback) {
87 + return this.find({id:id}, callback);
88 + });
89 +
90 + UserSchema.static('findAll', function(callback) {
91 + return this.find({}, callback);
92 + });
93 +
94 + console.log('UserSchema 정의함.');
95 +
96 + return UserSchema;
97 +};
98 +
99 +// module.exports에 UserSchema 객체 직접 할당
100 +module.exports = Schema;
101 +
1 +var Conn = require('../database/database')
1 var express = require('express') 2 var express = require('express')
2 -var Conn = require('../database/Connection') 3 +var router = express.Router();
3 -var router = express.Router()
4 4
5 //라우팅 함수 등록 5 //라우팅 함수 등록
6 6
7 router.get('/',function(req,res){ 7 router.get('/',function(req,res){
8 +
8 res.render('login.html') 9 res.render('login.html')
9 }); 10 });
10 11
...@@ -15,45 +16,90 @@ router.post('/process', function(req, res) { ...@@ -15,45 +16,90 @@ router.post('/process', function(req, res) {
15 var paramPassword = req.body.password || req.query.password; 16 var paramPassword = req.body.password || req.query.password;
16 //GET, POST 모두 고려해서 둘 다 검사 17 //GET, POST 모두 고려해서 둘 다 검사
17 18
18 - if(Conn.pool){ 19 + // 데이터베이스 객체 참조
19 - Conn.authUser(paramId, paramPassword, function(err, rows) { 20 + var database = req.app.get('database');
20 - if(err){ 21 +
21 - console.error(err.stack); 22 + // 데이터베이스 객체가 초기화된 경우, authUser 함수 호출하여 사용자 인증
22 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); 23 + if (database.db) {
23 - res.write('<h1>로그인 중 오류</h1>'); 24 + authUser(database, paramId, paramPassword, function(err, docs) {
24 - res.write('<div><p>Param id : ' + paramId + '</p></div>'); 25 + // 에러 발생 시, 클라이언트로 에러 전송
25 - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); 26 + if (err) {
26 - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); 27 + console.error('사용자 로그인 중 에러 발생 : ' + err.stack);
27 - res.end(); 28 +
28 - 29 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
29 - return; 30 + res.write('<h2>사용자 로그인 중 에러 발생</h2>');
31 + res.write('<p>' + err.stack + '</p>');
32 + res.end();
33 +
34 + return;
30 } 35 }
31 - if (rows){ 36 +
32 - console.dir(rows); 37 + // 조회된 레코드가 있으면 성공 응답 전송
33 - 38 + if (docs) {
34 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); 39 + console.dir(docs);
35 - res.write('<h1>로그인 성공</h1>');
36 - res.write('<div><p>Param name : ' + rows[0].name + '</p></div>');
37 - res.write('<div><p>Param id : ' + paramId + '</p></div>');
38 - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>");
39 - res.end();
40 - } else {
41 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' });
42 - res.write('<h1>로그인 실패.</h1>');
43 - res.write('<div><p>Param id : ' + paramId + '</p></div>');
44 - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>");
45 - res.end();
46 - }
47 -
48 - })
49 - }else{
50 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' });
51 - res.write('<h1>데이터베이스 연결 실패</h1>');
52 - res.end();
53 - }
54 40
41 + // 조회 결과에서 사용자 이름 확인
42 + var username = docs[0].name;
43 +
44 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
45 + res.write('<h1>로그인 성공</h1>');
46 + res.write('<div><p>사용자 아이디 : ' + paramId + '</p></div>');
47 + res.write('<div><p>사용자 이름 : ' + username + '</p></div>');
48 + res.write("<br><br><a href='/login'>다시 로그인하기</a>");
49 + res.end();
50 +
51 + } else { // 조회된 레코드가 없는 경우 실패 응답 전송
52 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
53 + res.write('<h1>로그인 실패</h1>');
54 + res.write('<div><p>아이디와 패스워드를 다시 확인하십시오.</p></div>');
55 + res.write("<br><br><a href='/login'>다시 로그인하기</a>");
56 + res.end();
57 + }
58 + });
59 + } else { // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송
60 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
61 + res.write('<h2>데이터베이스 연결 실패</h2>');
62 + res.write('<div><p>데이터베이스에 연결하지 못했습니다.</p></div>');
63 + res.end();
64 + }
55 65
56 }); 66 });
57 67
68 +//사용자를 인증하는 함수 : 아이디로 먼저 찾고 비밀번호를 그 다음에 비교하도록 함
69 +var authUser = function(database, id, password, callback) {
70 + console.log('authUser 호출됨.');
71 +
72 + // 1. 아이디를 이용해 검색
73 + database.UserModel.findById(id, function(err, results) {
74 + if (err) {
75 + callback(err, null);
76 + return;
77 + }
78 +
79 + console.log('아이디 [%s]로 사용자 검색결과', id);
80 + console.dir(results);
81 +
82 + if (results.length > 0) {
83 + console.log('아이디와 일치하는 사용자 찾음.');
84 +
85 + // 2. 패스워드 확인 : 모델 인스턴스를 객체를 만들고 authenticate() 메소드 호출
86 + var user = new database.UserModel({id:id});
87 + var authenticated = user.authenticate(password, results[0]._doc.salt, results[0]._doc.hashed_password);
88 + if (authenticated) {
89 + console.log('비밀번호 일치함');
90 + callback(null, results);
91 + } else {
92 + console.log('비밀번호 일치하지 않음');
93 + callback(null, null);
94 + }
95 +
96 + } else {
97 + console.log("아이디와 일치하는 사용자를 찾지 못함.");
98 + callback(null, null);
99 + }
100 +
101 + });
102 +
103 +}
58 104
59 module.exports = router 105 module.exports = router
...\ No newline at end of file ...\ No newline at end of file
......
1 var express = require('express') 1 var express = require('express')
2 -var Conn = require('../database/Connection') 2 +var Conn = require('../database/database')
3 var router = express.Router() 3 var router = express.Router()
4 4
5 router.get('/',function(req,res){ 5 router.get('/',function(req,res){
...@@ -15,47 +15,66 @@ router.post('/process', function(req, res) { ...@@ -15,47 +15,66 @@ router.post('/process', function(req, res) {
15 var paramPassword = req.body.password || req.query.password; 15 var paramPassword = req.body.password || req.query.password;
16 //GET, POST 모두 고려해서 둘 다 검사 16 //GET, POST 모두 고려해서 둘 다 검사
17 17
18 - if(Conn.pool){ 18 + // 데이터베이스 객체 참조
19 - Conn.adduser(paramName, paramId, paramPassword, function(err, addedUser) { 19 + var database = req.app.get('database');
20 - if(err){ 20 +
21 - console.error(err.stack); 21 + // 데이터베이스 객체가 초기화된 경우, addUser 함수 호출하여 사용자 추가
22 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); 22 + if (database.db) {
23 - res.write('<h1>ID가 중복되었습니다. 다른 ID를 사용해주세요.</h1>'); 23 + addUser(database, paramId, paramPassword, paramName, function(err, addedUser) {
24 - res.write('<div><p>Param name : ' + paramName + '</p></div>'); 24 + // 동일한 id로 추가하려는 경우 에러 발생 - 클라이언트로 에러 전송
25 - res.write('<div><p>Param id : ' + paramId + '</p></div>'); 25 + if (err) {
26 - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); 26 + console.error('사용자 추가 중 에러 발생 : ' + err.stack);
27 - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); 27 +
28 - res.end(); 28 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
29 - 29 + res.write('<h2>사용자 추가 중 에러 발생</h2>');
30 - return; 30 + res.write('<p>' + err.stack + '</p>');
31 + res.end();
32 +
33 + return;
31 } 34 }
32 - if (addedUser){ 35 +
33 - console.dir(addedUser); 36 + // 결과 객체 있으면 성공 응답 전송
34 - 37 + if (addedUser) {
35 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); 38 + console.dir(addedUser);
36 - res.write('<h1>회원가입 성공</h1>'); 39 +
37 - res.write('<div><p>Param name : ' + paramName + '</p></div>'); 40 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
38 - res.write('<div><p>Param id : ' + paramId + '</p></div>'); 41 + res.write('<h2>사용자 추가 성공</h2>');
39 - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); 42 + res.write("<br><br><a href='/login'>다시 로그인하기</a>");
40 - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); 43 + res.end();
41 - res.end(); 44 + } else { // 결과 객체가 없으면 실패 응답 전송
42 - } else { 45 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
43 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); 46 + res.write('<h2>사용자 추가 실패</h2>');
44 - res.write('<h1>회원가입 실패.</h1>'); 47 + res.write("<br><br><a href='/signup'>다시 가입하기</a>");
45 - res.write('<div><p>Param id : ' + paramId + '</p></div>'); 48 + res.end();
46 - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); 49 + }
47 - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); 50 + });
48 - res.end(); 51 + } else { // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송
49 - } 52 + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
50 - 53 + res.write('<h2>데이터베이스 연결 실패</h2>');
51 - }) 54 + res.end();
52 - }else{ 55 + }
53 - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); 56 +
54 - res.write('<h1>데이터베이스 연결 실패</h1>'); 57 +});
55 - res.end();
56 - }
57 58
58 59
59 -}); 60 +//사용자를 등록하는 함수
61 +var addUser = function(database, id, password, name, callback) {
62 + console.log('addUser 호출됨.');
63 +
64 + // UserModel 인스턴스 생성
65 + var user = new database.UserModel({"id":id, "password":password, "name":name});
66 +
67 + // save()로 저장
68 + user.save(function(err) {
69 + if (err) {
70 + callback(err, null);
71 + return;
72 + }
73 +
74 + console.log("사용자 데이터 추가함.");
75 + callback(null, user);
76 +
77 + });
78 +}
60 79
61 module.exports = router 80 module.exports = router
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -14,6 +14,25 @@ ...@@ -14,6 +14,25 @@
14 "url": "https://opencollective.com/popperjs" 14 "url": "https://opencollective.com/popperjs"
15 } 15 }
16 }, 16 },
17 + "node_modules/@types/node": {
18 + "version": "17.0.35",
19 + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz",
20 + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg=="
21 + },
22 + "node_modules/@types/webidl-conversions": {
23 + "version": "6.1.1",
24 + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
25 + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
26 + },
27 + "node_modules/@types/whatwg-url": {
28 + "version": "8.2.1",
29 + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
30 + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
31 + "dependencies": {
32 + "@types/node": "*",
33 + "@types/webidl-conversions": "*"
34 + }
35 + },
17 "node_modules/accepts": { 36 "node_modules/accepts": {
18 "version": "1.3.8", 37 "version": "1.3.8",
19 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 38 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
...@@ -55,6 +74,25 @@ ...@@ -55,6 +74,25 @@
55 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 74 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
56 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 75 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
57 }, 76 },
77 + "node_modules/base64-js": {
78 + "version": "1.5.1",
79 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
80 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
81 + "funding": [
82 + {
83 + "type": "github",
84 + "url": "https://github.com/sponsors/feross"
85 + },
86 + {
87 + "type": "patreon",
88 + "url": "https://www.patreon.com/feross"
89 + },
90 + {
91 + "type": "consulting",
92 + "url": "https://feross.org/support"
93 + }
94 + ]
95 + },
58 "node_modules/bignumber.js": { 96 "node_modules/bignumber.js": {
59 "version": "9.0.0", 97 "version": "9.0.0",
60 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 98 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
...@@ -107,6 +145,40 @@ ...@@ -107,6 +145,40 @@
107 "concat-map": "0.0.1" 145 "concat-map": "0.0.1"
108 } 146 }
109 }, 147 },
148 + "node_modules/bson": {
149 + "version": "4.6.4",
150 + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz",
151 + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==",
152 + "dependencies": {
153 + "buffer": "^5.6.0"
154 + },
155 + "engines": {
156 + "node": ">=6.9.0"
157 + }
158 + },
159 + "node_modules/buffer": {
160 + "version": "5.7.1",
161 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
162 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
163 + "funding": [
164 + {
165 + "type": "github",
166 + "url": "https://github.com/sponsors/feross"
167 + },
168 + {
169 + "type": "patreon",
170 + "url": "https://www.patreon.com/feross"
171 + },
172 + {
173 + "type": "consulting",
174 + "url": "https://feross.org/support"
175 + }
176 + ],
177 + "dependencies": {
178 + "base64-js": "^1.3.1",
179 + "ieee754": "^1.1.13"
180 + }
181 + },
110 "node_modules/bytes": { 182 "node_modules/bytes": {
111 "version": "3.1.2", 183 "version": "3.1.2",
112 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 184 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
...@@ -220,6 +292,12 @@ ...@@ -220,6 +292,12 @@
220 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 292 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
221 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 293 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
222 }, 294 },
295 + "node_modules/crypto": {
296 + "version": "1.0.1",
297 + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
298 + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==",
299 + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in."
300 + },
223 "node_modules/debug": { 301 "node_modules/debug": {
224 "version": "2.6.9", 302 "version": "2.6.9",
225 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 303 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -228,6 +306,14 @@ ...@@ -228,6 +306,14 @@
228 "ms": "2.0.0" 306 "ms": "2.0.0"
229 } 307 }
230 }, 308 },
309 + "node_modules/denque": {
310 + "version": "2.0.1",
311 + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
312 + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==",
313 + "engines": {
314 + "node": ">=0.10"
315 + }
316 + },
231 "node_modules/depd": { 317 "node_modules/depd": {
232 "version": "2.0.0", 318 "version": "2.0.0",
233 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 319 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
...@@ -499,11 +585,35 @@ ...@@ -499,11 +585,35 @@
499 "node": ">=0.10.0" 585 "node": ">=0.10.0"
500 } 586 }
501 }, 587 },
588 + "node_modules/ieee754": {
589 + "version": "1.2.1",
590 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
591 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
592 + "funding": [
593 + {
594 + "type": "github",
595 + "url": "https://github.com/sponsors/feross"
596 + },
597 + {
598 + "type": "patreon",
599 + "url": "https://www.patreon.com/feross"
600 + },
601 + {
602 + "type": "consulting",
603 + "url": "https://feross.org/support"
604 + }
605 + ]
606 + },
502 "node_modules/inherits": { 607 "node_modules/inherits": {
503 "version": "2.0.4", 608 "version": "2.0.4",
504 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 609 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
505 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 610 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
506 }, 611 },
612 + "node_modules/ip": {
613 + "version": "1.1.8",
614 + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
615 + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
616 + },
507 "node_modules/ipaddr.js": { 617 "node_modules/ipaddr.js": {
508 "version": "1.9.1", 618 "version": "1.9.1",
509 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 619 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
...@@ -534,6 +644,11 @@ ...@@ -534,6 +644,11 @@
534 "node": ">=10" 644 "node": ">=10"
535 } 645 }
536 }, 646 },
647 + "node_modules/kareem": {
648 + "version": "2.3.5",
649 + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
650 + "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
651 + },
537 "node_modules/media-typer": { 652 "node_modules/media-typer": {
538 "version": "0.3.0", 653 "version": "0.3.0",
539 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 654 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
...@@ -542,6 +657,12 @@ ...@@ -542,6 +657,12 @@
542 "node": ">= 0.6" 657 "node": ">= 0.6"
543 } 658 }
544 }, 659 },
660 + "node_modules/memory-pager": {
661 + "version": "1.5.0",
662 + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
663 + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
664 + "optional": true
665 + },
545 "node_modules/merge-descriptors": { 666 "node_modules/merge-descriptors": {
546 "version": "1.0.1", 667 "version": "1.0.1",
547 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 668 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
...@@ -596,11 +717,103 @@ ...@@ -596,11 +717,103 @@
596 "node": "*" 717 "node": "*"
597 } 718 }
598 }, 719 },
720 + "node_modules/mongodb": {
721 + "version": "4.5.0",
722 + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz",
723 + "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==",
724 + "dependencies": {
725 + "bson": "^4.6.2",
726 + "denque": "^2.0.1",
727 + "mongodb-connection-string-url": "^2.5.2",
728 + "socks": "^2.6.2"
729 + },
730 + "engines": {
731 + "node": ">=12.9.0"
732 + },
733 + "optionalDependencies": {
734 + "saslprep": "^1.0.3"
735 + }
736 + },
737 + "node_modules/mongodb-connection-string-url": {
738 + "version": "2.5.2",
739 + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz",
740 + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==",
741 + "dependencies": {
742 + "@types/whatwg-url": "^8.2.1",
743 + "whatwg-url": "^11.0.0"
744 + }
745 + },
746 + "node_modules/mongoose": {
747 + "version": "6.3.4",
748 + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.4.tgz",
749 + "integrity": "sha512-UP0azyGMdY+2YNbJUHeHhnVw5vPzCqs4GQDUwHkilif/rwmSZktUQhQWMp1pUgRNeF2JC30vWGLrInZxD7K/Qw==",
750 + "dependencies": {
751 + "bson": "^4.6.2",
752 + "kareem": "2.3.5",
753 + "mongodb": "4.5.0",
754 + "mpath": "0.9.0",
755 + "mquery": "4.0.3",
756 + "ms": "2.1.3",
757 + "sift": "16.0.0"
758 + },
759 + "engines": {
760 + "node": ">=12.0.0"
761 + },
762 + "funding": {
763 + "type": "opencollective",
764 + "url": "https://opencollective.com/mongoose"
765 + }
766 + },
767 + "node_modules/mongoose/node_modules/ms": {
768 + "version": "2.1.3",
769 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
770 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
771 + },
599 "node_modules/mout": { 772 "node_modules/mout": {
600 "version": "0.12.0", 773 "version": "0.12.0",
601 "resolved": "https://registry.npmjs.org/mout/-/mout-0.12.0.tgz", 774 "resolved": "https://registry.npmjs.org/mout/-/mout-0.12.0.tgz",
602 "integrity": "sha1-bVskLuMx+dBMaOWPd6kaMGDoyss=" 775 "integrity": "sha1-bVskLuMx+dBMaOWPd6kaMGDoyss="
603 }, 776 },
777 + "node_modules/mpath": {
778 + "version": "0.9.0",
779 + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
780 + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
781 + "engines": {
782 + "node": ">=4.0.0"
783 + }
784 + },
785 + "node_modules/mquery": {
786 + "version": "4.0.3",
787 + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
788 + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
789 + "dependencies": {
790 + "debug": "4.x"
791 + },
792 + "engines": {
793 + "node": ">=12.0.0"
794 + }
795 + },
796 + "node_modules/mquery/node_modules/debug": {
797 + "version": "4.3.4",
798 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
799 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
800 + "dependencies": {
801 + "ms": "2.1.2"
802 + },
803 + "engines": {
804 + "node": ">=6.0"
805 + },
806 + "peerDependenciesMeta": {
807 + "supports-color": {
808 + "optional": true
809 + }
810 + }
811 + },
812 + "node_modules/mquery/node_modules/ms": {
813 + "version": "2.1.2",
814 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
815 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
816 + },
604 "node_modules/ms": { 817 "node_modules/ms": {
605 "version": "2.0.0", 818 "version": "2.0.0",
606 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 819 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
...@@ -707,6 +920,14 @@ ...@@ -707,6 +920,14 @@
707 "node": ">= 0.10" 920 "node": ">= 0.10"
708 } 921 }
709 }, 922 },
923 + "node_modules/punycode": {
924 + "version": "2.1.1",
925 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
926 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
927 + "engines": {
928 + "node": ">=6"
929 + }
930 + },
710 "node_modules/qs": { 931 "node_modules/qs": {
711 "version": "6.10.3", 932 "version": "6.10.3",
712 "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 933 "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
...@@ -794,6 +1015,18 @@ ...@@ -794,6 +1015,18 @@
794 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1015 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
795 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1016 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
796 }, 1017 },
1018 + "node_modules/saslprep": {
1019 + "version": "1.0.3",
1020 + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
1021 + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
1022 + "optional": true,
1023 + "dependencies": {
1024 + "sparse-bitfield": "^3.0.3"
1025 + },
1026 + "engines": {
1027 + "node": ">=6"
1028 + }
1029 + },
797 "node_modules/send": { 1030 "node_modules/send": {
798 "version": "0.18.0", 1031 "version": "0.18.0",
799 "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1032 "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
...@@ -854,6 +1087,42 @@ ...@@ -854,6 +1087,42 @@
854 "url": "https://github.com/sponsors/ljharb" 1087 "url": "https://github.com/sponsors/ljharb"
855 } 1088 }
856 }, 1089 },
1090 + "node_modules/sift": {
1091 + "version": "16.0.0",
1092 + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
1093 + "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ=="
1094 + },
1095 + "node_modules/smart-buffer": {
1096 + "version": "4.2.0",
1097 + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
1098 + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
1099 + "engines": {
1100 + "node": ">= 6.0.0",
1101 + "npm": ">= 3.0.0"
1102 + }
1103 + },
1104 + "node_modules/socks": {
1105 + "version": "2.6.2",
1106 + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
1107 + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
1108 + "dependencies": {
1109 + "ip": "^1.1.5",
1110 + "smart-buffer": "^4.2.0"
1111 + },
1112 + "engines": {
1113 + "node": ">= 10.13.0",
1114 + "npm": ">= 3.0.0"
1115 + }
1116 + },
1117 + "node_modules/sparse-bitfield": {
1118 + "version": "3.0.3",
1119 + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1120 + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
1121 + "optional": true,
1122 + "dependencies": {
1123 + "memory-pager": "^1.0.2"
1124 + }
1125 + },
857 "node_modules/sqlstring": { 1126 "node_modules/sqlstring": {
858 "version": "2.3.1", 1127 "version": "2.3.1",
859 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1128 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
...@@ -902,6 +1171,17 @@ ...@@ -902,6 +1171,17 @@
902 "node": ">=0.6" 1171 "node": ">=0.6"
903 } 1172 }
904 }, 1173 },
1174 + "node_modules/tr46": {
1175 + "version": "3.0.0",
1176 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1177 + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1178 + "dependencies": {
1179 + "punycode": "^2.1.1"
1180 + },
1181 + "engines": {
1182 + "node": ">=12"
1183 + }
1184 + },
905 "node_modules/type-is": { 1185 "node_modules/type-is": {
906 "version": "1.6.18", 1186 "version": "1.6.18",
907 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1187 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
...@@ -966,6 +1246,26 @@ ...@@ -966,6 +1246,26 @@
966 "engines": { 1246 "engines": {
967 "node": ">= 0.8" 1247 "node": ">= 0.8"
968 } 1248 }
1249 + },
1250 + "node_modules/webidl-conversions": {
1251 + "version": "7.0.0",
1252 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1253 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1254 + "engines": {
1255 + "node": ">=12"
1256 + }
1257 + },
1258 + "node_modules/whatwg-url": {
1259 + "version": "11.0.0",
1260 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1261 + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1262 + "dependencies": {
1263 + "tr46": "^3.0.0",
1264 + "webidl-conversions": "^7.0.0"
1265 + },
1266 + "engines": {
1267 + "node": ">=12"
1268 + }
969 } 1269 }
970 } 1270 }
971 } 1271 }
......
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
12 "body-parser": "^1.20.0", 12 "body-parser": "^1.20.0",
13 "bootstrap": "^5.1.3", 13 "bootstrap": "^5.1.3",
14 "cookie-parser": "^1.4.6", 14 "cookie-parser": "^1.4.6",
15 + "crypto": "^1.0.1",
15 "ejs": "^3.1.7", 16 "ejs": "^3.1.7",
16 "express": "^4.18.1", 17 "express": "^4.18.1",
17 "express-error-handler": "^1.1.0", 18 "express-error-handler": "^1.1.0",
18 "express-session": "^1.17.3", 19 "express-session": "^1.17.3",
19 "http": "^0.0.1-security", 20 "http": "^0.0.1-security",
21 + "mongoose": "^6.3.4",
20 "mysql": "^2.18.1", 22 "mysql": "^2.18.1",
21 "path": "^0.12.7", 23 "path": "^0.12.7",
22 "serve-static": "^1.15.0" 24 "serve-static": "^1.15.0"
...@@ -32,6 +34,25 @@ ...@@ -32,6 +34,25 @@
32 "url": "https://opencollective.com/popperjs" 34 "url": "https://opencollective.com/popperjs"
33 } 35 }
34 }, 36 },
37 + "node_modules/@types/node": {
38 + "version": "17.0.35",
39 + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz",
40 + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg=="
41 + },
42 + "node_modules/@types/webidl-conversions": {
43 + "version": "6.1.1",
44 + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
45 + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
46 + },
47 + "node_modules/@types/whatwg-url": {
48 + "version": "8.2.1",
49 + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
50 + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
51 + "dependencies": {
52 + "@types/node": "*",
53 + "@types/webidl-conversions": "*"
54 + }
55 + },
35 "node_modules/accepts": { 56 "node_modules/accepts": {
36 "version": "1.3.8", 57 "version": "1.3.8",
37 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 58 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
...@@ -73,6 +94,25 @@ ...@@ -73,6 +94,25 @@
73 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 94 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
74 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 95 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
75 }, 96 },
97 + "node_modules/base64-js": {
98 + "version": "1.5.1",
99 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
100 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
101 + "funding": [
102 + {
103 + "type": "github",
104 + "url": "https://github.com/sponsors/feross"
105 + },
106 + {
107 + "type": "patreon",
108 + "url": "https://www.patreon.com/feross"
109 + },
110 + {
111 + "type": "consulting",
112 + "url": "https://feross.org/support"
113 + }
114 + ]
115 + },
76 "node_modules/bignumber.js": { 116 "node_modules/bignumber.js": {
77 "version": "9.0.0", 117 "version": "9.0.0",
78 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 118 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
...@@ -125,6 +165,40 @@ ...@@ -125,6 +165,40 @@
125 "concat-map": "0.0.1" 165 "concat-map": "0.0.1"
126 } 166 }
127 }, 167 },
168 + "node_modules/bson": {
169 + "version": "4.6.4",
170 + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz",
171 + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==",
172 + "dependencies": {
173 + "buffer": "^5.6.0"
174 + },
175 + "engines": {
176 + "node": ">=6.9.0"
177 + }
178 + },
179 + "node_modules/buffer": {
180 + "version": "5.7.1",
181 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
182 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
183 + "funding": [
184 + {
185 + "type": "github",
186 + "url": "https://github.com/sponsors/feross"
187 + },
188 + {
189 + "type": "patreon",
190 + "url": "https://www.patreon.com/feross"
191 + },
192 + {
193 + "type": "consulting",
194 + "url": "https://feross.org/support"
195 + }
196 + ],
197 + "dependencies": {
198 + "base64-js": "^1.3.1",
199 + "ieee754": "^1.1.13"
200 + }
201 + },
128 "node_modules/bytes": { 202 "node_modules/bytes": {
129 "version": "3.1.2", 203 "version": "3.1.2",
130 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 204 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
...@@ -238,6 +312,12 @@ ...@@ -238,6 +312,12 @@
238 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 312 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
239 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 313 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
240 }, 314 },
315 + "node_modules/crypto": {
316 + "version": "1.0.1",
317 + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
318 + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==",
319 + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in."
320 + },
241 "node_modules/debug": { 321 "node_modules/debug": {
242 "version": "2.6.9", 322 "version": "2.6.9",
243 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 323 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -246,6 +326,14 @@ ...@@ -246,6 +326,14 @@
246 "ms": "2.0.0" 326 "ms": "2.0.0"
247 } 327 }
248 }, 328 },
329 + "node_modules/denque": {
330 + "version": "2.0.1",
331 + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
332 + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==",
333 + "engines": {
334 + "node": ">=0.10"
335 + }
336 + },
249 "node_modules/depd": { 337 "node_modules/depd": {
250 "version": "2.0.0", 338 "version": "2.0.0",
251 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 339 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
...@@ -517,11 +605,35 @@ ...@@ -517,11 +605,35 @@
517 "node": ">=0.10.0" 605 "node": ">=0.10.0"
518 } 606 }
519 }, 607 },
608 + "node_modules/ieee754": {
609 + "version": "1.2.1",
610 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
611 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
612 + "funding": [
613 + {
614 + "type": "github",
615 + "url": "https://github.com/sponsors/feross"
616 + },
617 + {
618 + "type": "patreon",
619 + "url": "https://www.patreon.com/feross"
620 + },
621 + {
622 + "type": "consulting",
623 + "url": "https://feross.org/support"
624 + }
625 + ]
626 + },
520 "node_modules/inherits": { 627 "node_modules/inherits": {
521 "version": "2.0.4", 628 "version": "2.0.4",
522 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 629 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
523 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 630 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
524 }, 631 },
632 + "node_modules/ip": {
633 + "version": "1.1.8",
634 + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
635 + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
636 + },
525 "node_modules/ipaddr.js": { 637 "node_modules/ipaddr.js": {
526 "version": "1.9.1", 638 "version": "1.9.1",
527 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 639 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
...@@ -552,6 +664,11 @@ ...@@ -552,6 +664,11 @@
552 "node": ">=10" 664 "node": ">=10"
553 } 665 }
554 }, 666 },
667 + "node_modules/kareem": {
668 + "version": "2.3.5",
669 + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
670 + "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
671 + },
555 "node_modules/media-typer": { 672 "node_modules/media-typer": {
556 "version": "0.3.0", 673 "version": "0.3.0",
557 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 674 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
...@@ -560,6 +677,12 @@ ...@@ -560,6 +677,12 @@
560 "node": ">= 0.6" 677 "node": ">= 0.6"
561 } 678 }
562 }, 679 },
680 + "node_modules/memory-pager": {
681 + "version": "1.5.0",
682 + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
683 + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
684 + "optional": true
685 + },
563 "node_modules/merge-descriptors": { 686 "node_modules/merge-descriptors": {
564 "version": "1.0.1", 687 "version": "1.0.1",
565 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 688 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
...@@ -614,11 +737,103 @@ ...@@ -614,11 +737,103 @@
614 "node": "*" 737 "node": "*"
615 } 738 }
616 }, 739 },
740 + "node_modules/mongodb": {
741 + "version": "4.5.0",
742 + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz",
743 + "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==",
744 + "dependencies": {
745 + "bson": "^4.6.2",
746 + "denque": "^2.0.1",
747 + "mongodb-connection-string-url": "^2.5.2",
748 + "socks": "^2.6.2"
749 + },
750 + "engines": {
751 + "node": ">=12.9.0"
752 + },
753 + "optionalDependencies": {
754 + "saslprep": "^1.0.3"
755 + }
756 + },
757 + "node_modules/mongodb-connection-string-url": {
758 + "version": "2.5.2",
759 + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz",
760 + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==",
761 + "dependencies": {
762 + "@types/whatwg-url": "^8.2.1",
763 + "whatwg-url": "^11.0.0"
764 + }
765 + },
766 + "node_modules/mongoose": {
767 + "version": "6.3.4",
768 + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.4.tgz",
769 + "integrity": "sha512-UP0azyGMdY+2YNbJUHeHhnVw5vPzCqs4GQDUwHkilif/rwmSZktUQhQWMp1pUgRNeF2JC30vWGLrInZxD7K/Qw==",
770 + "dependencies": {
771 + "bson": "^4.6.2",
772 + "kareem": "2.3.5",
773 + "mongodb": "4.5.0",
774 + "mpath": "0.9.0",
775 + "mquery": "4.0.3",
776 + "ms": "2.1.3",
777 + "sift": "16.0.0"
778 + },
779 + "engines": {
780 + "node": ">=12.0.0"
781 + },
782 + "funding": {
783 + "type": "opencollective",
784 + "url": "https://opencollective.com/mongoose"
785 + }
786 + },
787 + "node_modules/mongoose/node_modules/ms": {
788 + "version": "2.1.3",
789 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
790 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
791 + },
617 "node_modules/mout": { 792 "node_modules/mout": {
618 "version": "0.12.0", 793 "version": "0.12.0",
619 "resolved": "https://registry.npmjs.org/mout/-/mout-0.12.0.tgz", 794 "resolved": "https://registry.npmjs.org/mout/-/mout-0.12.0.tgz",
620 "integrity": "sha1-bVskLuMx+dBMaOWPd6kaMGDoyss=" 795 "integrity": "sha1-bVskLuMx+dBMaOWPd6kaMGDoyss="
621 }, 796 },
797 + "node_modules/mpath": {
798 + "version": "0.9.0",
799 + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
800 + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
801 + "engines": {
802 + "node": ">=4.0.0"
803 + }
804 + },
805 + "node_modules/mquery": {
806 + "version": "4.0.3",
807 + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
808 + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
809 + "dependencies": {
810 + "debug": "4.x"
811 + },
812 + "engines": {
813 + "node": ">=12.0.0"
814 + }
815 + },
816 + "node_modules/mquery/node_modules/debug": {
817 + "version": "4.3.4",
818 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
819 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
820 + "dependencies": {
821 + "ms": "2.1.2"
822 + },
823 + "engines": {
824 + "node": ">=6.0"
825 + },
826 + "peerDependenciesMeta": {
827 + "supports-color": {
828 + "optional": true
829 + }
830 + }
831 + },
832 + "node_modules/mquery/node_modules/ms": {
833 + "version": "2.1.2",
834 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
835 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
836 + },
622 "node_modules/ms": { 837 "node_modules/ms": {
623 "version": "2.0.0", 838 "version": "2.0.0",
624 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 839 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
...@@ -725,6 +940,14 @@ ...@@ -725,6 +940,14 @@
725 "node": ">= 0.10" 940 "node": ">= 0.10"
726 } 941 }
727 }, 942 },
943 + "node_modules/punycode": {
944 + "version": "2.1.1",
945 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
946 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
947 + "engines": {
948 + "node": ">=6"
949 + }
950 + },
728 "node_modules/qs": { 951 "node_modules/qs": {
729 "version": "6.10.3", 952 "version": "6.10.3",
730 "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 953 "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
...@@ -812,6 +1035,18 @@ ...@@ -812,6 +1035,18 @@
812 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1035 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
813 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1036 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
814 }, 1037 },
1038 + "node_modules/saslprep": {
1039 + "version": "1.0.3",
1040 + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
1041 + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
1042 + "optional": true,
1043 + "dependencies": {
1044 + "sparse-bitfield": "^3.0.3"
1045 + },
1046 + "engines": {
1047 + "node": ">=6"
1048 + }
1049 + },
815 "node_modules/send": { 1050 "node_modules/send": {
816 "version": "0.18.0", 1051 "version": "0.18.0",
817 "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1052 "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
...@@ -872,6 +1107,42 @@ ...@@ -872,6 +1107,42 @@
872 "url": "https://github.com/sponsors/ljharb" 1107 "url": "https://github.com/sponsors/ljharb"
873 } 1108 }
874 }, 1109 },
1110 + "node_modules/sift": {
1111 + "version": "16.0.0",
1112 + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
1113 + "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ=="
1114 + },
1115 + "node_modules/smart-buffer": {
1116 + "version": "4.2.0",
1117 + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
1118 + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
1119 + "engines": {
1120 + "node": ">= 6.0.0",
1121 + "npm": ">= 3.0.0"
1122 + }
1123 + },
1124 + "node_modules/socks": {
1125 + "version": "2.6.2",
1126 + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
1127 + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
1128 + "dependencies": {
1129 + "ip": "^1.1.5",
1130 + "smart-buffer": "^4.2.0"
1131 + },
1132 + "engines": {
1133 + "node": ">= 10.13.0",
1134 + "npm": ">= 3.0.0"
1135 + }
1136 + },
1137 + "node_modules/sparse-bitfield": {
1138 + "version": "3.0.3",
1139 + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1140 + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
1141 + "optional": true,
1142 + "dependencies": {
1143 + "memory-pager": "^1.0.2"
1144 + }
1145 + },
875 "node_modules/sqlstring": { 1146 "node_modules/sqlstring": {
876 "version": "2.3.1", 1147 "version": "2.3.1",
877 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1148 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
...@@ -920,6 +1191,17 @@ ...@@ -920,6 +1191,17 @@
920 "node": ">=0.6" 1191 "node": ">=0.6"
921 } 1192 }
922 }, 1193 },
1194 + "node_modules/tr46": {
1195 + "version": "3.0.0",
1196 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1197 + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1198 + "dependencies": {
1199 + "punycode": "^2.1.1"
1200 + },
1201 + "engines": {
1202 + "node": ">=12"
1203 + }
1204 + },
923 "node_modules/type-is": { 1205 "node_modules/type-is": {
924 "version": "1.6.18", 1206 "version": "1.6.18",
925 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1207 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
...@@ -984,6 +1266,26 @@ ...@@ -984,6 +1266,26 @@
984 "engines": { 1266 "engines": {
985 "node": ">= 0.8" 1267 "node": ">= 0.8"
986 } 1268 }
1269 + },
1270 + "node_modules/webidl-conversions": {
1271 + "version": "7.0.0",
1272 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1273 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1274 + "engines": {
1275 + "node": ">=12"
1276 + }
1277 + },
1278 + "node_modules/whatwg-url": {
1279 + "version": "11.0.0",
1280 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1281 + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1282 + "dependencies": {
1283 + "tr46": "^3.0.0",
1284 + "webidl-conversions": "^7.0.0"
1285 + },
1286 + "engines": {
1287 + "node": ">=12"
1288 + }
987 } 1289 }
988 }, 1290 },
989 "dependencies": { 1291 "dependencies": {
...@@ -993,6 +1295,25 @@ ...@@ -993,6 +1295,25 @@
993 "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", 1295 "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==",
994 "peer": true 1296 "peer": true
995 }, 1297 },
1298 + "@types/node": {
1299 + "version": "17.0.35",
1300 + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz",
1301 + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg=="
1302 + },
1303 + "@types/webidl-conversions": {
1304 + "version": "6.1.1",
1305 + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
1306 + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
1307 + },
1308 + "@types/whatwg-url": {
1309 + "version": "8.2.1",
1310 + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
1311 + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
1312 + "requires": {
1313 + "@types/node": "*",
1314 + "@types/webidl-conversions": "*"
1315 + }
1316 + },
996 "accepts": { 1317 "accepts": {
997 "version": "1.3.8", 1318 "version": "1.3.8",
998 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1319 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
...@@ -1025,6 +1346,11 @@ ...@@ -1025,6 +1346,11 @@
1025 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1346 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1026 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1347 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1027 }, 1348 },
1349 + "base64-js": {
1350 + "version": "1.5.1",
1351 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
1352 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
1353 + },
1028 "bignumber.js": { 1354 "bignumber.js": {
1029 "version": "9.0.0", 1355 "version": "9.0.0",
1030 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 1356 "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
...@@ -1064,6 +1390,23 @@ ...@@ -1064,6 +1390,23 @@
1064 "concat-map": "0.0.1" 1390 "concat-map": "0.0.1"
1065 } 1391 }
1066 }, 1392 },
1393 + "bson": {
1394 + "version": "4.6.4",
1395 + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz",
1396 + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==",
1397 + "requires": {
1398 + "buffer": "^5.6.0"
1399 + }
1400 + },
1401 + "buffer": {
1402 + "version": "5.7.1",
1403 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
1404 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
1405 + "requires": {
1406 + "base64-js": "^1.3.1",
1407 + "ieee754": "^1.1.13"
1408 + }
1409 + },
1067 "bytes": { 1410 "bytes": {
1068 "version": "3.1.2", 1411 "version": "3.1.2",
1069 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1412 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
...@@ -1149,6 +1492,11 @@ ...@@ -1149,6 +1492,11 @@
1149 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1492 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
1150 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 1493 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
1151 }, 1494 },
1495 + "crypto": {
1496 + "version": "1.0.1",
1497 + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
1498 + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
1499 + },
1152 "debug": { 1500 "debug": {
1153 "version": "2.6.9", 1501 "version": "2.6.9",
1154 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1502 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -1157,6 +1505,11 @@ ...@@ -1157,6 +1505,11 @@
1157 "ms": "2.0.0" 1505 "ms": "2.0.0"
1158 } 1506 }
1159 }, 1507 },
1508 + "denque": {
1509 + "version": "2.0.1",
1510 + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
1511 + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ=="
1512 + },
1160 "depd": { 1513 "depd": {
1161 "version": "2.0.0", 1514 "version": "2.0.0",
1162 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1515 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
...@@ -1371,11 +1724,21 @@ ...@@ -1371,11 +1724,21 @@
1371 "safer-buffer": ">= 2.1.2 < 3" 1724 "safer-buffer": ">= 2.1.2 < 3"
1372 } 1725 }
1373 }, 1726 },
1727 + "ieee754": {
1728 + "version": "1.2.1",
1729 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1730 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
1731 + },
1374 "inherits": { 1732 "inherits": {
1375 "version": "2.0.4", 1733 "version": "2.0.4",
1376 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1734 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1377 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1735 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1378 }, 1736 },
1737 + "ip": {
1738 + "version": "1.1.8",
1739 + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
1740 + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
1741 + },
1379 "ipaddr.js": { 1742 "ipaddr.js": {
1380 "version": "1.9.1", 1743 "version": "1.9.1",
1381 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1744 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
...@@ -1397,11 +1760,22 @@ ...@@ -1397,11 +1760,22 @@
1397 "minimatch": "^3.0.4" 1760 "minimatch": "^3.0.4"
1398 } 1761 }
1399 }, 1762 },
1763 + "kareem": {
1764 + "version": "2.3.5",
1765 + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
1766 + "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
1767 + },
1400 "media-typer": { 1768 "media-typer": {
1401 "version": "0.3.0", 1769 "version": "0.3.0",
1402 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1770 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1403 "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1771 "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1404 }, 1772 },
1773 + "memory-pager": {
1774 + "version": "1.5.0",
1775 + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1776 + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
1777 + "optional": true
1778 + },
1405 "merge-descriptors": { 1779 "merge-descriptors": {
1406 "version": "1.0.1", 1780 "version": "1.0.1",
1407 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1781 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
...@@ -1438,11 +1812,81 @@ ...@@ -1438,11 +1812,81 @@
1438 "brace-expansion": "^1.1.7" 1812 "brace-expansion": "^1.1.7"
1439 } 1813 }
1440 }, 1814 },
1815 + "mongodb": {
1816 + "version": "4.5.0",
1817 + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz",
1818 + "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==",
1819 + "requires": {
1820 + "bson": "^4.6.2",
1821 + "denque": "^2.0.1",
1822 + "mongodb-connection-string-url": "^2.5.2",
1823 + "saslprep": "^1.0.3",
1824 + "socks": "^2.6.2"
1825 + }
1826 + },
1827 + "mongodb-connection-string-url": {
1828 + "version": "2.5.2",
1829 + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz",
1830 + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==",
1831 + "requires": {
1832 + "@types/whatwg-url": "^8.2.1",
1833 + "whatwg-url": "^11.0.0"
1834 + }
1835 + },
1836 + "mongoose": {
1837 + "version": "6.3.4",
1838 + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.4.tgz",
1839 + "integrity": "sha512-UP0azyGMdY+2YNbJUHeHhnVw5vPzCqs4GQDUwHkilif/rwmSZktUQhQWMp1pUgRNeF2JC30vWGLrInZxD7K/Qw==",
1840 + "requires": {
1841 + "bson": "^4.6.2",
1842 + "kareem": "2.3.5",
1843 + "mongodb": "4.5.0",
1844 + "mpath": "0.9.0",
1845 + "mquery": "4.0.3",
1846 + "ms": "2.1.3",
1847 + "sift": "16.0.0"
1848 + },
1849 + "dependencies": {
1850 + "ms": {
1851 + "version": "2.1.3",
1852 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1853 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1854 + }
1855 + }
1856 + },
1441 "mout": { 1857 "mout": {
1442 "version": "0.12.0", 1858 "version": "0.12.0",
1443 "resolved": "https://registry.npmjs.org/mout/-/mout-0.12.0.tgz", 1859 "resolved": "https://registry.npmjs.org/mout/-/mout-0.12.0.tgz",
1444 "integrity": "sha1-bVskLuMx+dBMaOWPd6kaMGDoyss=" 1860 "integrity": "sha1-bVskLuMx+dBMaOWPd6kaMGDoyss="
1445 }, 1861 },
1862 + "mpath": {
1863 + "version": "0.9.0",
1864 + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
1865 + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew=="
1866 + },
1867 + "mquery": {
1868 + "version": "4.0.3",
1869 + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
1870 + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
1871 + "requires": {
1872 + "debug": "4.x"
1873 + },
1874 + "dependencies": {
1875 + "debug": {
1876 + "version": "4.3.4",
1877 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1878 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1879 + "requires": {
1880 + "ms": "2.1.2"
1881 + }
1882 + },
1883 + "ms": {
1884 + "version": "2.1.2",
1885 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1886 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1887 + }
1888 + }
1889 + },
1446 "ms": { 1890 "ms": {
1447 "version": "2.0.0", 1891 "version": "2.0.0",
1448 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1892 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
...@@ -1527,6 +1971,11 @@ ...@@ -1527,6 +1971,11 @@
1527 "ipaddr.js": "1.9.1" 1971 "ipaddr.js": "1.9.1"
1528 } 1972 }
1529 }, 1973 },
1974 + "punycode": {
1975 + "version": "2.1.1",
1976 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1977 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1978 + },
1530 "qs": { 1979 "qs": {
1531 "version": "6.10.3", 1980 "version": "6.10.3",
1532 "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 1981 "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
...@@ -1587,6 +2036,15 @@ ...@@ -1587,6 +2036,15 @@
1587 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2036 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1588 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2037 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1589 }, 2038 },
2039 + "saslprep": {
2040 + "version": "1.0.3",
2041 + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
2042 + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
2043 + "optional": true,
2044 + "requires": {
2045 + "sparse-bitfield": "^3.0.3"
2046 + }
2047 + },
1590 "send": { 2048 "send": {
1591 "version": "0.18.0", 2049 "version": "0.18.0",
1592 "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2050 "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
...@@ -1640,6 +2098,34 @@ ...@@ -1640,6 +2098,34 @@
1640 "object-inspect": "^1.9.0" 2098 "object-inspect": "^1.9.0"
1641 } 2099 }
1642 }, 2100 },
2101 + "sift": {
2102 + "version": "16.0.0",
2103 + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
2104 + "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ=="
2105 + },
2106 + "smart-buffer": {
2107 + "version": "4.2.0",
2108 + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
2109 + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
2110 + },
2111 + "socks": {
2112 + "version": "2.6.2",
2113 + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
2114 + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
2115 + "requires": {
2116 + "ip": "^1.1.5",
2117 + "smart-buffer": "^4.2.0"
2118 + }
2119 + },
2120 + "sparse-bitfield": {
2121 + "version": "3.0.3",
2122 + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
2123 + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
2124 + "optional": true,
2125 + "requires": {
2126 + "memory-pager": "^1.0.2"
2127 + }
2128 + },
1643 "sqlstring": { 2129 "sqlstring": {
1644 "version": "2.3.1", 2130 "version": "2.3.1",
1645 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 2131 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
...@@ -1678,6 +2164,14 @@ ...@@ -1678,6 +2164,14 @@
1678 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2164 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1679 "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 2165 "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1680 }, 2166 },
2167 + "tr46": {
2168 + "version": "3.0.0",
2169 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
2170 + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
2171 + "requires": {
2172 + "punycode": "^2.1.1"
2173 + }
2174 + },
1681 "type-is": { 2175 "type-is": {
1682 "version": "1.6.18", 2176 "version": "1.6.18",
1683 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2177 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
...@@ -1729,6 +2223,20 @@ ...@@ -1729,6 +2223,20 @@
1729 "version": "1.1.2", 2223 "version": "1.1.2",
1730 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2224 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1731 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2225 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2226 + },
2227 + "webidl-conversions": {
2228 + "version": "7.0.0",
2229 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
2230 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
2231 + },
2232 + "whatwg-url": {
2233 + "version": "11.0.0",
2234 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
2235 + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
2236 + "requires": {
2237 + "tr46": "^3.0.0",
2238 + "webidl-conversions": "^7.0.0"
2239 + }
1732 } 2240 }
1733 } 2241 }
1734 } 2242 }
......
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
12 "body-parser": "^1.20.0", 12 "body-parser": "^1.20.0",
13 "bootstrap": "^5.1.3", 13 "bootstrap": "^5.1.3",
14 "cookie-parser": "^1.4.6", 14 "cookie-parser": "^1.4.6",
15 + "crypto": "^1.0.1",
15 "ejs": "^3.1.7", 16 "ejs": "^3.1.7",
16 "express": "^4.18.1", 17 "express": "^4.18.1",
17 "express-error-handler": "^1.1.0", 18 "express-error-handler": "^1.1.0",
18 "express-session": "^1.17.3", 19 "express-session": "^1.17.3",
19 "http": "^0.0.1-security", 20 "http": "^0.0.1-security",
21 + "mongoose": "^6.3.4",
20 "mysql": "^2.18.1", 22 "mysql": "^2.18.1",
21 "path": "^0.12.7", 23 "path": "^0.12.7",
22 "serve-static": "^1.15.0" 24 "serve-static": "^1.15.0"
......