index.js
11.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
var express = require('express')
var app = express()
var router = express.Router();
var path = require('path') // 상대경로
var mysql_odbc = require('../../db/db_board')();
var myinfo = mysql_odbc.init();
var passport = require('passport')
var LocalStrategy = require('passport-local').Strategy
var requestIp = require('request-ip');
var multer = require('multer');
var storage = multer.diskStorage({ // 2
destination(req, file, cb) {
cb(null, 'assets/img/');
},
filename(req, file, cb) {
cb(null, `${Date.now()}__${file.originalname}`);
},
});
var upload = multer({ storage: storage });
const sharp = require('sharp');
const fs = require('fs');
// 로그용
var logString;
function getTime(){
var today = new Date();
var year = today.getFullYear();
var month = ('0' + (today.getMonth()+1)).slice(-2);
var day = ('0' + today.getDate()).slice(-2);
var hour = ('0' + today.getHours()).slice(-2);
var minute = ('0' + today.getMinutes()).slice(-2);
var second = ('0' + today.getSeconds()).slice(-2);
logString = '['+year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second+'] ';
}
// 시간 갱신용
function init(){
getTime();
setInterval(getTime, 1000)
}
init()
passport.serializeUser(function(user, done){
console.log(logString+'passport session resave: '+ user.ID + '(' + user.nickname + ')')
done(null, user)
});
passport.deserializeUser(function(user, done){
var ID = user.ID;
var nickname = user.nickname;
// console.log('passport session get ID: '+ ID + '(' + nickname + ')')
done(null, {'ID': ID, 'nickname':nickname, 'type': type}); // 세션에서 값을 뽑아서 페이지에 전달하는 역할
})
var searNick;
// main page는 login이 된 상태(세션정보가 있을때만) 접근이 가능하게 하자 -> info에 구현해놓음.
router.get('/', function(req, res){
var ip = requestIp.getClientIp(req);
try{
var id = req.session.passport.user.ID;
// if(!id){
// console.log(logString+'익명 유저의 프로필 접근 시도를 거부했습니다.1')
// res.redirect('/login')
// }
searNick = req.body.search;
var sql = "select profilemsg, type, profilepic from userdb where id =?";
myinfo.query(sql,[id],function(err,rows) {
if (err) console.error("err : " + err);
var nickname = req.user.nickname;
var type = rows[0].type;
var profilemsg = rows[0].profilemsg;
if(rows[0].profilepic){
var profilepic = "../assets/img/"+rows[0].profilepic;
}else{
var profilepic = "../assets/img/noneprofilepic.png";
}
console.log(logString+req.user.ID+'('+nickname+') 유저가 프로필을 보고있습니다.('+ip+')')
res.render('profile.ejs', {'ID':id, 'nickname':nickname, 'profnickname': nickname, 'type': type, 'profilemsg': profilemsg, 'profilepic':profilepic})
})
}
catch{
if(!id){
console.log(logString+'익명 유저의 프로필 접근 시도를 거부했습니다.('+ip+')')
res.sendFile(path.join(__dirname, "../../public/login.html"))
}
}
});
router.post('/', function(req,res){
var ip = requestIp.getClientIp(req);
try{
var id = req.user.ID;
var searNick;
searNick = req.body.search;
var sql = 'select * from userdb where nickname="'+req.body.search+'"';
myinfo.query(sql, function(err,rows) {
if (err) console.error("err : " + err);
if (rows.length != 0){
var id = req.user.ID;
var nickname = req.user.nickname;
var type = rows[0].type;
var profilemsg = rows[0].profilemsg;
var profnickname = rows[0].nickname;
if(rows[0].profilepic){
var profilepic = "../assets/img/"+rows[0].profilepic;
}else{
var profilepic = "../assets/img/noneprofilepic.png";
}
console.log(logString+req.user.ID+'('+nickname+') 유저가 프로필 열람 중입니다.('+ip+')')
res.render('other_profile.ejs', {'ID':id, 'nickname': nickname, 'type':type, 'profilemsg': profilemsg, 'message':'', 'profnickname': profnickname, 'profilepic':profilepic});
}
else {
var id = req.user.ID;
var nickname = req.user.nickname;
var profnickname = req.body.profnickname;
var type = req.body.type;
var profilemsg = req.body.profilemsg
var profilepic = req.body.profilepic
console.log(logString+req.user.ID+'('+nickname+') 유저가 프로필 검색에 실패했습니다.(시도 닉네임: req.body.search // '+ip+')')
res.render('other_profile.ejs', {'ID':id, 'nickname': nickname, 'profnickname': profnickname, 'type': type, 'profilemsg': profilemsg, 'message':'해당 유저를 찾을 수 없습니다', 'profilepic':profilepic})
}
})
}
catch{
if(!id){
console.log(logString+'익명 유저의 프로필 검색 시도를 거부했습니다.('+ip+')')
res.sendFile(path.join(__dirname, "../../public/login.html"))
}
}
})
router.get('/update', function(req,res){
var ip = requestIp.getClientIp(req);
try{
var id = req.user.ID;
// if(!id){
// console.log(logString+'익명 유저의 프로필 수정 시도를 거부했습니다.')
// res.redirect('/login')
// }
var sql = 'select profilemsg,type from userdb where id ="'+req.user.ID+'"';
myinfo.query(sql, function(err,rows) {
if (err) console.error("err : " + err);
var id = req.user.ID;
var nickname = req.user.nickname;
var type = rows[0].type;
var profilemsg = rows[0].profilemsg;
console.log(logString+req.user.ID+'('+nickname+') 유저가 프로필 수정 중입니다.('+ip+')')
res.render('profmsgedit.ejs', {'ID':id, 'nickname': nickname, 'type':type, 'profilemsg': profilemsg, 'message':''});
})
}
catch{
if(!id){
console.log(logString+'익명 유저의 프로필 수정 시도를 거부했습니다.('+ip+')')
res.sendFile(path.join(__dirname, "../../public/login.html"))
}
}
})
router.post('/update', function(req,res,next){
var ip = requestIp.getClientIp(req);
try{
var id = req.user.ID;
var profilemsg = req.body.profilemsg;
var nickname = req.body.nickname;
var type = req.body.type;
var datas = [profilemsg, nickname, type, id]
// 기존 type과 profile만 추출하기 위한 쿼리
var oldType;
var oldProfilemsg;
var subsql = 'select * from userdb where ID="'+id+'"';
myinfo.query(subsql, function(err, result){
if(err) console.error(err)
oldType = result[0].type;
oldProfilemsg = result[0].profilemsg;
})
// 닉네임 중복 거르기
var sql_ = 'select * from userdb where nickname="'+nickname+'"';
myinfo.query(sql_, function(err, result){
if(err) console.error(err)
// 변경하려는 닉네임이 중복이 아닌 경우 or 닉네임 변경이 없는 수정
if(!result.length || (result.length && req.user.ID == result[0].ID)){
// 운영자인 경우 타입을 변경시키지 않고 고정
if(oldType == '운영자'){
type = '운영자'
datas[2] = '운영자';
}
var sql = "update userdb set profilemsg =?, nickname=?, type=? where id =?"
myinfo.query(sql,datas,function(err,result){
if(err) console.error(err)
console.log(logString+req.user.ID+'('+req.session.passport.user.nickname+') 유저가 프로필을 수정했습니다.('+ip+')')
console.log(" ▷ 변경전: "+id+"("+req.user.nickname+") "+oldType+" // "+oldProfilemsg)
req.session.passport.user.nickname = nickname;
console.log(" ▶ 변경후: "+id+"("+nickname+") "+type+" // "+profilemsg)
res.redirect('/profile');
})
}
else{ // 다른 유저의 닉네임과 중복되는 경우
console.log(logString+id+" 유저가 중복된 닉네임으로 변경을 시도했습니다.(시도한 닉네임: "+req.body.nickname+" // ("+ip+')')
res.render('profmsgedit.ejs', {nickname: req.session.passport.user.nickname, profilemsg: oldProfilemsg, message : '중복된 닉네임입니다.'})
}
})
}
catch{
if(!id){
console.log(logString+'익명 유저의 프로필 수정 시도를 거부했습니다.('+ip+')')
res.sendFile(path.join(__dirname, "../../public/login.html"))
}
}
})
router.get('/upload', function(req,res){
var ip = requestIp.getClientIp(req);
try{
var id = req.user.ID;
var nickname = req.user.nickname;
console.log(logString+req.user.ID+'('+nickname+') 유저가 프로필 열람 중입니다.('+ip+')')
if(id) res.render('uploadprof.ejs')
}
catch{
if(!id){
console.log(logString+'익명 유저의 프로필 사진 업로드 접근 시도를 거부했습니다.('+ip+')')
res.send("<script>alert('로그인이 필요합니다.');opener.location.href='/login';window.close();</script>");
}
}
})
router.post('/upload', upload.single('userfile'), function(req,res){
var ip = requestIp.getClientIp(req);
try{
sharp(req.file.path) // 압축할 이미지 경로
.resize({width:500, height:500, position:"left top"})
.withMetadata() // 이미지의 exif데이터 유지
.toBuffer((err, buffer) => {
if (err) throw err;
// 압축된 파일 새로 저장(덮어씌우기)
fs.writeFile(req.file.path, buffer, (err) => {
if (err) throw err;
});
});
var id = req.user.ID;
var ip = requestIp.getClientIp(req);
var profilepic = req.file.filename;
var datas = [profilepic, id]
var picName = profilepic.substr(15)
var sql = "update userdb set profilepic =? where id =?"
myinfo.query(sql,datas,function(err,result){
if(err) console.error(err)
console.log(logString+req.user.ID+'('+req.user.nickname+') 유저가 프로필 사진을 업로드했습니다.(파일명: '+picName+' // '+ip+')')
res.send("<script>alert('업로드가 완료되었습니다.');window.close();</script>");
})
}
catch{
if(!id){
console.log(logString+'익명 유저의 프로필 사진 업로드 시도를 거부했습니다.('+ip+')')
res.send("<script>alert('로그인이 필요합니다.');opener.location.href='/login';window.close();</script>");
}
else{
console.log(logString+req.user.ID+'('+req.user.nickname+') 유저가 파일 업로드 없이 업로드를 시도했습니다.('+ip+')')
res.send("<script>alert('파일을 업로드 해주세요.');history.back();</script>");
}
}
})
function popup(){
var url = "/profile/upload";
var name = "파일 업로드";
var option = "width = 500, height = 500, top = 100, left = 200, location = no"
window.open(url, name, option);
}
function enterkey() {
if (window.event.keyCode == 13) {
// 엔터키가 눌렸을 때 실행할 내용
send();
}
}
module.exports = router;