1use crate::{Permission, TokenScope, scope_contains};
3
4#[derive(Debug, Clone)]
5pub struct AuthContext {
6 pub user: String,
7 pub permissions: Vec<Permission>,
8 pub token_id: String,
9 pub scope: TokenScope,
10}
11
12impl AuthContext {
13 pub fn has_permission(&self, perm: Permission) -> bool {
14 self.permissions.contains(&perm)
15 }
16
17 pub fn can_read(&self) -> bool {
18 self.has_permission(Permission::Read)
19 }
20
21 pub fn can_write(&self) -> bool {
22 self.has_permission(Permission::Write)
23 }
24
25 pub fn can_push(&self) -> bool {
26 self.has_permission(Permission::Push)
27 }
28
29 pub fn is_admin(&self) -> bool {
30 self.has_permission(Permission::Admin)
31 }
32
33 pub fn can_access_repo(&self, repo: &str) -> bool {
34 match &self.scope {
35 TokenScope::Global => true,
36 TokenScope::Repositories(repos) => repos.iter().any(|candidate| candidate == repo),
37 TokenScope::NamespaceTree(namespace) => scope_contains(namespace, repo),
38 }
39 }
40
41 pub fn can_access_namespace(&self, namespace: &str) -> bool {
52 match &self.scope {
53 TokenScope::Global => true,
54 TokenScope::Repositories(_) => false,
55 TokenScope::NamespaceTree(scope) => scope_contains(scope, namespace),
56 }
57 }
58}