ページ

2009年9月10日木曜日

NSHTTPCookieStorage相当のクラスを自前で実装する (10)クッキー受取ポリシーチェックの実装

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

永続化の前に NSHTTPCookieAcceptPolicy への対応を行っておく。

ヘッダファイル NSHTTPCookieStorage.h によれば3種類の値が存在する。

NSHTTPCookieStorage.h

/*!
@enum NSHTTPCookieAcceptPolicy
@abstract Values for the different cookie accept policies
@constant NSHTTPCookieAcceptPolicyAlways Accept all cookies
@constant NSHTTPCookieAcceptPolicyNever Reject all cookies
@constant NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain Accept cookies
only from the main document domain
*/
enum {
NSHTTPCookieAcceptPolicyAlways,
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
};
typedef NSUInteger NSHTTPCookieAcceptPolicy;


Safari(4.0)のセキュリティ設定を見ると3選択があるのでこれらが対応しているのだろう。



ポリシー適用には URLが必要になるので setCookies:forURL:mainDocumentURL: でチェックを行うことにする。前回のコードにポリシー適用の条件を加えた。

XCHTTPCookieStorage.m
- (void)setCookies:(NSArray *)cookies forURL:(NSURL *)URL mainDocumentURL:(NSURL *)mainDocumentURL
{
if (_cookie_accept_policy == NSHTTPCookieAcceptPolicyNever) {
return;
}

NSString* url_host = [mainDocumentURL host];

for (NSHTTPCookie *cookie in cookies) {
if (_cookie_accept_policy ==
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain &&
![url_host hasSuffix:[cookie domain]]) {
continue;
}
[self setCookie:cookie];
}
}


NSHTTPCookieAcceptPolicyNever は無条件に拒否、NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain の場合はドメインチェックを行うようにした。
また setCookie: にも NSHTTPCookieAcceptPolicyNever の場合の拒否ロジックを加えておいた。


デフォルト値は Safariに合わせて NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain にしておいた。