╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────╮ │← previous│ ╰──────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1975 return if (user.removed) null else user; │ │1976 } │ │1977 │ │1987 -// the role the user holds in the repo `identity` names, or null when no repo │ │1988 -// has that identity. a null user is logged out. │ │1989 -pub fn repoRole( │ │1990 - moment: evt.AdminDB.HashMap(.read_only), │ │1991 - arena: *std.heap.ArenaAllocator, │ │1992 - user_id: ?[evt.event_id_size]u8, │ │1993 - identity: []const u8, │ │1994 -) !?evt.Repo.Role { │ │1995 - const owner_repo = evt.parseOwnerRepoPath(identity) orelse return null; │ │1996 - const repo = (try evt.Repo.readByOwnerAndName(evt.AdminDB, evt.admin_repo_opts.hash, moment, arena, owner_repo.owner, owner_repo.name)) orelse return null;│ │1997 - return evt.Repo.roleOf(repo.repo, user_id); │ │1998 -} │ │1999 - │ │1978 // whether the user may write to the repo `identity` names with at least │ │1979 // `min_role` │ │1980 pub fn authorizeUser( │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────╮ │1981 + io: std.Io, │ │1982 moment: evt.AdminDB.HashMap(.read_only),│ │1983 arena: *std.heap.ArenaAllocator, │ │1984 + repos_dir: []const u8, │ │1985 user_id: [evt.event_id_size]u8, │ │1986 identity: []const u8, │ │1987 min_role: evt.Repo.Role, │ ╰──────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1988 ) !Authorization { │ │1989 const user = (try activeUser(moment, arena, user_id)) orelse return .login_required; │ │1990 │ │2011 - const role = (try repoRole(moment, arena, user_id, identity)) orelse return .repo_not_found; │ │1991 + const owner_repo = evt.parseOwnerRepoPath(identity) orelse return .repo_not_found; │ │1992 + const repo = (try evt.readRepoByOwnerAndName(io, arena.child_allocator, arena, moment, repos_dir, owner_repo.owner, owner_repo.name)) orelse return .repo_not_found;│ │1993 + const role = evt.Repo.roleOf(repo.repo, user_id); │ │1994 // a repo the user can't read doesn't exist to them │ │1995 if (role == .none) return .repo_not_found; │ │1996 if (!role.atLeast(min_role)) return .forbidden; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────╮ │1998 .author = .{ .name = user.event.name, .email = user.event.email },│ │1999 .user_id = user_id, │ │2000 .role = role, │ │2001 + .repo_user_id = repo.repo.event.user_id[0..evt.event_id_size].*, │ │2002 } }; │ │2003 } │ │2004 │ ╰────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2244 const user_id = self.userId() orelse return null; │ │2245 // the session's moment predates this input, so read the roles afresh │ │2246 const admin_repo = self.admin_repo orelse return null; │ │2247 + const io = self.io orelse return null; │ │2248 + const repos_dir = self.repos_dir orelse return null; │ │2249 const moment = try evt.currentMoment(evt.admin_repo_opts, admin_repo); │ │2265 - return switch (try authorizeUser(moment, self.page_arena, user_id, identity, min_role)) { │ │2250 + return switch (try authorizeUser(io, moment, self.page_arena, repos_dir, user_id, identity, min_role)) {│ │2251 .actor => |actor| actor, │ │2252 .login_required, .repo_not_found, .forbidden => null, │ │2253 }; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯