╭ changed ─────────╮ │src/event/Repo.zig│ ╰──────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────╮ │13 │ │14 pub const name_max_len = 32; │ │15 │ │16 +pub fn validateName(name: []const u8) !void { │ │17 + if (name.len == 0) return error.NameEmpty; │ │18 + if (name.len > name_max_len) return error.NameTooLong; │ │19 + if (std.mem.eql(u8, name, ".") or std.mem.eql(u8, name, "..")) return error.InvalidName;│ │20 + │ │21 + for (name) |c| { │ │22 + if (!std.ascii.isAlphanumeric(c) and c != '-' and c != '_' and c != '.') │ │23 + return error.InvalidName; │ │24 + } │ │25 +} │ │26 + │ │27 // `created_ts` comes from the commit timestamp, not the event │ │28 // payload, so it must not appear in the JSON we output │ │29 pub fn jsonStringify(self: @This(), jw: anytype) !void { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────╮ │54 const name_to_repo_id = try DB.HashMap(.read_write).init(name_to_repo_id_cursor);│ │55 │ │56 if (event_maybe) |event| { │ │46 - if (event.name.len > name_max_len) return error.NameTooLong; │ │57 + try validateName(event.name); │ │58 │ │59 var event_to_write = event; │ │60 │ ╰─────────────────────────────────────────────────────────────────────────────────────────╯