DCL 3.7.4
Loading...
Searching...
No Matches
Session Class Reference

#include <Session.h>

Public Types

enum  {
  NOUSER_USER_ID = (int) - 1 , SYSTEM_USER_ID = 0 , DEFAULT_USER_ID = 1 , DEFAULT_GROUP_ID = 2 ,
  GUEST_USER_ID = 10 , NOUSER_ROLE_ID = -1 , SYSTEM_ROLE_ID = 0 , ADMIN_ROLE_ID = 2 ,
  GUEST_ROLE_ID = 10 , DEFAULT_ROLE_ID = 9
}

Public Member Functions

 Session (HttpServletContextEx &ctx, SQLQuery &q, int nServiceUserID)
void check ()
bool login (const String &strLoginID, const String &strPassword)
void logout ()
bool getMemberRole (int nServiceUserID)
bool isSysGuest () const
bool isSysAdmin () const
bool isMemberGuest () const
bool isMemberAdmin () const
bool isOwner (int nResourceUserID) const

Static Public Member Functions

static String toString (uint64_t n)

Public Attributes

String __strSessionID
int __nUserID
String __strUserName
int __nRoleID
String __strRoleName
int __nSiteUserID
int __nMemberRoleID
HttpServletContextEx__ctx
SQLQuery__query
int __nServiceUserID

Static Public Attributes

static const wchar_t * SESSION_COOKIE_NAME = L"dclhscsid"

Protected Member Functions

String create (SQLQuery &q, int nUserID)

Detailed Description

Definition at line 13 of file Session.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
NOUSER_USER_ID 
SYSTEM_USER_ID 
DEFAULT_USER_ID 
DEFAULT_GROUP_ID 
GUEST_USER_ID 
NOUSER_ROLE_ID 
SYSTEM_ROLE_ID 
ADMIN_ROLE_ID 
GUEST_ROLE_ID 
DEFAULT_ROLE_ID 

Definition at line 18 of file Session.h.

18 {
19 NOUSER_USER_ID = (int) - 1,
23 GUEST_USER_ID = 10,
24
25 NOUSER_ROLE_ID = -1,
27 ADMIN_ROLE_ID = 2,
28 GUEST_ROLE_ID = 10,
30 };
@ SYSTEM_ROLE_ID
Definition Session.h:26
@ GUEST_ROLE_ID
Definition Session.h:28
@ DEFAULT_ROLE_ID
Definition Session.h:29
@ ADMIN_ROLE_ID
Definition Session.h:27
@ NOUSER_USER_ID
Definition Session.h:19
@ NOUSER_ROLE_ID
Definition Session.h:25
@ DEFAULT_USER_ID
Definition Session.h:21
@ SYSTEM_USER_ID
Definition Session.h:20
@ DEFAULT_GROUP_ID
Definition Session.h:22
@ GUEST_USER_ID
Definition Session.h:23

Constructor & Destructor Documentation

◆ Session()

Session::Session ( HttpServletContextEx & ctx,
SQLQuery & q,
int nServiceUserID )

Definition at line 48 of file Session.cpp.

52 : __ctx(ctx), __query(q)
53{
56
59
60 __nServiceUserID = nServiceUserID;
61}
int __nUserID
Definition Session.h:33
int __nRoleID
Definition Session.h:35
int __nSiteUserID
Definition Session.h:38
int __nServiceUserID
Definition Session.h:43
HttpServletContextEx & __ctx
Definition Session.h:41
SQLQuery & __query
Definition Session.h:42
int __nMemberRoleID
Definition Session.h:39

Member Function Documentation

◆ check()

void Session::check ( )

Definition at line 106 of file Session.cpp.

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}
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#define __DCL_ASSERT(expr)
Definition Object.h:394
_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
String __strRoleName
Definition Session.h:36
String __strSessionID
Definition Session.h:32
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

◆ create()

String Session::create ( SQLQuery & q,
int nUserID )
protected

Definition at line 63 of file Session.cpp.

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}
unsigned char byte_t
Definition Config.h:246
String toString() const
Definition DateTime.cpp:843
static DateTime getCurrentLocalTime()
Definition DateTime.cpp:954
void update(const void *_p, size_t _n)
Definition MD5.cpp:70
void final(byte_t digest[16])
Definition MD5.cpp:75
void prepare(const String &_sql) __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:282
_CONST SQLParams & params() _CONST
Definition SQL.inl:106
static String toString(uint64_t n)
Definition Session.cpp:25

◆ getMemberRole()

bool Session::getMemberRole ( int nServiceUserID)

Definition at line 223 of file Session.cpp.

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}

◆ isMemberAdmin()

bool Session::isMemberAdmin ( ) const
inline

Definition at line 85 of file Session.h.

◆ isMemberGuest()

bool Session::isMemberGuest ( ) const
inline

Definition at line 80 of file Session.h.

81{
83}

◆ isOwner()

bool Session::isOwner ( int nResourceUserID) const
inline

Definition at line 90 of file Session.h.

91{
92 return __nUserID == nResourceUserID;
93}

◆ isSysAdmin()

bool Session::isSysAdmin ( ) const
inline

Definition at line 75 of file Session.h.

76{
78}

◆ isSysGuest()

bool Session::isSysGuest ( ) const
inline

Definition at line 70 of file Session.h.

71{
72 return __nRoleID == GUEST_ROLE_ID;
73}

◆ login()

bool Session::login ( const String & strLoginID,
const String & strPassword )

Definition at line 161 of file Session.cpp.

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}
_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

◆ logout()

void Session::logout ( )

Definition at line 209 of file Session.cpp.

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}

◆ toString()

String Session::toString ( uint64_t n)
static

Definition at line 25 of file Session.cpp.

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}
IOException *size_t r
Definition MediaInfo.cpp:82

Member Data Documentation

◆ __ctx

HttpServletContextEx& Session::__ctx

Definition at line 41 of file Session.h.

◆ __nMemberRoleID

int Session::__nMemberRoleID

Definition at line 39 of file Session.h.

◆ __nRoleID

int Session::__nRoleID

Definition at line 35 of file Session.h.

◆ __nServiceUserID

int Session::__nServiceUserID

Definition at line 43 of file Session.h.

◆ __nSiteUserID

int Session::__nSiteUserID

Definition at line 38 of file Session.h.

◆ __nUserID

int Session::__nUserID

Definition at line 33 of file Session.h.

◆ __query

SQLQuery& Session::__query

Definition at line 42 of file Session.h.

◆ __strRoleName

String Session::__strRoleName

Definition at line 36 of file Session.h.

◆ __strSessionID

String Session::__strSessionID

Definition at line 32 of file Session.h.

◆ __strUserName

String Session::__strUserName

Definition at line 34 of file Session.h.

◆ SESSION_COOKIE_NAME

__DCL_BEGIN_NAMESPACE const wchar_t * Session::SESSION_COOKIE_NAME = L"dclhscsid"
static

Definition at line 16 of file Session.h.


The documentation for this class was generated from the following files: