2 * manage authentification info
4 * License : The MIT License
5 * Copyright(c) 2012 olyutorskii
8 package jp.sfjp.jindolf.net;
10 import java.io.UnsupportedEncodingException;
11 import java.net.CookieHandler;
12 import java.net.CookieManager;
13 import java.net.CookieStore;
14 import java.net.HttpCookie;
16 import java.net.URISyntaxException;
18 import java.net.URLEncoder;
19 import java.util.List;
22 * Cookieを用いた人狼BBSサーバとの認証管理を行う。
24 * <p>2012-10現在、サポートするのはG国のみ。
26 * <p>2012-10より、Cookie "uniqID" の送出も必要になった模様。
28 public class AuthManager{
30 /** ログアウト用のPOSTデータ。 */
31 public static final String POST_LOGOUT;
33 private static final String COOKIE_LOGIN = "login";
34 private static final String ENC_POST = "UTF-8";
35 private static final String PARAM_REDIR;
37 private static final CookieManager COOKIE_MANAGER;
40 PARAM_REDIR = "cgi_param=" + encodeForm4Post("&#bottom");
41 POST_LOGOUT = "cmd=logout" + '&' + PARAM_REDIR;
43 COOKIE_MANAGER = new CookieManager();
44 CookieHandler.setDefault(COOKIE_MANAGER);
48 private final URI baseURI;
53 * @param bbsUri 人狼BBSサーバURI
54 * @throws NullPointerException 引数がnull
56 public AuthManager(URI bbsUri) throws NullPointerException{
57 if(bbsUri == null) throw new NullPointerException();
58 this.baseURI = bbsUri;
64 * @param bbsUrl 人狼BBSサーバURL
65 * @throws NullPointerException 引数がnull
66 * @throws IllegalArgumentException 不正な書式
68 public AuthManager(URL bbsUrl)
69 throws NullPointerException, IllegalArgumentException{
70 this(urlToUri(bbsUrl));
77 * 書式に関する例外は非チェック例外へ変換される。
80 * @throws NullPointerException 引数がnull
81 * @throws IllegalArgumentException 不正な書式
83 private static URI urlToUri(URL url)
84 throws NullPointerException, IllegalArgumentException{
85 if(url == null) throw new NullPointerException();
90 }catch(URISyntaxException e){
91 throw new IllegalArgumentException(e);
99 * 「application/x-www-form-urlencoded」符号化を行う。
101 * <p>この符号化はHTTPのPOSTメソッドで必要になる。
102 * この処理は、一般的なPC用Webブラウザにおける、
103 * HTML文書のFORMタグに伴うsubmit処理を模倣する。
105 * <p>生成文字列はUS-ASCIIの範疇に収まる。はず。
107 * @param formData 元の文字列
109 * @see java.net.URLEncoder
111 * <a href="http://tools.ietf.org/html/rfc1866#section-8.2.1">
115 public static String encodeForm4Post(String formData){
116 if(formData == null){
122 result = URLEncoder.encode(formData, ENC_POST);
123 }catch(UnsupportedEncodingException e){
132 * 配列版{@link #encodeForm4Post(java.lang.String)}。
133 * @param formData 元の文字列
135 * @see #encodeForm4Post(java.lang.String)
137 public static String encodeForm4Post(char[] formData){
138 return encodeForm4Post(new String(formData));
143 * @param userID 人狼BBSアカウント名
144 * @param password パスワード
147 public static String buildLoginPostData(String userID, char[] password){
148 String id = encodeForm4Post(userID);
149 if(id == null || id.isEmpty()){
153 String pw = encodeForm4Post(password);
154 if(pw == null || pw.isEmpty()){
158 StringBuilder postData = new StringBuilder();
159 postData.append("cmd=login");
160 postData.append('&').append(PARAM_REDIR);
161 postData.append('&').append("user_id=").append(id);
162 postData.append('&').append("password=").append(pw);
164 String result = postData.toString();
170 * 人狼BBSサーバのベースURIを返す。
173 public URI getBaseURI(){
178 * 人狼BBSサーバ管轄下の全Cookieを列挙する。
179 * 他サーバ由来のCookie群との区別はCookieドメイン名で判断される。
180 * @param cookieStore Cookie記憶域
181 * @return 人狼BBSサーバ管轄下のCookieのリスト
183 public List<HttpCookie> getCookieList(CookieStore cookieStore){
184 List<HttpCookie> cookieList = cookieStore.get(this.baseURI);
191 * <p>G国での認証Cookie名は"login"。
193 * <p>※ 2012-10より"uniqID"も増えた模様だが判定には使わない。
195 * @param cookieStore Cookie記憶域
196 * @return 認証Cookie。認証された状態に無いときはnull。
198 public HttpCookie getAuthCookie(CookieStore cookieStore){
199 List<HttpCookie> cookieList = getCookieList(cookieStore);
200 for(HttpCookie cookie : cookieList){
201 String cookieName = cookie.getName();
202 if(COOKIE_LOGIN.equals(cookieName)) return cookie;
210 * @return ログイン中ならtrue
212 public boolean hasLoggedIn(){
213 assert COOKIE_MANAGER == CookieHandler.getDefault();
214 CookieStore cookieStore = COOKIE_MANAGER.getCookieStore();
216 HttpCookie authCookie = getAuthCookie(cookieStore);
217 if(authCookie == null){
218 clearAuthentication();
228 public void clearAuthentication(){
229 assert COOKIE_MANAGER == CookieHandler.getDefault();
230 CookieStore cookieStore = COOKIE_MANAGER.getCookieStore();
232 HttpCookie authCookie = getAuthCookie(cookieStore);
233 if(authCookie != null){
234 cookieStore.remove(this.baseURI, authCookie);