You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.4 KiB
71 lines
2.4 KiB
/** |
|
* Helper utilities for checking repository privacy |
|
*/ |
|
|
|
import { nip19 } from 'nostr-tools'; |
|
import { DEFAULT_NOSTR_RELAYS } from '../config.js'; |
|
import type { NostrEvent } from '../types/nostr.js'; |
|
import { isPrivateRepo as checkVisibility } from './repo-visibility.js'; |
|
|
|
// Lazy initialization to avoid initialization order issues |
|
let maintainerServiceInstance: import('../services/nostr/maintainer-service.js').MaintainerService | null = null; |
|
|
|
const getMaintainerService = async (): Promise<import('../services/nostr/maintainer-service.js').MaintainerService> => { |
|
if (!maintainerServiceInstance) { |
|
const { MaintainerService } = await import('../services/nostr/maintainer-service.js'); |
|
maintainerServiceInstance = new MaintainerService(DEFAULT_NOSTR_RELAYS); |
|
} |
|
return maintainerServiceInstance; |
|
}; |
|
|
|
/** |
|
* Check if a repository is private based on announcement event |
|
* Uses the new visibility system: restricted or private visibility means private repo |
|
* |
|
* This is a shared utility to avoid code duplication across services. |
|
*/ |
|
export function isPrivateRepo(announcement: NostrEvent): boolean { |
|
// Use the new visibility system |
|
return checkVisibility(announcement); |
|
} |
|
|
|
/** |
|
* Check if a user can view a repository |
|
* Returns the repo owner pubkey and whether access is allowed |
|
*/ |
|
export async function checkRepoAccess( |
|
npub: string, |
|
repo: string, |
|
userPubkey: string | null |
|
): Promise<{ allowed: boolean; repoOwnerPubkey: string; error?: string }> { |
|
try { |
|
// Decode npub to get pubkey |
|
let repoOwnerPubkey: string; |
|
try { |
|
const decoded = nip19.decode(npub); |
|
if (decoded.type === 'npub') { |
|
repoOwnerPubkey = decoded.data as string; |
|
} else { |
|
return { allowed: false, repoOwnerPubkey: '', error: 'Invalid npub format' }; |
|
} |
|
} catch { |
|
return { allowed: false, repoOwnerPubkey: '', error: 'Invalid npub format' }; |
|
} |
|
|
|
// Check if user can view |
|
const maintainerService = await getMaintainerService(); |
|
const canView = await maintainerService.canView(userPubkey, repoOwnerPubkey, repo); |
|
|
|
return { |
|
allowed: canView, |
|
repoOwnerPubkey, |
|
...(canView ? {} : { error: 'This repository is private. Only owners and maintainers can view it.' }) |
|
}; |
|
} catch (error) { |
|
return { |
|
allowed: false, |
|
repoOwnerPubkey: '', |
|
error: error instanceof Error ? error.message : 'Failed to check repository access' |
|
}; |
|
} |
|
}
|
|
|