OSDN Git Service

Safari対応
[nlite/nlite.git] / shareCookie / shareCookie.c
1
2 #include "shareCookie.h"
3
4
5 #include <shlobj.h>
6 #include <Wininet.h>
7 #include <Iepmapi.h>
8 #include <sqlite3\sqlite3.h>
9 #include <sqlite3\sqliteManager.h>
10
11 #include <qwerty\qwerty_common.h>
12 #include <qwerty\windebuger.h>
13
14
15 static WCHAR fireFoxCookiePath[_MAX_PATH];                      //\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\83N\83b\83L\81[\82Ì\83p\83X
16 static sqlite3 *firefoxCookie;                                          //\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\83N\83b\83L\81[\82ÌDB
17 static sqlite3_stmt *firefoxCookieStmt;                         //\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\83N\83b\83L\81[\8eæ\93¾\97p\83X\83e\81[\83g\83\81\83\93\83g
18 static CRITICAL_SECTION firefoxCs;                                      //\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\83N\83b\83L\81[\8eæ\93¾\97p\83N\83\8a\83e\83B\83J\83\8b\83Z\83N\83V\83\87\83\93
19
20
21 static WCHAR googleChromeCookiePath[_MAX_PATH];         //\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\83N\83b\83L\81[\82Ì\83p\83X
22 static sqlite3 *googleChromeCookie;                                     //\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\83N\83b\83L\81[\82ÌDB
23 static sqlite3_stmt *googleChromeCookieStmt;            //\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\83N\83b\83L\81[\8eæ\93¾\97p\83X\83e\81[\83g\83\81\83\93\83g
24 static CRITICAL_SECTION googleChromeCs;                         //\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\83N\83b\83L\81[\8eæ\93¾\97p\83N\83\8a\83e\83B\83J\83\8b\83Z\83N\83V\83\87\83\93
25
26
27 static WCHAR safariCookiePath[_MAX_PATH];                       //\83T\83t\83@\83\8a\82Ì\83N\83b\83L\81[\83p\83X
28
29
30 typedef COOKIE_RESULT (*SelfParseCookieCallBack)(LPCSTR targetString,LPCSTR targetEndPointer,LPWSTR cookie,SIZE_T bufSize,LPCWSTR key,LPCWSTR domein);
31
32 ///
33 ///\83N\83\8d\81[\83\80\82Æ\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\8b¤\92Ê\8f\88\97\9d
34 ///
35 static INLINE UINT checkDBAndStmt(sqlite3 **db,sqlite3_stmt **stmt,LPCWSTR path,LPCWSTR sql);
36 static INLINE VOID cookieStepExec(sqlite3_stmt *stmt,LPWSTR cooki,SIZE_T bufSize,COOKIE_RESULT *result);
37
38
39 ///
40 ///\8e©\97Í\82Å\89ð\90Í\82·\8fê\8d\87\82Ì\8b¤\92Ê\8f\88\97\9d
41 ///
42 static INLINE COOKIE_RESULT SelfParseCookie(LPCWSTR cookieFilePath,LPWSTR cookie,SIZE_T bufSize,LPCWSTR key,LPCWSTR domein,SelfParseCookieCallBack callBack);
43
44 ///
45 ///\83C\83\93\83^\81[\83l\83b\83g\83G\83N\83X\83v\83\8d\81[\83\89\81[\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
46 ///
47 static INLINE COOKIE_RESULT GetCookieInternetExplorer(LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein,BOOL isIE);
48
49 ///
50 ///\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
51 ///
52 static INLINE COOKIE_RESULT GetCookieFireFox(LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein);
53
54 ///
55 ///\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
56 ///
57 static INLINE COOKIE_RESULT GetCookieGoogleChrome(LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein);
58
59 ///
60 ///\83I\83y\83\89\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
61 ///
62 static INLINE COOKIE_RESULT GetCookieOpera(LPCSTR targetString,LPCSTR targetEndPointer,LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein);
63
64 ///
65 ///\83T\83t\83@\83\8a\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
66 ///
67 static INLINE COOKIE_RESULT GetCookieSafari(LPCSTR targetString,LPCSTR targetEndPointer,LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein);
68
69 #define FIREFOX_GET_COOKIE_SQL  "SELECT a.name, a.value FROM moz_cookies a WHERE a.name = ?1 AND a.baseDomain = ?2 "                                            //\83t\83@\83C\83A\83t\83H\83b\83N\83X\83N\83b\83L\81[\8eæ\93¾\97pSQL
70
71
72 #define GOOGLECHROME_GET_COOKIE_SQL     "SELECT a.name,a.value FROM cookies a WHERE a.name = ?1 AND (a.host_key = ?2 OR a.host_key = ?3)"       //\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\83N\83b\83L\81[\8eæ\93¾\97pSQL \93ª\82É.\95t\82¢\82Ä\82é\82Ì\82Æ\95t\82¢\82Ä\82È\82¢\82Ì\82ª\82 \82Á\82½\82Ì\82Å\82Æ\82è\82¦\82 \82¦\82¸\97¼\95û\8fE\82¤\82±\82Æ\82É\82µ\82½\81B\8bK\91¥\90«\82ª\82í\82©\82ê\82Î\82à\82¤\8f­\82µ\83X\83}\81[\83g\82É\82¢\82¯\82é
73
74
75 VOID InitializeShareCookie(LPCWSTR appDataPath,LPCWSTR localAppDataPath){
76
77         //FireFox\82Ì\90Ý\92è
78         {
79
80                 WCHAR fireFoxProfilesPath[_MAX_PATH];
81                 WCHAR fireFoxCookieTmp[_MAX_PATH];
82                 LPWSTR fireFoxCookieFileName = L"cookies.sqlite";
83                 
84
85         
86                 LPWSTR index;
87                 
88
89                 wcscpy(fireFoxProfilesPath,appDataPath);
90                 wcscat(fireFoxProfilesPath,L"Mozilla\\Firefox\\profiles.ini");
91
92                 GetPrivateProfileStringW(L"Profile0",L"Path",L"",fireFoxCookieTmp,sizeof(fireFoxCookieTmp) / sizeof(fireFoxCookieTmp[0]),fireFoxProfilesPath);
93
94                 for(index = wcsstr(fireFoxCookieTmp,L"/");index != NULL ;index = wcsstr(fireFoxCookieTmp,L"/")){
95
96                         index[0] = L'\\';
97
98
99                 }
100
101                 switch(GetPrivateProfileIntW(L"Profile0",L"IsRelative",2,fireFoxProfilesPath)){
102
103                 case 0:
104
105                         wcscpy(fireFoxCookiePath,fireFoxCookieTmp);
106                         break;
107
108                 case 1:
109                         wcscpy(fireFoxCookiePath,appDataPath);
110                         wcscat(fireFoxCookiePath,L"Mozilla\\Firefox\\");
111                         wcscat(fireFoxCookiePath,fireFoxCookieTmp);
112                         wcscat(fireFoxCookiePath,L"\\");
113                         wcscat(fireFoxCookiePath,fireFoxCookieFileName);
114
115                         break;
116
117                 default:
118                         //ZeroMemory(fireFoxCookiePath,sizeof(fireFoxCookiePath) / sizeof(fireFoxCookiePath[0]));
119
120                         break;
121
122
123
124
125                 }
126                 /*
127                 if(SqliteManager_open(&firefoxCookie,fireFoxCookiePath,SQLITE_OPEN_READONLY,0) == SQLITE_OK){
128
129                         rc = SqliteManager_prepare( firefoxCookie, WTEXT(FIREFOX_GET_COOKIE_SQL), -1, &firefoxCookieStmt,(void**)NULL);
130                         dumpln(TEXT("firefox\82Ì\83N\83b\83L\81[\83t\83@\83C\83\8b\82ð\8aJ\82¢\82½"));
131                 }
132                 */
133                 checkDBAndStmt(&firefoxCookie,&firefoxCookieStmt,fireFoxCookiePath,WTEXT(FIREFOX_GET_COOKIE_SQL));
134
135                 InitializeCriticalSection(&firefoxCs);
136         }
137         
138         //GoogleChrome\82Ì\90Ý\92è
139         {
140
141                 wcscpy(googleChromeCookiePath,localAppDataPath);
142                 wcscat(googleChromeCookiePath,L"Google\\Chrome\\User Data\\Default\\Cookies");
143
144
145                 
146                 /*
147                 if(SqliteManager_open(&googleChromeCookie,googleChromeCookiePath,SQLITE_OPEN_READONLY,0) == SQLITE_OK){
148
149
150                         rc = SqliteManager_prepare( googleChromeCookie, WTEXT(GOOGLECHROME_GET_COOKIE_SQL), -1, &googleChromeCookieStmt,(void**)NULL);
151                         dumpln(TEXT("chrome\82Ì\83N\83b\83L\81[\83t\83@\83C\83\8b\82ð\8aJ\82¢\82½"));
152                 }
153                 */
154                 checkDBAndStmt(&googleChromeCookie,&googleChromeCookieStmt,googleChromeCookiePath,WTEXT(GOOGLECHROME_GET_COOKIE_SQL));
155
156                 InitializeCriticalSection(&googleChromeCs);
157
158
159
160
161
162
163
164         }
165
166
167         //\83T\83t\83@\83\8a\82Ì\90Ý\92è
168         
169         wcscpy(safariCookiePath,appDataPath);
170         wcscat(safariCookiePath,L"Apple Computer\\Safari\\Cookies\\Cookies.binarycookies");
171
172         return;
173 }
174
175 VOID FinalizeShareCookie(){
176
177
178         DeleteCriticalSection(&firefoxCs);
179         DeleteCriticalSection(&googleChromeCs);
180         sqlite3_finalize(firefoxCookieStmt);
181         sqlite3_finalize(googleChromeCookieStmt);
182         SqliteManager_close(&firefoxCookie);
183         SqliteManager_close(&googleChromeCookie);
184
185
186
187         return;
188 }
189
190
191
192 COOKIE_RESULT GetCookie(BROWSERTYPE browserType,LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein){
193
194         //\83u\83\89\83E\83U\83^\83C\83v\82É\82æ\82è\8eÀ\8ds\82·\82é\8aÖ\90\94\82ð\8c\88\92è\82·\82é
195
196         switch(browserType){
197
198                 //IE\82Ì\8fê\8d\87
199         case BT_INTERNET_EXPLORER:
200
201
202                 return GetCookieInternetExplorer(cookie,bufSize,key,domein,TRUE);
203
204                 //\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\8fê\8d\87
205         case BT_FIRE_FOX:
206
207                 return  GetCookieFireFox(cookie,bufSize,key,domein);
208
209                 //\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\8fê\8d\87
210         case BT_GOOGLE_CHROME:
211
212
213                 return  GetCookieGoogleChrome(cookie,bufSize,key,domein);
214
215                 //\83I\83y\83\89\82Ì\8fê\8d\87
216         case BT_OPERA:
217
218                 return SelfParseCookie(NULL,cookie,bufSize,key,domein,GetCookieOpera);
219                 
220
221                 //\83T\83t\83@\83\8a\82Ì\8fê\8d\87
222         case BT_SAFARI:
223                 return SelfParseCookie(safariCookiePath,cookie,bufSize,key,domein,GetCookieSafari);
224                 
225
226                 //IE\83R\83\93\83|\81[\83l\83\93\83g\82Ì\8fê\8d\87
227         case BT_IE_COMPONENT:
228
229                 return GetCookieInternetExplorer(cookie,bufSize,key,domein,FALSE);
230
231
232                 //\83u\83\89\83E\83U\83^\83C\83v\82ª\90Ý\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87
233         case BT_NOSETTING:
234
235                 return  COOKIE_ERR_BROWSERTYPE_NOSETTING;
236
237
238
239
240                 //\96¢\92è\8b`\82Ì\83u\83\89\83E\83U\83^\83C\83v\82ª\8ew\92è\82³\82ê\82½\8fê\8d\87
241         default:
242
243                 return  COOKIE_ERR_UNDEFINED_BROWSERTYPE;
244
245         }
246
247
248
249
250
251 }
252
253 ///
254 ///\83C\83\93\83^\81[\83l\83b\83g\83G\83N\83X\83v\83\8d\81[\83\89\81[\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
255 ///
256 static INLINE COOKIE_RESULT GetCookieInternetExplorer(LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein,BOOL isIE){
257
258 #define GET_IE_COOKIE_URL_MAXLENGTH                     LENGTH_512              //url\83o\83b\83t\83@\92·
259         
260         HKEY hKey = (HKEY)NULL;                                                                 //\83\8c\83W\83X\83g\83\8a\83L\81[
261         COOKIE_RESULT result = COOKIE_ERR_OK;                                           //\8c\8b\89Ê\83R\81[\83h
262         DWORD data;                                                                                             //\83\8c\83W\83X\83g\83\8a\92l\8ai\94[\95Ï\90\94
263         DWORD size = sizeof(data);                                                              //data\82Ì\83T\83C\83Y
264         HRESULT cookieResult;                                                                   //\83N\83b\83L\81[\8eæ\93¾\8c\8b\89Ê\83R\81[\83h
265         BOOL  isProtectedMode = FALSE;                                                  //\95Û\8cì\83\82\81[\83h\83t\83\89\83O
266         WCHAR url[GET_IE_COOKIE_URL_MAXLENGTH];                                 //url\83o\83b\83t\83@
267
268         //IE\82©IE\83R\83\93\83|\81[\83l\83\93\83g\82©\82ð\94»\92è
269         if(isIE){
270
271                 //\83\8c\83W\83X\83g\83\8a\83L\81[\82ð\93Ç\82Ý\8eæ\82è\90ê\97p\82Å\83I\81[\83v\83\93
272                 if(RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3"),0,KEY_READ,&hKey) != ERROR_SUCCESS){
273                         return COOKIE_ERR_INTERNETOPTION_NOTOPEN;
274                 }
275
276
277
278
279
280                 //\95Û\8cì\83\82\81[\83h\82Ì\8fó\91Ô\82ð\8eæ\93¾
281                 switch(RegQueryValueEx(hKey,TEXT("2500"),(LPDWORD)NULL,(LPDWORD)NULL,(LPBYTE)&data,&size)){
282
283
284                         //\95Û\8cì\83\82\81[\83h\8eæ\93¾\82É\90¬\8c÷
285                 case ERROR_SUCCESS:
286
287                         //\8eæ\93¾\82µ\82½\92l\82ª0\82¾\82Á\82½\8fê\8d\87\81A\95Û\8cì\83\82\81[\83h\83t\83\89\83O\82ðTRUE\82É\82·\82é
288                         isProtectedMode = data == 0;
289                         
290
291                         break;
292
293                 
294                         //\95Û\8cì\83\82\81[\83h\8eæ\93¾\82É\8e¸\94s\82µ\82½\8fê\8d\87\82Å\82à\83\8c\83W\83X\83g\83\8a\92l\82ª\8c©\82Â\82©\82ç\82È\82¢\83G\83\89\81[\82Å\82 \82ê\82Î\81AXP\88È\91O\82ÌOS\82Æ\94»\92è\82³\82ê\81A\95Û\8cì\83\82\81[\83h\82ÍFALSE\82Ì\82Ü\82Ü\82É\82·\82é
295                 case ERROR_FILE_NOT_FOUND:
296
297
298
299                         break;
300
301                         //\8fã\8bL\83G\83\89\81[\88È\8aO\82Ì\83G\83\89\81[\82ª\94­\90\82µ\82½\8fê\8d\87\81A\83N\83b\83L\81[\8eæ\93¾\82ð\8e¸\94s\82Æ\82·\82é
302                 default:
303                 
304                         result = COOKIE_ERR_PROTECTIONMODE_READFAILD;
305                         goto end;
306
307                 }//switch(RegQueryValueEx(hKey,TEXT("2500"),(LPDWORD)NULL,(LPDWORD)NULL,(LPBYTE)&data,&size))
308         }//if(isIE)
309
310
311
312         
313         
314
315         //\93n\82³\82ê\82½url\82Ì\92·\82³\82ªGET_IE_COOKIE_URL_MAXLENGTH\82æ\82è\82à\92·\82©\82Á\82½\8fê\8d\87\81AURL\95\8e\9a\97ñ\82ª\92·\82·\82¬\82é\83G\83\89\81[\83R\81[\83h\82ðresult\82É\82¢\82ê\82é
316         if(wcslen(domein) >= GET_IE_COOKIE_URL_MAXLENGTH){
317                 result = COOKIE_ERR_DETAIL_URL_TOOBIG;
318
319
320         } else {
321                 //\83h\83\81\83C\83\93\82©\82çurl\82ð\90Ý\92è
322                 wcscpy(url,L"http://");
323                 wcscat(url,domein);
324
325                 //\95Û\8cì\83\82\81[\83h\83t\83\89\83O\82ªTRUE\82È\82çIEGetProtectedModeCookie\82Å\83N\83b\83L\81[\82Ì\92l\82ð\8eæ\93¾
326                 if(isProtectedMode == TRUE){
327                         cookieResult = IEGetProtectedModeCookie(url,key,cookie,&bufSize,0);
328                         
329
330                 //\95Û\8cì\83\82\81[\83h\83t\83\89\83O\82ªFALSE\82È\82çInternetGetCookieEx\82Å\83N\83b\83L\81[\82Ì\92l\82ð\8eæ\93¾
331                 }else{
332                         if(InternetGetCookieEx(url,key,cookie,&bufSize,0,NULL) == TRUE){
333
334                                 cookieResult = S_OK;
335                         }else {
336                                 cookieResult = GetLastError();
337                         }
338                                 
339                         
340                 }
341                         
342                 
343                         
344
345                 //\8c\8b\89Ê\83R\81[\83h\94»\92è
346                 if(cookieResult == ERROR_SUCCESS){
347
348
349                         //\8eæ\93¾\82µ\82½\83N\83b\83L\81[\82Ì\83T\83C\83Y\82ª0\82æ\82è\91å\82«\82¯\82ê\82Î\81Aresults\82É\90³\8fí\8fI\97¹\82Ì\92l\82ð\90Ý\92è
350                         if(bufSize > 0){
351
352                                 result = COOKIE_ERR_OK;
353
354                         //\8eæ\93¾\82µ\82½\83N\83b\83L\81[\82Ì\83T\83C\83Y\82ª0\82Ì\8fê\8d\87\81AnotFoundError\82ð\90Ý\92è
355                         } else {
356                                 result = COOKIE_ERR_DETAIL_NOTFOUND;
357
358                         }//if(bufSize > 0)
359
360                 //\8c\8b\89Ê\83R\81[\83h\82ª\90³\8fí\8fI\97¹\82Å\82Í\82È\82¢\8fê\8d\87results\82É\83G\83\89\81[\82Ì\8fÚ\8d×\82ð\90Ý\92è
361                 } else {
362         
363
364                         switch(cookieResult){
365                                 //\83o\83b\83t\83@\92·\82ª\91«\82è\82È\82¢\8fê\8d\87\82Ì\83G\83\89\81[winerror.h\82É\90Ý\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½\82Ì\82Å\82»\82Ì\82Ü\82Ü\82Ì\92l\82Å\94ò\82Ô\82æ\82¤\82É\82µ\82Ä\82 \82é\82Ç\82±\82©\82É\92è\8b`\82³\82ê\82Ä\82¢\82é\82©\82à\82µ\82ê\82È\82¢\82Ì\82Å\8c©\82Â\82¯\82½\82ç\92è\8b`\83}\83N\83\8d\82É\92u\82«\8a·\82¦\82é
366                         case 0x8007007a:
367
368                                 result = COOKIEERR_DETAIL_RESULT_TOOBIG;
369
370                                 break;
371
372                                 //\96¢\92è\8b`\82Ì\83G\83\89\81[\82ª\94­\90\82µ\82½\8fê\8d\87
373
374
375                         case INTERNET_COOKIE_HTTPONLY:
376                         default:
377
378                                 wincheck(cookieResult);
379
380                                 result = COOKIE_ERR_UNKNOWN;
381
382                                 break;
383
384                         }//switch(cookieResult)
385                 }//if(cookieResult == ERROR_SUCCESS)
386         }//if(wcslen(domeins[index]) >= GET_IE_COOKIE_URL_MAXLENGTH)
387
388
389
390
391 end:
392         //\8aJ\82¢\82½\83\8c\83W\83X\83g\83\8a\82ð\95Â\82\82é
393         RegCloseKey(hKey);
394
395         return result;
396 }
397
398 ///
399 ///\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
400 ///
401 static INLINE COOKIE_RESULT GetCookieFireFox(LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein){
402
403         COOKIE_RESULT result = COOKIE_ERR_OK;                                           //\8c\8b\89Ê\83R\81[\83h
404         LPCWSTR pName = (LPCWSTR)NULL;                                          //\96¼\91O\82Ì\92l\82ð\8am\95Û\82·\82é\88ê\8e\9e\93I\82È\83|\83C\83\93\83^
405         LPCWSTR pValue = (LPCWSTR)NULL;                                         //value\82Ì\92l\82ð\8am\95Û\82·\82é\88ê\8e\9e\93I\82È\83|\83C\83\93\83^
406         
407         
408
409         
410
411         //db,\83X\83e\81[\83g\83\81\83\93\83g\82ª\8aJ\82©\82ê\82Ä\82¢\82é\82©\83`\83F\83b\83N
412         switch(checkDBAndStmt(&firefoxCookie,&firefoxCookieStmt,fireFoxCookiePath, WTEXT(FIREFOX_GET_COOKIE_SQL))){
413
414         case 0:
415                 break;
416
417         case 1:
418                 result = COOKIE_ERR_DBOPEN_FAILED;
419                 goto end;
420
421         case 2:
422                 result = COOKIE_ERR_CREATESTMT_FAILED;
423                 goto end;
424
425
426         }
427
428         EnterCriticalSection(&firefoxCs);
429
430         
431
432         switch(sqlite3_bind_text16(firefoxCookieStmt,1,key,-1,SQLITE_STATIC)){
433
434         case SQLITE_OK:
435
436
437                 switch(sqlite3_bind_text16(firefoxCookieStmt,2,domein,-1,SQLITE_STATIC)){
438
439                 case SQLITE_OK:
440
441                         cookieStepExec(firefoxCookieStmt,cookie,bufSize, &result);
442
443                         
444
445
446                         break;
447
448                 case SQLITE_TOOBIG:
449
450                         result = COOKIE_ERR_DETAIL_URL_TOOBIG;
451
452
453                         break;
454
455                 default:
456
457                         result = COOKIE_ERR_UNKNOWN;
458
459
460                         break;
461
462                 }//switch(sqlite3_bind_text16(firefoxCookieStmt,2,domeins[index],sizeof(WCHAR) * (wcslen(key[index]) + 1),SQLITE_STATIC))
463
464
465
466
467                 break;//SQLITE_OK
468
469         case SQLITE_TOOBIG:
470
471                 result = COOKIE_ERR_DETAIL_KEY_TOOBIG;
472
473                 break;
474
475         default:
476
477                 result = COOKIE_ERR_UNKNOWN;
478
479
480                 break;
481
482         }//switch(sqlite3_bind_text16(firefoxCookieStmt,1,key[index],sizeof(WCHAR) * (wcslen(key[index]) + 1),SQLITE_STATIC))
483
484         //\83p\83\89\83\81\83^\82Ì\83\8a\83Z\83b\83g(\83o\83C\83\93\83h\89ð\8f\9c)
485         sqlite3_reset(firefoxCookieStmt);
486
487
488         
489         LeaveCriticalSection(&firefoxCs);
490
491 end:
492
493
494         return result;
495 }
496
497
498
499
500
501
502 ///
503 ///\83O\81[\83O\83\8b\83N\83\8d\81[\83\80\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
504 ///
505 static INLINE COOKIE_RESULT GetCookieGoogleChrome(LPWSTR cookie,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein){
506
507
508
509         COOKIE_RESULT result = COOKIE_ERR_OK;                                   //\8c\8b\89Ê\83R\81[\83h
510         LPCWSTR pName = (LPCWSTR)NULL;                                          //\96¼\91O\82Ì\92l\82ð\8am\95Û\82·\82é\88ê\8e\9e\93I\82È\83|\83C\83\93\83^
511         LPCWSTR pValue = (LPCWSTR)NULL;                                         //value\82Ì\92l\82ð\8am\95Û\82·\82é\88ê\8e\9e\93I\82È\83|\83C\83\93\83^
512         WCHAR host_key2Buf[LENGTH_DOMEIN] = {L"."};                                             //\83h\83\81\83C\83\93\82»\82Ì\82Q\97Ì\88æ
513         LPWSTR pHostKey = &host_key2Buf[1];
514         
515
516
517         
518
519         //db,\83X\83e\81[\83g\83\81\83\93\83g\82ª\8aJ\82©\82ê\82Ä\82¢\82é\82©\83`\83F\83b\83N
520         switch(checkDBAndStmt(&googleChromeCookie,&googleChromeCookieStmt,googleChromeCookiePath, WTEXT(GOOGLECHROME_GET_COOKIE_SQL))){
521
522         case 0:
523                 break;
524
525         case 1:
526                 result = COOKIE_ERR_DBOPEN_FAILED;
527                 goto end;
528
529         case 2:
530                 result = COOKIE_ERR_CREATESTMT_FAILED;
531                 goto end;
532
533
534         }
535
536         EnterCriticalSection(&googleChromeCs);
537
538
539
540
541         //\83X\83e\81[\83g\83\81\83\93\83g\82É\83p\83\89\83\81\83^\82ð\90Ý\92è1
542         switch(sqlite3_bind_text16(googleChromeCookieStmt,1,key,-1,SQLITE_STATIC)){
543
544         case SQLITE_OK:
545
546                 //\83X\83e\81[\83g\83\81\83\93\83g\82É\83p\83\89\83\81\83^\82ð\90Ý\92è2
547                 switch(sqlite3_bind_text16(googleChromeCookieStmt,2,domein,-1,SQLITE_STATIC)){
548
549                 case SQLITE_OK:
550
551                         if(wcslen(domein) > LENGTH_DOMEIN -2){
552
553                                 result = COOKIE_ERR_DETAIL_URL_TOOBIG;
554                                 
555
556                                 break;
557
558                         }
559
560                         wcscpy(pHostKey,domein);                                                //\82±\82Ì\82 \82½\82è\82Í\82à\82¤\8f­\82µ\8cø\97¦\89»\82Å\82«\82é\81H
561
562                         //\83X\83e\81[\83g\83\81\83\93\83g\82É\83p\83\89\83\81\83^\82ð\90Ý\92è3
563                         switch(sqlite3_bind_text16(googleChromeCookieStmt,3,host_key2Buf,-1,SQLITE_STATIC)){
564
565                         case SQLITE_OK:
566
567                 
568                                 //\83N\83b\83L\81[\8eæ\93¾SQL\8eÀ\8ds
569                                 cookieStepExec(googleChromeCookieStmt,cookie,bufSize,&result);
570
571                                 
572
573
574                                 break;
575
576
577                                 case SQLITE_TOOBIG:
578
579                                         result = COOKIE_ERR_DETAIL_URL_TOOBIG;
580
581
582                                         break;
583
584                                 default:
585                                 
586                                         result = COOKIE_ERR_UNKNOWN;
587
588
589                                 break;
590
591                         }//switch(sqlite3_bind_text16(googleChromeCookieStmt,3,domeins[index],-1,SQLITE_STATIC))
592
593
594
595                         break;
596
597                 case SQLITE_TOOBIG:
598
599                         result = COOKIE_ERR_DETAIL_URL_TOOBIG;
600
601
602                         break;
603
604                 default:
605                                 
606                         result = COOKIE_ERR_UNKNOWN;
607
608
609                         break;
610
611                 }//switch(sqlite3_bind_text16(googleChromeCookieStmt,2,domeins[index],sizeof(WCHAR) * (wcslen(key[index]) + 1),SQLITE_STATIC))
612
613
614
615
616                 break;//SQLITE_OK
617
618         case SQLITE_TOOBIG:
619
620                 result = COOKIE_ERR_DETAIL_KEY_TOOBIG;
621
622
623                 break;
624
625         default:
626
627                 result = COOKIE_ERR_UNKNOWN;
628
629
630         }//switch(sqlite3_bind_text16(googleChromeCookieStmt,1,key[index],sizeof(WCHAR) * (wcslen(key[index]) + 1),SQLITE_STATIC))
631
632         //\83p\83\89\83\81\83^\82Ì\83\8a\83Z\83b\83g(\83o\83C\83\93\83h\89ð\8f\9c)
633         sqlite3_reset(googleChromeCookieStmt);
634
635
636         
637         LeaveCriticalSection(&googleChromeCs);
638
639 end:
640
641
642
643         return result;
644 }
645
646 ///
647 ///\83I\83y\83\89\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
648 ///
649 static INLINE COOKIE_RESULT GetCookieOpera(LPCSTR targetString,LPCSTR targetEndPointer,LPWSTR cookies,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein){
650
651         
652
653         return COOKIE_ERR_DETAIL_NOTFOUND;
654 }
655
656 ///
657 ///\83T\83t\83@\83\8a\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾
658 ///
659 static INLINE COOKIE_RESULT GetCookieSafari(LPCSTR targetString,LPCSTR targetEndPointer,LPWSTR cookies,SIZE_T bufSize, LPCWSTR key,LPCWSTR domein){
660         COOKIE_RESULT result = COOKIE_ERR_UNKNOWN;
661         CHAR mb_key[_MAX_PATH] = "A";
662         CHAR mb_domein[_MAX_PATH] = ".";
663         LPCSTR cookiePointer;
664         LPCSTR domeinPointer;
665         SIZE_T mb_keyLen;
666
667         if(ARRAY_LENGTH(mb_key) < GetLenToMB(CP_THREAD_ACP,key) - 1){
668                 
669                 goto keybuffbigerr;
670
671         } else if(ARRAY_LENGTH(mb_domein) - 1 < GetLenToMB(CP_THREAD_ACP,domein) ){
672
673                 goto domeinbuffbigerr;
674
675         }
676
677         WideToMB(CP_THREAD_ACP,key,mb_key + 1,ARRAY_LENGTH(mb_key) - 1);
678         WideToMB(CP_THREAD_ACP,domein,mb_domein + 1,ARRAY_LENGTH(mb_domein) - 1);
679         mb_keyLen = strlen(mb_key);
680         
681         for(;targetString < targetEndPointer;targetString += strlen(targetString) + 1){
682
683                 if(strstr(targetString,mb_key) != NULL){
684
685                         cookiePointer = targetString + strlen(targetString) + 1;
686                         domeinPointer = cookiePointer + strlen(cookiePointer) + 1;
687
688                         if(strcmp(mb_domein,domeinPointer) == 0){
689
690                                 if(((INT_PTR)bufSize) < GetLenToWide(CP_THREAD_ACP,cookiePointer) + wcslen(key) + 1){
691
692                                         goto cookiebuffbigerr;
693                                 }
694                                 wcscpy(cookies,key);
695                                 cookies += wcslen(cookies);
696                                 cookies[0] = L'=';
697                                 cookies++;
698
699                                 MBToWide(CP_THREAD_ACP,cookiePointer,cookies,bufSize);
700                                 result = COOKIE_ERR_OK;
701                         }
702                 }
703
704         }
705
706 end:
707
708
709         return result;
710
711
712 keybuffbigerr:
713         result = COOKIE_ERR_DETAIL_URL_TOOBIG;
714         goto end;
715
716 domeinbuffbigerr:
717         result = COOKIE_ERR_DETAIL_DOMEIN_TOOBIG;
718         goto end;
719
720 cookiebuffbigerr:
721         result = COOKIEERR_DETAIL_RESULT_TOOBIG;
722         goto end;
723 }
724
725 ///
726 ///\83N\83\8d\81[\83\80\82Æ\83t\83@\83C\83A\83t\83H\83b\83N\83X\82Ì\8b¤\92Ê\8f\88\97\9d
727 ///
728
729 static INLINE UINT checkDBAndStmt(sqlite3 **db,sqlite3_stmt **stmt,LPCWSTR path,LPCWSTR sql){
730
731
732         //DB\83|\83C\83\93\83^\82ªNULL\82Ì\8fê\8d\87\82à\82¤\88ê\93xDB\82ð\83I\81[\83v\83\93\82·\82é\82»\82ê\82Å\82àNULL\82Ì\8fê\8d\87\81A\83G\83\89\81[\82ð\95Ô\82·
733         if(*db == NULL){
734                 SqliteManager_open(db,path,SQLITE_OPEN_READONLY,0);
735                 if(*db == NULL){
736                         return 1;
737
738                 }
739         }
740
741         //\83X\83e\81[\83g\83\81\83\93\83g\82ªNULL\82Ì\8fê\8d\87\82à\82¤\88ê\93x\83X\83e\81[\83g\83\81\83\93\83g\82Ì\8dì\90¬\82ð\8ds\82¤\81A\8e¸\94s\82µ\82½\8fê\8d\87\83G\83\89\81[\82ð\95Ô\82·
742         if(*stmt == NULL){
743                 SqliteManager_prepare( *db,sql, -1, stmt,(void**)NULL);
744                 if(*stmt == NULL){
745                         return 2;
746
747
748                 }
749         }
750
751         return 0;
752
753 }
754
755 static INLINE VOID cookieStepExec(sqlite3_stmt *stmt,LPWSTR cookie,SIZE_T bufSize,COOKIE_RESULT *result){
756
757         LPCWSTR pName;
758         LPCWSTR pValue;
759         INT_PTR rc;
760
761
762         //dumpln_mb(CP_UTF8,"sql%s",sqlite3_sql(stmt));
763
764         do{
765                 //sql\82ª\90¬\8c÷\82µ\82½\8fê\8d\87\81A\8eæ\93¾\82µ\82½value\82ð\8c\8b\89Ê\82É\8eû\82ß\82é
766                 rc =  sqlite3_step( stmt );
767
768         }while(SQLITE_BUSY == rc || SQLITE_LOCKED == rc);
769
770
771         switch(rc){
772
773         case SQLITE_ROW:
774
775
776                 pName = (LPCWSTR)sqlite3_column_text16( stmt, 0 );
777                 pValue   = (LPCWSTR)sqlite3_column_text16( stmt, 1 );
778
779                 //\8eæ\93¾\82µ\82½\95\8e\9a\97ñ\82ª\83o\83b\83t\83@\82Ì\83T\83C\83Y\82æ\82è\91å\82«\82©\82Á\82½\8fê\8d\87\81A\83o\83b\83t\83@\83T\83C\83Y\82ª\8f¬\82³\82¢\83G\83\89\81[\82ð\8ai\94[\82·\82é
780                 if(wcslen(pValue) + wcslen(pName) + 2 >= bufSize){
781
782                         *result = COOKIEERR_DETAIL_RESULT_TOOBIG;
783
784
785                 } else  {
786
787
788                         wcscpy(cookie,pName);
789                         wcscat(cookie,L"=");
790                         wcscat(cookie,pValue);
791
792
793                         
794
795                         
796
797                 }
798                         
799
800
801                 break;
802
803
804         case SQLITE_DONE:
805                 *result = COOKIE_ERR_DETAIL_NOTFOUND;
806
807                 break;
808
809         default:
810                 *result = COOKIE_ERR_UNKNOWN;
811
812                 break;
813
814         }
815
816         return;
817
818
819 }
820
821
822 static COOKIE_RESULT SelfParseCookie(LPCWSTR cookieFilePath,LPWSTR cookie,SIZE_T bufSize,LPCWSTR key,LPCWSTR domein,SelfParseCookieCallBack callBack){
823
824         COOKIE_RESULT result = COOKIE_ERR_UNKNOWN;
825
826         HANDLE hCookieFile = CreateFile(cookieFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
827         if(hCookieFile == INVALID_HANDLE_VALUE ){
828
829                 goto fileopenerr;
830         }
831         {
832                 DWORD readSize;
833                 DWORD highSize;
834                 DWORD lowSize = GetFileSize(hCookieFile,&highSize);
835                 SIZE_T bufferSize = MAKELONG(lowSize,highSize);
836                 LPSTR buffer = (LPSTR)malloc(bufferSize);
837                 
838                 ReadFile(hCookieFile,buffer,bufferSize,&readSize,NULL);
839                 
840         
841
842                 
843                 result = callBack(buffer,buffer + (bufferSize / sizeof(CHAR)),cookie,bufSize,key,domein);
844                 free(buffer);
845         }
846
847 end:
848         
849         CloseHandle(hCookieFile);
850         
851         return result;
852
853 fileopenerr:
854         result = COOKIE_ERR_OPEN_FAILED;
855         goto end;
856 }