Cookie* CookiePath::GetCookieL(Cookie_Item_Handler *params, BOOL create) { Cookie* ck = LocalGetCookie(params->name); if (!create) return ck; if (ck) { #ifdef _ASK_COOKIE ServerName *servername = (ServerName *) params->url->GetAttribute(URL::KServerName, (const void*) 0); COOKIE_DELETE_ON_EXIT_MODE disc_mode = (servername ? servername->GetDeleteCookieOnExit(TRUE) : COOKIE_EXIT_DELETE_DEFAULT); BOOL default_disc_mode = (BOOL) g_pcnet->GetIntegerPref(PrefsCollectionNetwork::AcceptCookiesSessionOnly); if( ((default_disc_mode && disc_mode != COOKIE_NO_DELETE_ON_EXIT) || (!default_disc_mode && disc_mode == COOKIE_DELETE_ON_EXIT))&& !params->flags.discard_at_exit && !ck->DiscardAtExit()) params->flags.discard_at_exit= TRUE; #endif if(!params->flags.accept_updates) params->flags.accept_updates = ck->AcceptUpdates(); if(!params->flags.accepted_as_third_party) params->flags.accepted_as_third_party = ck->GetAcceptedAsThirdParty(); if(!params->flags.have_password) params->flags.have_password = ck->GetHavePassword(); if(!params->flags.have_authentication) params->flags.have_authentication = ck->GetHaveAuthentication(); OP_DELETE(ck); // *** Don't save an expired cookie. if(params->expire && params->expire < (time_t) (g_op_time_info->GetTimeUTC()/1000.0) ) return NULL; } ck = Cookie::CreateL(params); ck->Into(&cookie_list); return ck; }
int CookiePath::GetCookieRequest( time_t this_time, BOOL is_secure, BOOL is_server, unsigned short port, int &version, int &max_version, BOOL third_party_only, BOOL already_have_password, BOOL already_have_authentication, BOOL &have_password, BOOL &have_authentication, BOOL is_full_path, char* buf, int buf_len, BOOL for_http, BOOL allow_dollar_cookies, BOOL& seen_cookie2) { int buf_used = 0; char* buf_p = buf; Cookie* ck = (Cookie*) cookie_list.First(); while (ck) { Cookie* next_ck = ck->Suc(); if (ck->Expires() && ck->Expires() < this_time) { OP_DELETE(ck); } else if ((is_secure || !ck->Secure()) && (for_http || !ck->HTTPOnly()) && (is_full_path || !ck->FullPathOnly()) && (is_server || !ck->SendOnlyToServer()) && (ck->Version() == 0 || ck->CheckPort(port)) && (!third_party_only || ck->GetAcceptedAsThirdParty()) && (allow_dollar_cookies || *ck->Name().CStr() != '$') ) { int name_len = ck->Name().Length(); int value_len = ck->Value().Length(); int ver = ck->Version(); if(version > ver) version = ver; if(ver > max_version) max_version = ver; if (ck->GetCookieType() == COOKIE2_COOKIE) seen_cookie2 = TRUE; int dom_len = (ver ? ck->Received_Domain().Length() : 0) ; int path_len = (ver && ck->Received_Path().HasContent() ? ck->Received_Path().Length()+1: 0) ; int port_len = (ver ? (ck->Port().HasContent() ? ck->Port().Length() : (ck->PortReceived() ? 1 : 0)) : 0) ; if ((name_len + value_len + 3 + (dom_len ? dom_len + 10 : 0) + (path_len ? path_len + 8 : 0) + (port_len ? port_len + 8 : 0)) < buf_len - buf_used) { if (buf_used) BufferAppend(buf_p, "; ", 2); BufferAppend(buf_p, ck->Name().CStr()); if (value_len > 0 || ck->Assigned()) { *buf_p++ = '='; BufferAppend(buf_p, ck->Value().CStr()); } if(ver > 0) { if(path_len) { BufferAppend(buf_p, "; $Path=\""); BufferAppend(buf_p, ck->Received_Path().CStr()); *buf_p++ = '"'; *buf_p = '\0'; } if(dom_len) { BufferAppend(buf_p, "; $Domain="); BufferAppend(buf_p, ck->Received_Domain().CStr()); } if(ck->PortReceived()) { if(ck->Port().CStr()) { BufferAppend(buf_p, "; $Port=\""); BufferAppend(buf_p, ck->Port().CStr()); *buf_p++ = '"'; *buf_p = '\0'; } else BufferAppend(buf_p, "; $Port"); } } if(g_pcnet->GetIntegerPref(PrefsCollectionNetwork::TagUrlsUsingPasswordRelatedCookies)) { if(ck->GetHavePassword()) have_password = TRUE; if(ck->GetHaveAuthentication()) have_authentication = TRUE; if(already_have_password) ck->SetHavePassword(TRUE); if(already_have_authentication) ck->SetHaveAuthentication(TRUE); } buf_used = buf_p - buf; ck->SetLastUsed(this_time); } } ck = next_ck; } return buf_used; }