OSDN Git Service

cookie処理コミット漏れ
[coroid/inqubus.git] / frontend / src / yukihane / inqubus / cookie / Cookie.java
1 package yukihane.inqubus.cookie;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.util.HashMap;
6 import java.util.Map;
7 import java.util.regex.Matcher;
8 import java.util.regex.Pattern;
9 import org.apache.commons.io.FileUtils;
10 import org.apache.commons.lang.StringUtils;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 /**
15  * ニコニコ動画のクッキーを扱うための基本クラスです.
16  * @author yuki
17  */
18 public abstract class Cookie {
19
20     private static final Logger logger = LoggerFactory.getLogger(Cookie.class);
21     private static final Pattern USER_SESSION_PATTERN = Pattern.compile("(user_session_[\\d_]+)");
22
23     public enum BrowserType {
24
25         MSIE, FIREFOX, CHROME, CHROMIUM, OPERA, OTHER
26     }
27
28     public static Cookie create(BrowserType type, String dir) {
29         switch (type) {
30             case MSIE:
31                 return new CookieWinMsIe();
32             case FIREFOX:
33                 return new CookieWinFirefox();
34             case CHROME:
35                 return new CookieWinCrome();
36             case CHROMIUM:
37                 return new CookieWinChromium();
38             case OPERA:
39                 return new CookieWinOpera();
40             default:
41                 final File f = new File(dir);
42                 return new CookieDefault(f);
43         }
44     }
45
46     /**
47      * cookieをmapで返します.
48      * @return cookie.
49      */
50     public Map<String, String> get() {
51         final Map<String, String> map = new HashMap<>();
52         try {
53             final String userSessionStr = getNicoUserSession();
54             if (StringUtils.isNotEmpty(userSessionStr)) {
55                 map.put("user_session", userSessionStr);
56             }
57         } catch (IOException ex) {
58             logger.warn("cookieファイル読み込み失敗", ex);
59         }
60         return map;
61     }
62
63     /**
64      * ニコニコ動画ユーザセッション文字列を取得します.
65      * @return ユーザセッション文字列. 無ければ空文字列.
66      * @throws IOException cookie読み込み中のエラー.
67      */
68     protected abstract String getNicoUserSession() throws IOException;
69
70     /**
71      * クッキーファイルを見つけて user_session を返す.
72      * @param cookieFileOrDirs cookieが保存されたディレクトリの候補, あるいはcookieファイルの候補.
73      * @return ユーザセッション文字列. 無ければ空文字列.
74      */
75     protected final String getUserSession(String charsetName, File... cookieFileOrDirs) throws IOException {
76         for (File file : cookieFileOrDirs) {
77             if (file.isDirectory()) {
78                 File[] files = file.listFiles();
79                 for (File cookieFile : files) {
80                     if (cookieFile.isFile()) {
81                         final String userSession = cutUserSession(cookieFile, charsetName);
82                         if (StringUtils.isNotEmpty(userSession)) {
83                             return userSession;
84                         }
85                     }
86                 }
87             } else if (file.isFile()) {
88                 final String userSession = cutUserSession(file, charsetName);
89                 if (StringUtils.isNotEmpty(userSession)) {
90                     return userSession;
91                 }
92             }
93         }
94
95         return "";
96     }
97
98     /**
99      * 文字列から user_session_ で始まる文字列を切り出して返す。数字とアンダーバー以外の文字で切れる。
100      * @param cookieStr 切り出す対象文字列
101      * @return user_session 文字列。見つからない場合は空文字列。
102      */
103     protected final String getUserSession(final String cookieStr) {
104         final Matcher mather = USER_SESSION_PATTERN.matcher(cookieStr);
105         if (mather.find()) {
106             return mather.group(1);
107         }
108         return "";
109     }
110
111     private String cutUserSession(File cookieFile, String charsetName) throws IOException {
112         final String str = FileUtils.readFileToString(cookieFile, charsetName);
113         return getUserSession(str);
114     }
115 }