Browse Source

Updated session interface to reflect the exposed cookies issue

master
Artyom Beilis 8 years ago
parent
commit
a2256bcab0
6 changed files with 87 additions and 23 deletions
  1. +3
    -1
      cppcms/capi/session.h
  2. +5
    -2
      cppcms/session_interface.h
  3. +30
    -2
      src/capi/session.cpp
  4. +29
    -13
      src/session_interface.cpp
  5. +19
    -5
      tests/external_session_test.c
  6. +1
    -0
      tests/session_interface_test.cpp

+ 3
- 1
cppcms/capi/session.h View File

@@ -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);


+ 5
- 2
cppcms/session_interface.h View File

@@ -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;
};

///


+ 30
- 2
src/capi/session.cpp View File

@@ -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;
}


+ 29
- 13
src/session_interface.cpp View File

@@ -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);
}
}
}
}


+ 19
- 5
tests/external_session_test.c View File

@@ -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);


+ 1
- 0
tests/session_interface_test.cpp View File

@@ -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;
};


Loading…
Cancel
Save