Skip to content

Commit 04aa46b

Browse files
committed
Added config options to set the HttpOnly and SameSite directives on the session cookie.
1 parent 571fc96 commit 04aa46b

File tree

4 files changed

+48
-1
lines changed

4 files changed

+48
-1
lines changed

cppcms/capi/session.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ CPPCMS_API long long cppcms_capi_cookie_expires(cppcms_capi_cookie const *cookie
155155

156156
CPPCMS_API int cppcms_capi_cookie_is_secure(cppcms_capi_cookie const *cookie);
157157

158+
CPPCMS_API int cppcms_capi_cookie_is_httponly(cppcms_capi_cookie const *cookie);
159+
160+
CPPCMS_API int cppcms_capi_cookie_samesite_none_defined(cppcms_capi_cookie const *cookie);
161+
CPPCMS_API int cppcms_capi_cookie_samesite_lax_defined(cppcms_capi_cookie const *cookie);
162+
CPPCMS_API int cppcms_capi_cookie_samesite_strict_defined(cppcms_capi_cookie const *cookie);
163+
158164
///
159165
/// @}
160166
///

private/cached_settings.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ namespace impl {
142142
bool use_age;
143143
bool use_exp;
144144
bool secure;
145+
bool httponly;
146+
bool use_samesite_none;
147+
bool use_samesite_lax;
148+
bool use_samesite_strict;
145149
bool remove_unknown_cookies;
146150
} cookies;
147151
cached_session(json::value const &v)
@@ -173,6 +177,22 @@ namespace impl {
173177
cookies.use_age = cookies.use_exp = true;
174178
}
175179
cookies.secure = v.get("session.cookies.secure",false);
180+
cookies.httponly = v.get("session.cookies.httponly", false);
181+
182+
std::string samesite = v.get("session.cookies.samesite", "");
183+
cookies.use_samesite_none = false;
184+
cookies.use_samesite_lax = false;
185+
cookies.use_samesite_strict = false;
186+
if (samesite == "none") {
187+
cookies.use_samesite_none = true;
188+
} else if (samesite == "lax") {
189+
cookies.use_samesite_lax = true;
190+
} else if (samesite == "strict") {
191+
cookies.use_samesite_strict = true;
192+
} else if (!samesite.empty()) {
193+
BOOSTER_WARNING("cppcms") << "Invalid session.cookies.samesite"
194+
"if set should be one of 'none', 'lax', or 'strict'; defaults to unset";
195+
}
176196
}
177197
} session;
178198
struct cached_misc {

src/capi/session.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ struct cppcms_capi_cookie {
108108
std::string path;
109109
std::string domain;
110110
bool secure;
111+
bool httponly;
112+
bool has_samesite_none;
113+
bool has_samesite_lax;
114+
bool has_samesite_strict;
111115
bool has_expires;
112116
bool has_max_age;
113117
time_t expires;
@@ -121,6 +125,10 @@ struct cppcms_capi_cookie {
121125
path(c.path()),
122126
domain(c.domain()),
123127
secure(c.secure()),
128+
httponly(c.httponly()),
129+
has_samesite_none(c.samesite_none()),
130+
has_samesite_lax(c.samesite_lax()),
131+
has_samesite_strict(c.samesite_strict()),
124132
has_expires(c.expires_defined()),
125133
has_max_age(c.max_age_defined()),
126134
expires(c.expires()),
@@ -764,4 +772,10 @@ long long cppcms_capi_cookie_expires(cppcms_capi_cookie const *cookie) { return
764772

765773
int cppcms_capi_cookie_is_secure(cppcms_capi_cookie const *cookie) { return cookie ? cookie->secure: -1; }
766774

775+
int cppcms_capi_cookie_is_httponly(cppcms_capi_cookie const *cookie) { return cookie ? cookie->httponly: -1; }
776+
777+
int cppcms_capi_cookie_samesite_none_defined(cppcms_capi_cookie const *cookie) { return cookie ? cookie->has_samesite_none: -1; }
778+
int cppcms_capi_cookie_samesite_lax_defined(cppcms_capi_cookie const *cookie) { return cookie ? cookie->has_samesite_lax: -1; }
779+
int cppcms_capi_cookie_samesite_strict_defined(cppcms_capi_cookie const *cookie) { return cookie ? cookie->has_samesite_strict: -1; }
780+
767781
} // extern "C"

src/session_interface.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,10 @@ void session_interface::set_session_cookie(int64_t age,std::string const &data,s
481481
bool use_exp = cached_settings().session.cookies.use_exp;
482482

483483
bool secure = cached_settings().session.cookies.secure;
484+
bool httponly = cached_settings().session.cookies.httponly;
485+
bool use_samesite_none = cached_settings().session.cookies.use_samesite_none;
486+
bool use_samesite_lax = cached_settings().session.cookies.use_samesite_lax;
487+
bool use_samesite_strict = cached_settings().session.cookies.use_samesite_strict;
484488

485489
http::cookie the_cookie(cookie_name,util::urlencode(data),path,domain);
486490

@@ -501,8 +505,11 @@ void session_interface::set_session_cookie(int64_t age,std::string const &data,s
501505
}
502506
}
503507

504-
505508
the_cookie.secure(secure);
509+
the_cookie.httponly(httponly);
510+
the_cookie.samesite_none(use_samesite_none);
511+
the_cookie.samesite_lax(use_samesite_lax);
512+
the_cookie.samesite_strict(use_samesite_strict);
506513

507514
if(d->adapter)
508515
d->adapter->set_cookie(the_cookie);

0 commit comments

Comments
 (0)