OSDN Git Service

MSIE 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     /// IE6 から user_session を取得
115     /// </summary>
116     /// <param name="url">サイト(ニコニコ動画)のURL</param>
117     /// <returns>user_session</returns>
118     private String GetUserSessionFromIE6(String url) {
119         return CutUserSession(GetCookieFromIE6(url), "");
120     }
121
122     /// <summary>
123     /// IE6 からクッキーを取得
124     /// </summary>
125     /// <param name="url">取得するクッキーに関連づけられたURL</param>
126     /// <returns>クッキー文字列</returns>
127     private String GetCookieFromIE6(String url) {
128         int size = 4096;
129         byte[] dummy = new byte[size];
130         Arrays.fill(dummy, (byte) ' ');
131         StringBuilder buff = new StringBuilder(new String(dummy));
132         int[] ref_size = new int[1];
133         ref_size[0] = size;
134         //InternetGetCookie(url, null, buff, /*ref*/ ref_size);
135         return buff.toString().replace(';', ',');
136     }
137     /*
138      *  [DllImport("wininet.dll")]
139      *  private extern static bool InternetGetCookie(string url, string name, StringBuilder data, ref uint size);
140      *
141      *  shuold use NLink.win32
142      */
143
144
145     /** <p>
146      *  Chromium から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
147      *  </p>
148      *  @return user_session
149      */
150     private String GetUserSesionChromium() {
151         String user_session = "";
152         String cookie_file = "";
153         String chromium = "\\Chromium\\User Data\\Default\\Cookies";
154         try {
155             String local_Appdir = System.getenv("LOCALAPPDATA");
156             if (local_Appdir != null && !local_Appdir.isEmpty()) {
157                 // Win7 32bit
158                 cookie_file = local_Appdir + chromium;
159                 if (Path.isFile(cookie_file)) {
160                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
161                     user_session = CutUserSession(dataStr, cookie_file);
162                     return user_session;
163                 }
164             }
165             String profile_dir = System.getenv("USERPROFILE");
166             if (profile_dir != null && !profile_dir.isEmpty()) {
167                 // XP 32bit
168                 cookie_file = profile_dir
169                         + "\\Local Settings\\Application Data" + chromium;
170                 if (Path.isFile(cookie_file)) {
171                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
172                     user_session = CutUserSession(dataStr, cookie_file);
173                     return user_session;
174                 }
175             }
176             return user_session;
177         } catch (Exception e) {
178             e.printStackTrace();
179             return user_session;
180         }
181     }
182
183     /** <p>
184      *  Opera から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
185      *  </p>
186      *  @return user_session
187      */
188     private String GetUserSessionOpera() {
189         String user_session = "";
190         String cookie_file = "";
191         try {
192             String app_dir = System.getenv("APPDATA");
193             if (app_dir != null && !app_dir.isEmpty()) {
194                 // Win7/XP 32bit
195                 cookie_file = app_dir + "\\Opera\\Opera\\cookies4.dat";
196                 if (Path.isFile(cookie_file)) {
197                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
198                     user_session = CutUserSession(dataStr, cookie_file);
199                     return user_session;
200                 }
201             }
202             return "";
203         } catch (Exception e) {
204             e.printStackTrace();
205             return "";
206         }
207     }
208
209     /// <summary>
210     /// 文字列から user_session_ で始まる文字列を切り出して返す。数字とアンダーバー以外の文字で切れる。
211     /// </summary>
212     /// <param name="str">切り出す対象文字列</param>
213     /// <returns>user_session 文字列。見つからなければ空文字を返す</returns>
214     private String CutUserSession(String str, String filename) {
215         String ret = "";
216         int start = str.indexOf("user_session_");
217         if (start >= 0) {
218             int index = start + "user_session_".length();
219             while (index < str.length() && ('0' <= str.charAt(index) && str.charAt(index) <= '9'
220                     || str.charAt(index) == '_')) {
221                 ++index;
222             }
223             ret = str.substring(start, index);
224             // C# の string.SubString( , ) と Java の String.substring( , ) は違うので注意!
225             if (!ret.isEmpty() && !filename.isEmpty()) {
226                 System.out.println("Cookie found: " + filename);
227                 return ret;
228             }
229         }
230         return "";
231     }
232 }