diff --git a/app.ts b/app.ts index ce9b10c..3c8eb43 100644 --- a/app.ts +++ b/app.ts @@ -14,46 +14,46 @@ const CREDENTIALS_FILE = `${homedir()}/.oauth2cli-forgejo`; async function main() { const tokenApi = new TokenApi(URL_BASE, TOKEN_NAME); const credentialManager = new CredentialManager(CREDENTIALS_FILE, TOKEN_NAME); - + try { await new Command() .name("forgejo-oauth2cli") .version("0.1.0") .description("Interactive client credentials generator for Forgejo.") .command("login", "Authenticate with Forgejo interactively") - .action(async() => { + .action(async () => { const username = await prompt("Enter your username: "); if (!username) { console.error("Username is required."); return; } - + const secret = await Secret.prompt("Enter your secret: "); if (!secret) { console.error("Secret is required."); return; } - + // Check for existing tokens const tokens = await tokenApi.listTokens(username, secret); if (!tokens) { return; } - + // Delete existing token if found const existingToken = tokens.find(t => t.name === TOKEN_NAME); if (existingToken) { console.log("Existing token found, replacing it..."); await tokenApi.deleteToken(username, secret, existingToken.id); } - + // Create new token console.log("Creating new token..."); const token = await tokenApi.createToken(username, secret); if (!token) { return; } - + // Store credentials await credentialManager.storeCredentials(username, token.sha1); console.log("Login successful! Credentials stored securely."); @@ -65,25 +65,25 @@ async function main() { console.error("Username is required."); return; } - + const secret = await Secret.prompt("Enter your secret: "); if (!secret) { console.error("Secret is required."); return; } - + // Find and delete token const tokens = await tokenApi.listTokens(username, secret); if (!tokens) { return; } - + const existingToken = tokens.find(t => t.name === TOKEN_NAME); if (existingToken) { await tokenApi.deleteToken(username, secret, existingToken.id); console.log("Token deleted from Forgejo."); } - + // Clear stored credentials await credentialManager.clearCredentials(username); console.log("Logout successful! Credentials removed."); @@ -93,12 +93,12 @@ async function main() { .action(async (opt) => { const credentials = await credentialManager.getCredentials(); if (!credentials) return; - + // Create OAuth2Api with token const oauth2Api = new OAuth2Api(URL_BASE, credentials.token); const apps = await oauth2Api.getOauth2Applications(); if (!apps) return; - + if (apps.length === 0) { console.log("No OAuth2 applications found."); return; @@ -126,32 +126,32 @@ async function main() { console.error("Credentials not found. Please login first."); return; } - + // Create OAuth2Api with token const oauth2Api = new OAuth2Api(URL_BASE, credentials.token); - + const name = await prompt("Enter the name of the application: "); if (!name) { console.error("Name is required."); return; } - + const redirectUris = await prompt("Enter the redirect URIs (comma separated): "); if (!redirectUris) { console.error("Redirect URIs are required."); return; } - + const app = await oauth2Api.createOauth2Application({ name, redirect_uris: redirectUris.split(",").map(uri => uri.trim()), }); - + if (!app) return; - + console.log("OAuth2 application created successfully!"); console.log(prettyOauth2Application(app)); - + // Save secret keys const path = await prompt("Enter the path to save the OAuth2 secret keys: "); if (path) { @@ -180,50 +180,61 @@ async function main() { console.error("Credentials not found. Please login first."); return; } - + // Create OAuth2Api with token const oauth2Api = new OAuth2Api(URL_BASE, credentials.token); - + const id = await prompt("Enter the ID of the application to update: "); if (!id) { console.error("ID is required."); return; } - + const appId = parseInt(id); if (isNaN(appId)) { console.error("ID must be a number."); return; } - + const name = await prompt("Enter the new name of the application: "); if (!name) { console.error("Name is required."); return; } - + const redirectUris = await prompt("Enter the new redirect URIs (comma separated): "); if (!redirectUris) { console.error("Redirect URIs are required."); return; } - + const app = await oauth2Api.updateOauth2Application(appId, { name, redirect_uris: redirectUris.split(",").map(uri => uri.trim()), }); - + if (!app) return; - + console.log("OAuth2 application updated successfully!"); console.log(prettyOauth2Application(app)); - + // Save secret keys const path = await prompt("Enter the path to save the OAuth2 secret keys: "); if (path) { await saveSecretKeys(path, app.client_id, app.client_secret); } }) + .command("fetch-config", "Fetch OpenID configuration") + .action(async () => { + const response = await fetch(`${URL_BASE}/.well-known/openid-configuration`); + if (!response.ok) { + console.error("Failed to fetch OpenID configuration:", response.statusText); + return; + } + + const config = await response.json(); + console.log("OpenID Configuration:", JSON.stringify(config, null, 2)); + }) .parse(Deno.args); } catch (error) { if (error instanceof Error) {