DCL 3.7.4
Loading...
Searching...
No Matches
Session.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4#include <windows.h>
5#endif
6
7#include <time.h>
8
9#include <dcl/Numeric.h>
10#include <dcl/MD5.h>
11#include <dcl/Files.h>
12
13#include "User.h"
14#include "Session.h"
15
16#if __DCL_HAVE_THIS_FILE__
17#undef __THIS_FILE__
18static const char_t __THIS_FILE__[] = __T("fastpage/Session.cpp");
19#endif
20
21__DCL_BEGIN_NAMESPACE
22
23const wchar_t* Session::SESSION_COOKIE_NAME = L"dclhscsid";
24
25String Session::toString(uint64_t n)
26{
27 wchar_t sz[21];
28 sz[20] = L'\0';
29 int i = 20;
30
31 do {
32 i--;
33 unsigned int r = (unsigned int)(n % 62);
34 if (r <= 9)
35 sz[i] = r + L'0';
36 else if (10 <= r && r <= 35)
37 sz[i] = r - 10 + L'A';
38 else
39 sz[i] = r - 36 + L'a';
40
41 n /= 62;
42 } while(n);
43
44 String str(&sz[i], 20 - i);
45 return str;
46}
47
50 SQLQuery& q,
51 int nServiceUserID
52) : __ctx(ctx), __query(q)
53{
56
59
60 __nServiceUserID = nServiceUserID;
61}
62
63String Session::create(SQLQuery& q, int nUserID)
64{
65 // Guest 세션의 생성
66 StringBuilder strRemoteAddr = __ctx.remoteAddr();
67 strRemoteAddr += L":" + String::valueOf(__ctx.remotePort());
68 String str = strRemoteAddr.toString()
70
71 uint64_t ui64[2];
72 MD5 md;
73 md.update(str.data(), str.length() * sizeof(wchar_t));
74 md.final((byte_t*)ui64);
75/*
76 String strSessionID = UInt64::toString(ui64[0], 32);
77 strSessionID += UInt64::toString(ui64[1], 32);
78*/
79 StringBuilder strSessionID = toString(ui64[0]);
80 strSessionID += toString(ui64[1]);
81
82// String strSessionID = MD5::final(str);
83
84 HttpSetCookie cookie(
86 strSessionID,
87 0, //time(NULL) + 365 * 24 * 60 * 60,
88 L"/"//Files::dirname(__ctx.path())
89 );
90
91 __ctx.addHeader(cookie);
92
93 q.prepare(L""
94 "INSERT INTO DCL_SESSION(SESSION_ID, USER_ID, REMOTE_ADDR, LAST_ACCESS)"
95 "\n VALUES(:SESSION_ID, :USER_ID, :REMOTE_ADDR, CURRENT_TIMESTAMP)"
96 );
97 q.params()[0].setValue(strSessionID);
98 q.params()[1].setValue(nUserID);
99 q.params()[2].setValue(strRemoteAddr);
100
101 q.execute();
102
103 return strSessionID;
104}
105
107{
108 // Guest 세션에서 검사를 시작한다.
110
111 SQLQuery& q = __query;
112
113 ListedStringToStringMap::ConstIterator it =
114 __ctx.__cookieMap.find(SESSION_COOKIE_NAME);
115 if (it == __ctx.__cookieMap.end()) {
116 // Guest session
118 }
119 else {
120 String strSessionID = (*it).value;
121 // 세션이 유효한지 확인
122 String sql = L""
123 "SELECT S.USER_ID, U.USER_NAME, U.ROLE_ID, R.ROLE_NAME"
124 "\n FROM DCL_SESSION AS S"
125 "\n INNER JOIN DCL_USER AS U ON (S.USER_ID = U.USER_ID)"
126 "\n INNER JOIN DCL_ROLE AS R ON (U.ROLE_ID = R.ROLE_ID)"
127 "\n WHERE SESSION_ID = \'" + strSessionID + L'\'';
128 __DCL_TRACE1(L"%ls\n", sql.data());
129 q.execute(sql);
130
131 q.fetch();
132 if (q.eof()) {
133 // 세션이 유효하지 않다. 새로운 Guest 세션을 생성한다.
135 }
136 else {
137 __strSessionID = strSessionID;
138 __nUserID = q.fields()[0].asInteger();
140 {
141 if (!q.fields()[1].isNull())
142 __strUserName = q.fields()[1].asString();
143 }
144 __nRoleID = __nMemberRoleID = q.fields()[2].asInteger();
145 __strRoleName = q.fields()[3].asString();
146
147 q.execute(L""
148 "UPDATE DCL_SESSION "
149 "\n SET LAST_ACCESS = CURRENT_TIMESTAMP "
150 "\n WHERE SESSION_ID = \'" + __strSessionID + L'\''
151 );
152 q.execute(L""
153 "UPDATE DCL_USER SET"
154 "\n LAST_USE = CURRENT_TIMESTAMP"
155 "\n WHERE USER_ID = " + String::valueOf(__nUserID)
156 );
157 }
158 }
159}
160
161bool Session::login(const String& strSignID, const String& strPassword)
162{
163 __DCL_ASSERT(!__strSessionID.isEmpty());
164
165 int nUserID = GUEST_USER_ID;
166 SQLQuery& q = __query;
167
168 q.prepare(L""
169 "SELECT USER_ID, PASSWORD FROM DCL_USER "
170 " WHERE SIGN_ID = :SIGN_ID"
171 );
172 q.params().byName(L"SIGN_ID").setValue(strSignID);
173 q.execute();
174 q.fetch();
175 if (q.eof())
176 return false;
177
178 if (q.fields().at(1).isNull()) {
179 return false;
180 }
181
182 String password = q.fields()[1].asString();
183 if (!(password.isEmpty() && strPassword.isEmpty())) {
184 // if (MD5::final(strInputPassword) != strPassword)
185 if (strPassword != password)
186 return false;
187 }
188
189 String strUserID = q.fields()[0].asString();
190
191 q.execute(L""
192 "UPDATE DCL_USER SET"
193 "\n LAST_SIGNIN = CURRENT_TIMESTAMP, LAST_USE = CURRENT_TIMESTAMP"
194 "\n WHERE USER_ID = " + strUserID
195 );
196
197 q.execute(L""
198 "UPDATE DCL_SESSION SET USER_ID = " + strUserID + L""
199 " WHERE SESSION_ID = \'" + __strSessionID + L"\'"
200 );
201
202 // MySQL에서 UPDATE되는 값이 동일하면 UPDATE되지 않아서
203 // affectedRows가 0이 된다.
204 // __DCL_ASSERT(q.affectedRows() > 0);
205
206 return true;
207}
208
210{
211 __DCL_ASSERT(!__strSessionID.isEmpty());
212
214 return;
215
216 SQLQuery& q = __query;
217 q.execute(L""
218 "UPDATE DCL_SESSION SET USER_ID = " + String::valueOf(GUEST_USER_ID) + L""
219 " WHERE SESSION_ID = \'" + __strSessionID + L"\'"
220 );
221}
222
223bool Session::getMemberRole(int nServiceUserID)
224{
225 SQLQuery& q = __query;
226 q.execute(L""
227 "SELECT ROLE_ID"
228 "\n FROM DCL_USER_MEMBER"
229 "\n WHERE USER_ID = " + String::valueOf(nServiceUserID) + L""
230 "\n AND MEMBER_ID = " + String::valueOf(__nUserID)
231 );
232 q.fetch();
233 if (q.eof())
234 return false;
235
236 __nMemberRoleID = q.fields()[0].asInteger();
237
238 return true;
239}
240
241__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
wchar_t char_t
Definition Config.h:247
unsigned char byte_t
Definition Config.h:246
IOException *size_t r
Definition MediaInfo.cpp:82
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define __T(str)
Definition Object.h:60
String toString() const
Definition DateTime.cpp:843
static DateTime getCurrentLocalTime()
Definition DateTime.cpp:954
Definition MD5.h:18
void update(const void *_p, size_t _n)
Definition MD5.cpp:70
void final(byte_t digest[16])
Definition MD5.cpp:75
_CONST SQLField & at(size_t _index) const
Definition SQL.inl:41
SQLParam & byName(const wchar_t *_name) _CONST __DCL_THROWS1(InvalidIndexException *)
Definition SQLQuery.cpp:157
void prepare(const String &_sql) __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:282
_CONST SQLParams & params() _CONST
Definition SQL.inl:106
_CONST SQLFields & fields() _CONST
Definition SQL.inl:101
void execute() __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:316
bool eof() const
Definition SQL.inl:91
void fetch() __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:336
bool getMemberRole(int nServiceUserID)
Definition Session.cpp:223
Session(HttpServletContextEx &ctx, SQLQuery &q, int nServiceUserID)
Definition Session.cpp:48
int __nUserID
Definition Session.h:33
String __strRoleName
Definition Session.h:36
@ GUEST_ROLE_ID
Definition Session.h:28
@ SYSTEM_USER_ID
Definition Session.h:20
@ GUEST_USER_ID
Definition Session.h:23
int __nRoleID
Definition Session.h:35
int __nSiteUserID
Definition Session.h:38
int __nServiceUserID
Definition Session.h:43
String __strSessionID
Definition Session.h:32
HttpServletContextEx & __ctx
Definition Session.h:41
bool login(const String &strLoginID, const String &strPassword)
Definition Session.cpp:161
SQLQuery & __query
Definition Session.h:42
void check()
Definition Session.cpp:106
String __strUserName
Definition Session.h:34
static const wchar_t * SESSION_COOKIE_NAME
Definition Session.h:16
String create(SQLQuery &q, int nUserID)
Definition Session.cpp:63
void logout()
Definition Session.cpp:209
int __nMemberRoleID
Definition Session.h:39
static String toString(uint64_t n)
Definition Session.cpp:25