Skip to content

Commit efa66d1

Browse files
korneel-emwebRockinRoel
authored andcommitted
WT-8531: remember-me not deleted when using websockets
HttpOnly cookies cannot be changed when using websockets, so always use an HTTP request for updating cookies.
1 parent a74984e commit efa66d1

File tree

5 files changed

+20
-23
lines changed

5 files changed

+20
-23
lines changed

src/web/WebRenderer.C

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ WebRenderer::WebRenderer(WebSession& session)
119119
currentStatelessSlotIsActuallyStateless_(true),
120120
formObjectsChanged_(true),
121121
updateLayout_(false),
122-
multiSessionCookieUpdateNeeded_(false),
122+
cookieUpdateNeeded_(false),
123123
learning_(false)
124124
{ }
125125

@@ -168,7 +168,7 @@ bool WebRenderer::isDirty() const
168168
|| !collectedJS2_.empty()
169169
|| !invisibleJS_.empty()
170170
|| !wsRequestsToHandle_.empty()
171-
|| multiSessionCookieUpdateNeeded_;
171+
|| cookieUpdateNeeded_;
172172
}
173173

174174
const WebRenderer::FormObjectsMap& WebRenderer::formObjects() const
@@ -508,6 +508,7 @@ void WebRenderer::setCookie(const std::string name, const std::string value,
508508
bool secure)
509509
{
510510
cookiesToSet_[name] = CookieValue(value, path, domain, expires, secure);
511+
cookieUpdateNeeded_ = true;
511512
}
512513

513514
void WebRenderer::setCaching(WebResponse& response, bool allowCache)
@@ -561,16 +562,15 @@ void WebRenderer::setHeaders(WebResponse& response, const std::string mimeType)
561562
else
562563
header << " Path=" << cookie.path << ';';
563564

564-
// a httponly cookie cannot be set using JavaScript
565-
if (!response.isWebSocketMessage())
566-
header << " httponly;";
565+
header << " httponly;";
567566

568567
if (cookie.secure)
569568
header << " secure;";
570569

571570
response.addHeader("Set-Cookie", header.str());
572571
}
573572
cookiesToSet_.clear();
573+
cookieUpdateNeeded_ = false;
574574

575575
#ifndef WT_TARGET_JAVA
576576
const WServer *s = session_.controller()->server();
@@ -607,8 +607,10 @@ std::string WebRenderer::sessionUrl() const
607607

608608
void WebRenderer::serveJavaScriptUpdate(WebResponse& response)
609609
{
610-
setCaching(response, false);
611-
setHeaders(response, "text/javascript; charset=UTF-8");
610+
if (!response.isWebSocketMessage()) {
611+
setCaching(response, false);
612+
setHeaders(response, "text/javascript; charset=UTF-8");
613+
}
612614

613615
if (session_.sessionIdChanged_) {
614616
collectedJS1_ << session_.app()->javaScriptClass()
@@ -632,7 +634,7 @@ void WebRenderer::serveJavaScriptUpdate(WebResponse& response)
632634
out << collectedJS1_.str() << collectedJS2_.str();
633635

634636
if (response.isWebSocketMessage()) {
635-
renderMultiSessionCookieUpdate(out);
637+
renderCookieUpdate(out);
636638
renderWsRequestsDone(out);
637639

638640
LOG_DEBUG("jsSynced(false) after rendering websocket message");
@@ -669,12 +671,12 @@ void WebRenderer::updateMultiSessionCookie(const WebRequest &request)
669671
session_.env().urlScheme() == "https");
670672
}
671673

672-
void WebRenderer::renderMultiSessionCookieUpdate(WStringStream &out)
674+
void WebRenderer::renderCookieUpdate(WStringStream &out)
673675
{
674-
if (multiSessionCookieUpdateNeeded_) {
676+
if (cookieUpdateNeeded_) {
675677
out << session_.app()->javaScriptClass()
676-
<< "._p_.refreshCookie();";
677-
multiSessionCookieUpdateNeeded_ = false;
678+
<< "._p_.refreshCookie();";
679+
cookieUpdateNeeded_ = false;
678680
}
679681
}
680682

src/web/WebRenderer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class WT_API WebRenderer : public Wt::SlotLearnerInterface
127127
bool updateLayout_;
128128

129129
std::vector<int> wsRequestsToHandle_;
130-
bool multiSessionCookieUpdateNeeded_;
130+
bool cookieUpdateNeeded_;
131131

132132
void setHeaders(WebResponse& request, const std::string mimeType);
133133
void setCaching(WebResponse& response, bool allowCache);
@@ -182,7 +182,7 @@ class WT_API WebRenderer : public Wt::SlotLearnerInterface
182182
void renderWsRequestsDone(WStringStream &out);
183183

184184
void updateMultiSessionCookie(const WebRequest &request);
185-
void renderMultiSessionCookieUpdate(WStringStream &out);
185+
void renderCookieUpdate(WStringStream &out);
186186

187187
public:
188188
virtual std::string learn(WStatelessSlot* slot) final override;

src/web/WebSession.C

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,11 +1554,7 @@ void WebSession::handleRequest(Handler& handler)
15541554
= handler.request()->getParameter("signal");
15551555
bool isKeepAlive = requestE && signalE && *signalE == "keepAlive";
15561556
if (isKeepAlive || !env_->ajax()) {
1557-
if (request.isWebSocketMessage()) {
1558-
renderer().multiSessionCookieUpdateNeeded_ = true;
1559-
} else {
1560-
renderer().updateMultiSessionCookie(request);
1561-
}
1557+
renderer().updateMultiSessionCookie(request);
15621558
}
15631559
}
15641560

src/web/WebSocketMessage.C

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ void WebSocketMessage::setContentLength(::int64_t length)
8484
void WebSocketMessage::addHeader(const std::string& name,
8585
const std::string& value)
8686
{
87-
if (name == "Set-Cookie")
88-
out() << "document.cookie=" << WWebWidget::jsStringLiteral(value) << ";";
87+
error("addHeader(): not supported");
8988
}
9089

9190
const char *WebSocketMessage::envValue(const char *name) const

src/web/skeleton/Wt.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4060,7 +4060,7 @@ function bindGlobal(event, id, f) {
40604060
}, 0);
40614061
}
40624062

4063-
function refreshMultiSessionCookie() {
4063+
function refreshCookie() {
40644064
comm.sendUpdate('request=jsupdate&signal=keepAlive&ackId=' + ackUpdateId, false, ackUpdateId, -1);
40654065
}
40664066

@@ -4125,7 +4125,7 @@ this._p_ = {
41254125
setConnectionMonitor : setConnectionMonitor,
41264126
updateGlobal: updateGlobal,
41274127
bindGlobal: bindGlobal,
4128-
refreshCookie: refreshMultiSessionCookie,
4128+
refreshCookie: refreshCookie,
41294129

41304130
propagateSize : propagateSize,
41314131

0 commit comments

Comments
 (0)