╭ changed ─────────╮ │src/event/User.zig│ ╰──────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │16 const Self = @This(); │ │17 │ │18 pub const name_max_len = 32; │ │19 + │ │20 +pub fn validateName(name: []const u8) !void { │ │21 + if (name.len == 0) return error.NameEmpty; │ │22 + if (name.len > name_max_len) return error.NameTooLong; │ │23 + if (name[0] == '-' or name[name.len - 1] == '-') return error.InvalidName;│ │24 │ │25 + var previous_was_hyphen = false; │ │26 + for (name) |c| { │ │27 + if (std.ascii.isAlphanumeric(c)) { │ │28 + previous_was_hyphen = false; │ │29 + } else if (c == '-' and !previous_was_hyphen) { │ │30 + previous_was_hyphen = true; │ │31 + } else { │ │32 + return error.InvalidName; │ │33 + } │ │34 + } │ │35 +} │ │36 + │ │37 // `created_ts` comes from the commit timestamp, not the event │ │38 // payload, so it must not appear in the JSON we output │ │39 pub fn jsonStringify(self: @This(), jw: anytype) !void { │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────╮ │74 const name_to_user_id = try DB.HashMap(.read_write).init(name_to_user_id_cursor);│ │75 │ │76 if (event_maybe) |event| { │ │60 - if (event.name.len > name_max_len) return error.NameTooLong; │ │77 + try validateName(event.name); │ │78 │ │79 var event_to_write = event; │ │80 │ ╰─────────────────────────────────────────────────────────────────────────────────────────╯