Use Server.env.vars to get session cookie name

This commit is contained in:
Bob Farrell 2025-04-16 19:29:44 +01:00
parent 4c568f2606
commit aae9fd182b
3 changed files with 34 additions and 13 deletions

View File

@ -497,12 +497,14 @@ pub fn cookies(self: *Request) !*jetzig.http.Cookies {
/// `jetzig.http.Session`. /// `jetzig.http.Session`.
pub fn session(self: *Request) !*jetzig.http.Session { pub fn session(self: *Request) !*jetzig.http.Session {
if (self._session) |capture| return capture; if (self._session) |capture| return capture;
const cookie_name = self.server.env.vars.get("JETZIG_SESSION_COOKIE") orelse
jetzig.http.Session.default_cookie_name;
const local_session = try self.allocator.create(jetzig.http.Session); const local_session = try self.allocator.create(jetzig.http.Session);
local_session.* = jetzig.http.Session.init( local_session.* = jetzig.http.Session.init(
self.allocator, self.allocator,
try self.cookies(), try self.cookies(),
self.server.env.secret, self.server.env.secret,
.{ .cookie_name = cookie_name },
); );
local_session.parse() catch |err| { local_session.parse() catch |err| {
switch (err) { switch (err) {

View File

@ -15,19 +15,23 @@ state: enum { parsed, pending } = .pending,
const Self = @This(); const Self = @This();
pub const default_cookie_name = "_jetzig-session";
pub const Options = struct {
cookie_name: []const u8 = default_cookie_name,
};
pub fn init( pub fn init(
allocator: std.mem.Allocator, allocator: std.mem.Allocator,
cookies: *jetzig.http.Cookies, cookies: *jetzig.http.Cookies,
encryption_key: []const u8, encryption_key: []const u8,
options: Options,
) Self { ) Self {
const env_cookie_name = std.process.getEnvVarOwned(allocator, "JETZIG_SESSION_COOKIE") catch null;
const cookie_name = env_cookie_name orelse "_jetzig-session";
return .{ return .{
.allocator = allocator, .allocator = allocator,
.data = jetzig.data.Data.init(allocator), .data = jetzig.data.Data.init(allocator),
.cookies = cookies, .cookies = cookies,
.cookie_name = cookie_name, .cookie_name = options.cookie_name,
.encryption_key = encryption_key, .encryption_key = encryption_key,
}; };
} }
@ -184,7 +188,7 @@ test "put and get session key/value" {
try cookies.parse(); try cookies.parse();
const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length; const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length;
var session = Self.init(allocator, &cookies, &secret); var session = Self.init(allocator, &cookies, &secret, .{});
defer session.deinit(); defer session.deinit();
var data = jetzig.data.Data.init(allocator); var data = jetzig.data.Data.init(allocator);
@ -203,7 +207,7 @@ test "remove session key/value" {
try cookies.parse(); try cookies.parse();
const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length; const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length;
var session = Self.init(allocator, &cookies, &secret); var session = Self.init(allocator, &cookies, &secret, .{});
defer session.deinit(); defer session.deinit();
var data = jetzig.data.Data.init(allocator); var data = jetzig.data.Data.init(allocator);
@ -228,7 +232,7 @@ test "get value from parsed/decrypted cookie" {
try cookies.parse(); try cookies.parse();
const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length; const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length;
var session = Self.init(allocator, &cookies, &secret); var session = Self.init(allocator, &cookies, &secret, .{});
defer session.deinit(); defer session.deinit();
try session.parse(); try session.parse();
@ -237,17 +241,32 @@ test "get value from parsed/decrypted cookie" {
} }
test "invalid cookie value - too short" { test "invalid cookie value - too short" {
const allocator = std.testing.allocator;
var cookies = jetzig.http.Cookies.init(allocator, "_jetzig-session=abc");
defer cookies.deinit();
try cookies.parse();
const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length;
var session = Self.init(allocator, &cookies, &secret, .{});
defer session.deinit();
try std.testing.expectError(error.JetzigInvalidSessionCookie, session.parse());
}
test "custom session cookie name" {
const allocator = std.testing.allocator; const allocator = std.testing.allocator;
var cookies = jetzig.http.Cookies.init( var cookies = jetzig.http.Cookies.init(
allocator, allocator,
"_jetzig-session=abc", "custom-cookie-name=fPCFwZHvPDT-XCVcsQUSspDLchS3tRuJDqPpB2v3127VXpRP_bPcPLgpHK6RiVkfcP1bMtU",
); );
defer cookies.deinit(); defer cookies.deinit();
try cookies.parse(); try cookies.parse();
const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length; const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length;
var session = Self.init(allocator, &cookies, &secret); var session = Self.init(allocator, &cookies, &secret, .{ .cookie_name = "custom-cookie-name" });
defer session.deinit(); defer session.deinit();
try std.testing.expectError(error.JetzigInvalidSessionCookie, session.parse()); try session.parse();
var value = (session.get("foo")).?;
try std.testing.expectEqualStrings("bar", try value.toString());
} }

View File

@ -55,7 +55,7 @@ pub fn init(allocator: std.mem.Allocator, routes_module: type) !App {
try cookies.parse(); try cookies.parse();
const session = try alloc.create(jetzig.http.Session); const session = try alloc.create(jetzig.http.Session);
session.* = jetzig.http.Session.init(alloc, cookies, jetzig.testing.secret); session.* = jetzig.http.Session.init(alloc, cookies, jetzig.testing.secret, .{});
app.* = App{ app.* = App{
.arena = arena, .arena = arena,
@ -237,7 +237,7 @@ pub fn initSession(self: *App) !void {
const allocator = self.arena.allocator(); const allocator = self.arena.allocator();
var local_session = try allocator.create(jetzig.http.Session); var local_session = try allocator.create(jetzig.http.Session);
local_session.* = jetzig.http.Session.init(allocator, self.cookies, jetzig.testing.secret); local_session.* = jetzig.http.Session.init(allocator, self.cookies, jetzig.testing.secret, .{});
try local_session.parse(); try local_session.parse();
self.session = local_session; self.session = local_session;