@@ -129,7 +129,9 @@ CPPCMS_API int cppcms_capi_session_set_on_server(cppcms_capi_session *session,in | |||
CPPCMS_API int cppcms_capi_session_get_on_server(cppcms_capi_session *session); | |||
CPPCMS_API char const *cppcms_capi_session_get_session_cookie_name(cppcms_capi_session *session); | |||
CPPCMS_API int cppcms_capi_session_load(cppcms_capi_session *session,char const *session_cookie_value); | |||
CPPCMS_API int cppcms_capi_session_set_session_cookie(cppcms_capi_session *session,char const *session_cookie_value); | |||
CPPCMS_API int cppcms_capi_session_add_cookie_name(cppcms_capi_session *session,char const *name); | |||
CPPCMS_API int cppcms_capi_session_load(cppcms_capi_session *session); | |||
CPPCMS_API int cppcms_capi_session_save(cppcms_capi_session *session); | |||
CPPCMS_API cppcms_capi_cookie *cppcms_capi_session_cookie_first(cppcms_capi_session *session); | |||
@@ -71,10 +71,13 @@ public: | |||
/// | |||
virtual void set_cookie(http::cookie const &updated_cookie) = 0; | |||
/// | |||
/// Get value of the cookie, it is guaranteed that \a name is | |||
/// what session_interface::session_cookie_name() returns | |||
/// Get value of a cookie, it is guaranted that name is what session_interface::session_cookie_name() returns | |||
/// | |||
virtual std::string get_session_cookie(std::string const &name) = 0; | |||
/// | |||
/// Get all cookie keys | |||
/// | |||
virtual std::set<std::string> get_cookie_names() = 0; | |||
}; | |||
/// | |||
@@ -80,12 +80,17 @@ struct cppcms_capi_session { | |||
std::map<std::string,cppcms::http::cookie>::const_iterator cookies_ptr; | |||
std::string value; | |||
std::set<std::string> keys; | |||
virtual void set_cookie(cppcms::http::cookie const &updated_cookie) { | |||
cookies[updated_cookie.name()]=updated_cookie; | |||
} | |||
virtual std::string get_session_cookie(std::string const &) { | |||
return value; | |||
} | |||
virtual std::set<std::string> get_cookie_names() | |||
{ | |||
return keys; | |||
} | |||
} adapter; | |||
@@ -657,17 +662,40 @@ char const *cppcms_capi_session_get_session_cookie_name(cppcms_capi_session *ses | |||
} | |||
CATCH(session,0,0); | |||
} | |||
int cppcms_capi_session_load(cppcms_capi_session *session,char const *session_cookie_value) | |||
int cppcms_capi_session_set_session_cookie(cppcms_capi_session *session,char const *session_cookie_value) | |||
{ | |||
TRY { | |||
if(!session) | |||
return -1; | |||
check_str(session_cookie_value); | |||
session->check(); | |||
session->adapter.value = session_cookie_value; | |||
} | |||
CATCH(session,0,-1); | |||
} | |||
int cppcms_capi_session_add_cookie_name(cppcms_capi_session *session,char const *name) | |||
{ | |||
TRY { | |||
if(!session) | |||
return -1; | |||
check_str(name); | |||
session->check(); | |||
session->adapter.keys.insert(name); | |||
} | |||
CATCH(session,0,-1); | |||
} | |||
int cppcms_capi_session_load(cppcms_capi_session *session) | |||
{ | |||
TRY { | |||
if(!session) | |||
return -1; | |||
session->check(); | |||
if(session->loaded) { | |||
throw std::logic_error("Session is already loaded"); | |||
} | |||
session->adapter.value = session_cookie_value; | |||
session->p->load(); | |||
session->loaded = true; | |||
} | |||
@@ -286,20 +286,36 @@ void session_interface::update_exposed(bool force) | |||
} | |||
} | |||
if(cached_settings().session.cookies.remove_unknown_cookies && context_) { | |||
typedef http::request::cookies_type cookies_type; | |||
cookies_type const &input_cookies = context_->request().cookies(); | |||
if(cached_settings().session.cookies.remove_unknown_cookies) { | |||
std::string prefix = cached_settings().session.cookies.prefix + "_"; | |||
for(cookies_type::const_iterator cp=input_cookies.begin();cp!=input_cookies.end();++cp) { | |||
if(cp->first.compare(0,prefix.size(),prefix)!=0) | |||
continue; | |||
std::string key = cp->first.substr(prefix.size()); | |||
if(removed.find(key)!=removed.end()) | |||
continue; | |||
data_type::iterator ptr; | |||
if((ptr = data_.find(key))==data_.end() || !ptr->second.exposed) { | |||
removed.insert(key); | |||
if(!d->adapter) { | |||
typedef http::request::cookies_type cookies_type; | |||
cookies_type const &input_cookies = context_->request().cookies(); | |||
for(cookies_type::const_iterator cp=input_cookies.begin();cp!=input_cookies.end();++cp) { | |||
if(cp->first.compare(0,prefix.size(),prefix)!=0) | |||
continue; | |||
std::string key = cp->first.substr(prefix.size()); | |||
if(removed.find(key)!=removed.end()) | |||
continue; | |||
data_type::iterator ptr; | |||
if((ptr = data_.find(key))==data_.end() || !ptr->second.exposed) { | |||
removed.insert(key); | |||
} | |||
} | |||
} | |||
else { | |||
std::set<std::string> cookies = d->adapter->get_cookie_names(); | |||
for(std::set<std::string>::const_iterator cp=cookies.begin();cp!=cookies.end();++cp) { | |||
if(cp->compare(0,prefix.size(),prefix)!=0) | |||
continue; | |||
std::string key = cp->substr(prefix.size()); | |||
if(removed.find(key)!=removed.end()) | |||
continue; | |||
data_type::iterator ptr; | |||
if((ptr = data_.find(key))==data_.end() || !ptr->second.exposed) { | |||
removed.insert(key); | |||
} | |||
} | |||
} | |||
} | |||
@@ -31,7 +31,8 @@ int main(int argc,char **argv) | |||
cppcms_capi_session_init(session,session_pool); | |||
CHECK(session); | |||
cppcms_capi_session_load(session,state); | |||
cppcms_capi_session_set_session_cookie(session,state); | |||
cppcms_capi_session_load(session); | |||
CHECK(session); | |||
cppcms_capi_session_set(session,"x","test"); | |||
cppcms_capi_session_set(session,"yyy","111"); | |||
@@ -68,7 +69,9 @@ int main(int argc,char **argv) | |||
cppcms_capi_session_init(session,session_pool); | |||
CHECK(session); | |||
cppcms_capi_session_load(session,state); | |||
cppcms_capi_session_set_session_cookie(session,state); | |||
cppcms_capi_session_add_cookie_name(session,"sc_tt"); | |||
cppcms_capi_session_load(session); | |||
CHECK(session); | |||
printf("Check keys second time\n"); | |||
@@ -93,19 +96,29 @@ int main(int argc,char **argv) | |||
n=0; | |||
for(cookie=cppcms_capi_session_cookie_first(session);cookie;cookie=cppcms_capi_session_cookie_next(session)) { | |||
printf(" %s\n",cppcms_capi_cookie_header(cookie)); | |||
n++; | |||
if(strcmp(cppcms_capi_cookie_name(cookie),cppcms_capi_session_get_session_cookie_name(session))==0) { | |||
free(state); | |||
state = strdup(cppcms_capi_cookie_value(cookie)); | |||
n += 1; | |||
} | |||
else if(strcmp(cppcms_capi_cookie_name(cookie),"sc_x")==0) { | |||
TEST(strcmp(cppcms_capi_cookie_value(cookie),"")==0); | |||
TEST(cppcms_capi_cookie_max_age_defined(cookie)==1); | |||
TEST(cppcms_capi_cookie_max_age(cookie)==0); | |||
n += 10; | |||
} | |||
else if(strcmp(cppcms_capi_cookie_name(cookie),"sc_tt")==0) { | |||
TEST(strcmp(cppcms_capi_cookie_value(cookie),"")==0); | |||
TEST(cppcms_capi_cookie_max_age_defined(cookie)==1); | |||
TEST(cppcms_capi_cookie_max_age(cookie)==0); | |||
n += 100; | |||
} | |||
else { | |||
n+=1000; | |||
} | |||
cppcms_capi_cookie_delete(cookie); | |||
} | |||
TEST(n==2); | |||
TEST(n==111); | |||
cppcms_capi_session_delete(session); | |||
printf("New state=[%s]\n",state); | |||
@@ -115,7 +128,8 @@ int main(int argc,char **argv) | |||
cppcms_capi_session_init(session,session_pool); | |||
CHECK(session); | |||
cppcms_capi_session_load(session,state); | |||
cppcms_capi_session_set_session_cookie(session,state); | |||
cppcms_capi_session_load(session); | |||
CHECK(session); | |||
TEST(cppcms_capi_session_get_exposed(session,"x")==0); | |||
@@ -64,6 +64,7 @@ public: | |||
{ | |||
return value; | |||
} | |||
std::set<std::string> get_cookie_names() { return std::set<std::string>(); } | |||
std::string value; | |||
std::string cookie_name; | |||
}; | |||