Skip to content

cookie_domain config option for setting cookie on a wider domain #51657

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

SBizienFilippiPEReN
Copy link

@SBizienFilippiPEReN SBizienFilippiPEReN commented Mar 24, 2025

Summary

Adds a cookie_domain option to define to which domain(s) the cookies sent by Nextcloud are valid. By default, it is set to '' which is the safe option (i.e. the browser is instructed to send the cookie only for request to the exact same domain that issued it).

But when your instance is accessible over 2 domains, for example 'mycloud.mydomain.example' and 'sub.mycloud.mydomain.example', setting cookie_domain to 'mycloud.mydomain.example' will make the cookie valid for mycloud.mydomain.example and any subdomain (but not for mydomain.example).

Documentation : MDN / Cookies / Define where cookies are sent.

TODO

I've updated config.sample.php, but it's not clear where should this functionality should be documented.

Checklist

@SBizienFilippiPEReN SBizienFilippiPEReN requested a review from a team as a code owner March 24, 2025 09:47
@SBizienFilippiPEReN SBizienFilippiPEReN requested review from icewind1991, nfebe and come-nc and removed request for a team March 24, 2025 09:47
Copy link
Member

@icewind1991 icewind1991 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good otherwise

lib/base.php Outdated
@@ -398,6 +398,9 @@ public static function initSession(): void {
$cookie_path = OC::$WEBROOT ? : '/';
ini_set('session.cookie_path', $cookie_path);

// set the cookie domain to the Nextcloud domain
ini_set('session.cookie_domain', self::$config->getValue('cookie_domain', ''));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might be worth only doing this if the value is set to anything but '' to prevent overwriting any value set by the admin in the php configuration

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. (I amended and force-pushed the new commit : do you prefer individual fix commits for review before a final squash for merge ?)

@SBizienFilippiPEReN
Copy link
Author

I also wondered if / how this option would be enforced for nextcloud apps. I don't know the codebase, so I can't tell if they will automatically pick this option for apps-defined cookies.

@icewind1991
Copy link
Member

Apps should generally not be doing their own cookie logic

Copy link
Contributor

@come-nc come-nc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use typed version of the getter when possble (not possible in base.php as it’s not the same config class in use)

@@ -59,7 +59,7 @@ public function __construct(
[
'expires' => 0,
'path' => $webRoot,
'domain' => '',
'domain' => $this->config->getSystemValue('cookie_domain', ''),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'domain' => $this->config->getSystemValue('cookie_domain', ''),
'domain' => $this->config->getSystemValueString('cookie_domain'),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in last commit.

@@ -968,14 +968,15 @@ public function setMagicInCookie($username, $token) {
if ($webRoot === '') {
$webRoot = '/';
}
$domain = $this->config->getSystemValue('cookie_domain', '');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$domain = $this->config->getSystemValue('cookie_domain', '');
$domain = $this->config->getSystemValueString('cookie_domain');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

@@ -1012,18 +1013,19 @@ public function setMagicInCookie($username, $token) {
public function unsetMagicInCookie() {
//TODO: DI for cookies and IRequest
$secureCookie = OC::$server->getRequest()->getServerProtocol() === 'https';
$domain = $this->config->getSystemValue('cookie_domain', '');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$domain = $this->config->getSystemValue('cookie_domain', '');
$domain = $this->config->getSystemValueString('cookie_domain');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

github is misbehaving or you forgot to push, but I do not see the update?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed : I forgot to push the changes. Now, it's fixed (at least, I see the fix in github, too).

@SBizienFilippiPEReN SBizienFilippiPEReN force-pushed the cookie-domain branch 2 times, most recently from 6c904c5 to f5a89f0 Compare April 1, 2025 06:32
@@ -59,7 +59,7 @@ public function __construct(
[
'expires' => 0,
'path' => $webRoot,
'domain' => '',
'domain' => $this->config->getSystemValueString('cookie_domain'),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As you can see in psalm output, there is no config property in this class.

So you need to either inject it in the constructor, or directly pull it here:

Suggested change
'domain' => $this->config->getSystemValueString('cookie_domain'),
'domain' => \OCP\Server::get(\OCP\IConfig::class)->getSystemValueString('cookie_domain'),

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK! Included.

Signed-off-by: Samuel Bizien Filippi <[email protected]>
Copy link
Contributor

github-actions bot commented Apr 8, 2025

Hello there,
Thank you so much for taking the time and effort to create a pull request to our Nextcloud project.

We hope that the review process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR review process.

Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6

Thank you for contributing to Nextcloud and we hope to hear from you soon!

(If you believe you should not receive this message, you can add yourself to the blocklist.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants