OSDN Git Service

firefox4 のcookie処理クラス
[coroid/inqubus.git] / frontend / src / saccubus / net / BrowserInfo.java
1 /**
2  * Inspired from Nicorank by rankingloid 2008 - 2009
3  */
4 package saccubus.net;
5
6 import java.util.Arrays;
7
8 /**
9 /**
10  * <p>
11  * タイトル: さきゅばす
12  * </p>
13  *
14  * <p>
15  * 説明: ニコニコ動画の動画をコメントつきで保存
16  * </p>
17  *
18  * @version 1.22r3e
19  * @author orz
20  *
21  */
22 public class BrowserInfo {
23
24     public enum BrowserCookieKind {
25
26         NONE, MSIE, IE6, Firefox3, Firefox, Chrome,
27         Opera, Chromium, Other,}
28     private BrowserCookieKind validBrowser;
29
30     public String getBrowserName() {
31         if (validBrowser == BrowserCookieKind.NONE) {
32             return "さきゅばす";
33         } else if (validBrowser == BrowserCookieKind.MSIE) {
34             return "Internet Exploror";
35         } else {
36             return validBrowser.toString();
37         }
38     }
39
40     public BrowserInfo() {
41         validBrowser = BrowserCookieKind.NONE;
42     }
43     private static final String NICOVIDEO_URL = "http://www.nicovideo.jp";
44
45     /**
46      *
47      * @param browserKind
48      * @return
49      */
50     public String getUserSession(BrowserCookieKind browserKind) {
51         String user_session = "";
52         switch (browserKind) {
53             case IE6:
54                 user_session = GetUserSessionFromIE6(NICOVIDEO_URL);
55                 break;
56             case MSIE:
57                 user_session = GetUserSessionFromMSIE();
58                 break;
59             case Firefox:
60                 user_session = GetUserSessionFromFilefox4();
61                 if (!user_session.isEmpty()) {
62                     break;
63                 }
64             case Firefox3:
65                 user_session = GetUserSessionFromFilefox3();
66                 break;
67             case Chrome:
68                 user_session = GetUserSesionChrome();
69                 break;
70             case Chromium:
71                 user_session = GetUserSesionChromium();
72                 break;
73             case Opera:
74                 user_session = GetUserSessionOpera();
75                 break;
76         }
77         if (!user_session.isEmpty()) {
78             validBrowser = browserKind;
79         }
80         return user_session;
81     }
82
83     /**
84      *
85      * @param fileOrDir fullname of file or directory
86      * @return
87      */
88     public String getUserSessionOther(String fileOrDir) {
89         String user_session = "";
90         try {
91             if (Path.isDirectory(fileOrDir)) {
92                 // Directory Type like MSIE
93                 user_session = GetUserSessionFromDirectory(fileOrDir);
94                 return user_session;
95             }
96             if (Path.isFile(fileOrDir)) {
97                 // File Type like Firefox3
98                 String dataStr = Path.ReadAllText(fileOrDir, "UTF-8");
99                 user_session = CutUserSession(dataStr, fileOrDir);
100                 return user_session;
101             }
102             return "";
103         } catch (Exception e) {
104             e.printStackTrace();
105             return "";
106         } finally {
107             if (!user_session.isEmpty()) {
108                 validBrowser = BrowserCookieKind.Other;
109             }
110         }
111     }
112
113     /// <summary>
114     /// Firefox3 から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
115     /// </summary>
116     /// <returns>user_session</returns>
117     private String GetUserSessionFromFilefox3() {
118         String user_session = "";
119         try {
120             String app_dir = System.getenv("APPDATA");
121             if (app_dir == null || app_dir.isEmpty()) {
122                 return "";
123             }
124             String sqlist_filename = app_dir + "\\Mozilla\\Firefox\\Profiles\\cookies.sqlite";
125             if (!Path.isFile(sqlist_filename)) {
126                 return "";
127             }
128             String dataStr = Path.ReadAllText(sqlist_filename, "US-ASCII");
129             user_session = CutUserSession(dataStr, sqlist_filename);
130             return user_session;
131         } catch (Exception e) {
132             e.printStackTrace();
133         }
134         return user_session;
135     }
136
137     /// <summary>
138     /// IE6 から user_session を取得
139     /// </summary>
140     /// <param name="url">サイト(ニコニコ動画)のURL</param>
141     /// <returns>user_session</returns>
142     private String GetUserSessionFromIE6(String url) {
143         return CutUserSession(GetCookieFromIE6(url), "");
144     }
145
146     /// <summary>
147     /// IE6 からクッキーを取得
148     /// </summary>
149     /// <param name="url">取得するクッキーに関連づけられたURL</param>
150     /// <returns>クッキー文字列</returns>
151     private String GetCookieFromIE6(String url) {
152         int size = 4096;
153         byte[] dummy = new byte[size];
154         Arrays.fill(dummy, (byte) ' ');
155         StringBuilder buff = new StringBuilder(new String(dummy));
156         int[] ref_size = new int[1];
157         ref_size[0] = size;
158         //InternetGetCookie(url, null, buff, /*ref*/ ref_size);
159         return buff.toString().replace(';', ',');
160     }
161     /*
162      *  [DllImport("wininet.dll")]
163      *  private extern static bool InternetGetCookie(string url, string name, StringBuilder data, ref uint size);
164      *
165      *  shuold use NLink.win32
166      */
167
168     /** <p>
169      *  IE7/IE8/IE9 から user_session を取得。<br/>
170      *  エラーが起こった場合、例外を投げずに空文字を返す
171      *  </p>
172      *  @return user_session
173      */
174     private String GetUserSessionFromMSIE() {
175         String user_session = "";
176
177         String profile_dir = System.getenv("USERPROFILE");
178         if (profile_dir == null || profile_dir.isEmpty()) {
179             return "";
180         }
181         String search_dir = profile_dir + "\\AppData\\Roaming\\Microsoft\\Windows\\Cookies\\Low\\";
182         user_session = GetUserSessionFromDirectory(search_dir);
183         if (user_session.isEmpty()) {
184             search_dir = profile_dir + "\\AppData\\Roaming\\Microsoft\\Windows\\Cookies\\";
185             user_session = GetUserSessionFromDirectory(search_dir);
186         }
187         if (user_session.isEmpty()) {
188             search_dir = profile_dir + "\\Cookies\\";
189             user_session = GetUserSessionFromDirectory(search_dir);
190         }
191         return user_session;
192     }
193
194     /**
195      * dir_name ディレクトリから MSIE のクッキーを見つけて user_session を返す
196      * @param dir_name
197      * @return
198      */
199     private String GetUserSessionFromDirectory(String dir_name) {
200         String user_session = "";
201         try {
202             if (Path.isDirectory(dir_name)) {
203                 String[] files = Path.GetFiles(dir_name);
204                 for (String fullname : files) {
205                     user_session = CutUserSession(Path.ReadAllText(fullname, "MS932"), fullname);
206                     if (!user_session.isEmpty()) {
207                         return user_session;
208                     }
209
210                     /*  obsolate after WindowsUpdate Aug 2011
211                     String name = Path.GetFileName(fullname);
212                     if (name.indexOf("nicovideo") >= 0 && name.indexOf("www") < 0)
213                     {
214                     user_session = CutUserSession(Path.ReadAllText(fullname, "MS932"), "");
215                     if (!user_session.isEmpty()){
216                     System.out.println("Found cookie in " + fullname.replace("\\", "/"));
217                     return user_session;
218                     }
219                     }
220                      */
221                 }
222                 return "";
223             }
224         } catch (Exception e) {
225             e.printStackTrace();
226         }
227         return "";
228     }
229
230     /** <p>
231      *  Chromium から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
232      *  </p>
233      *  @return user_session
234      */
235     private String GetUserSesionChromium() {
236         String user_session = "";
237         String cookie_file = "";
238         String chromium = "\\Chromium\\User Data\\Default\\Cookies";
239         try {
240             String local_Appdir = System.getenv("LOCALAPPDATA");
241             if (local_Appdir != null && !local_Appdir.isEmpty()) {
242                 // Win7 32bit
243                 cookie_file = local_Appdir + chromium;
244                 if (Path.isFile(cookie_file)) {
245                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
246                     user_session = CutUserSession(dataStr, cookie_file);
247                     return user_session;
248                 }
249             }
250             String profile_dir = System.getenv("USERPROFILE");
251             if (profile_dir != null && !profile_dir.isEmpty()) {
252                 // XP 32bit
253                 cookie_file = profile_dir
254                         + "\\Local Settings\\Application Data" + chromium;
255                 if (Path.isFile(cookie_file)) {
256                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
257                     user_session = CutUserSession(dataStr, cookie_file);
258                     return user_session;
259                 }
260             }
261             return user_session;
262         } catch (Exception e) {
263             e.printStackTrace();
264             return user_session;
265         }
266     }
267
268     /** <p>
269      *  Opera から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
270      *  </p>
271      *  @return user_session
272      */
273     private String GetUserSessionOpera() {
274         String user_session = "";
275         String cookie_file = "";
276         try {
277             String app_dir = System.getenv("APPDATA");
278             if (app_dir != null && !app_dir.isEmpty()) {
279                 // Win7/XP 32bit
280                 cookie_file = app_dir + "\\Opera\\Opera\\cookies4.dat";
281                 if (Path.isFile(cookie_file)) {
282                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
283                     user_session = CutUserSession(dataStr, cookie_file);
284                     return user_session;
285                 }
286             }
287             return "";
288         } catch (Exception e) {
289             e.printStackTrace();
290             return "";
291         }
292     }
293
294     /// <summary>
295     /// 文字列から user_session_ で始まる文字列を切り出して返す。数字とアンダーバー以外の文字で切れる。
296     /// </summary>
297     /// <param name="str">切り出す対象文字列</param>
298     /// <returns>user_session 文字列。見つからなければ空文字を返す</returns>
299     private String CutUserSession(String str, String filename) {
300         String ret = "";
301         int start = str.indexOf("user_session_");
302         if (start >= 0) {
303             int index = start + "user_session_".length();
304             while (index < str.length() && ('0' <= str.charAt(index) && str.charAt(index) <= '9'
305                     || str.charAt(index) == '_')) {
306                 ++index;
307             }
308             ret = str.substring(start, index);
309             // C# の string.SubString( , ) と Java の String.substring( , ) は違うので注意!
310             if (!ret.isEmpty() && !filename.isEmpty()) {
311                 System.out.println("Cookie found: " + filename);
312                 return ret;
313             }
314         }
315         return "";
316     }
317 }