mirror of
https://github.com/RayLabsHQ/gitea-mirror.git
synced 2025-12-07 12:06:46 +03:00
Fixed critical authentication issue causing "user does not exist [uid: 0]" errors during metadata mirroring operations. This release addresses Issue #68 and ensures proper authentication validation before all Gitea operations. Key improvements: - Pre-flight authentication validation for all Gitea operations - Consistent token decryption across all API calls - Repository existence verification before metadata operations - Graceful fallback to user account when org creation fails - Enhanced error messages with specific troubleshooting guidance - Added diagnostic test scripts for authentication validation This patch ensures metadata mirroring (issues, PRs, labels, milestones) works reliably without authentication errors.
173 lines
7.0 KiB
TypeScript
173 lines
7.0 KiB
TypeScript
#!/usr/bin/env bun
|
|
|
|
/**
|
|
* Test script to verify metadata mirroring authentication works correctly
|
|
* This tests the fix for issue #68 - "user does not exist [uid: 0, name: ]"
|
|
* Run with: bun run src/tests/test-metadata-mirroring.ts
|
|
*/
|
|
|
|
import { mirrorGitRepoIssuesToGitea } from "@/lib/gitea";
|
|
import { validateGiteaAuth } from "@/lib/gitea-auth-validator";
|
|
import { getConfigsByUserId } from "@/lib/db/queries/configs";
|
|
import { db, users, repositories } from "@/lib/db";
|
|
import { eq } from "drizzle-orm";
|
|
import { Octokit } from "@octokit/rest";
|
|
import type { Repository } from "@/lib/db/schema";
|
|
|
|
async function testMetadataMirroringAuth() {
|
|
console.log("=".repeat(60));
|
|
console.log("METADATA MIRRORING AUTHENTICATION TEST");
|
|
console.log("=".repeat(60));
|
|
|
|
try {
|
|
// Get the first user for testing
|
|
const userList = await db.select().from(users).limit(1);
|
|
|
|
if (userList.length === 0) {
|
|
console.error("❌ No users found in database. Please set up a user first.");
|
|
process.exit(1);
|
|
}
|
|
|
|
const user = userList[0];
|
|
console.log(`\n✅ Found user: ${user.email} (ID: ${user.id})`);
|
|
|
|
// Get the user's configuration
|
|
const configs = await getConfigsByUserId(user.id);
|
|
|
|
if (configs.length === 0) {
|
|
console.error("❌ No configuration found for user. Please configure GitHub and Gitea settings.");
|
|
process.exit(1);
|
|
}
|
|
|
|
const config = configs[0];
|
|
console.log(`✅ Found configuration (ID: ${config.id})`);
|
|
|
|
if (!config.giteaConfig?.url || !config.giteaConfig?.token) {
|
|
console.error("❌ Gitea configuration is incomplete. URL or token is missing.");
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!config.githubConfig?.token) {
|
|
console.error("❌ GitHub configuration is incomplete. Token is missing.");
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log(`\n📡 Testing Gitea connection to: ${config.giteaConfig.url}`);
|
|
console.log("-".repeat(60));
|
|
|
|
// Test 1: Validate Gitea authentication
|
|
console.log("\n🔐 Test 1: Validating Gitea authentication...");
|
|
let giteaUser;
|
|
try {
|
|
giteaUser = await validateGiteaAuth(config);
|
|
console.log(`✅ Gitea authentication successful!`);
|
|
console.log(` - Username: ${giteaUser.username || giteaUser.login}`);
|
|
console.log(` - User ID: ${giteaUser.id}`);
|
|
console.log(` - Is Admin: ${giteaUser.is_admin}`);
|
|
} catch (error) {
|
|
console.error(`❌ Gitea authentication failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
console.error(` This is the root cause of the "user does not exist [uid: 0]" error`);
|
|
process.exit(1);
|
|
}
|
|
|
|
// Test 2: Check if we can access a test repository
|
|
console.log("\n📦 Test 2: Looking for a test repository...");
|
|
|
|
// Get a repository from the database
|
|
const repos = await db.select().from(repositories)
|
|
.where(eq(repositories.userId, user.id))
|
|
.limit(1);
|
|
|
|
if (repos.length === 0) {
|
|
console.log("⚠️ No repositories found in database. Skipping metadata mirroring test.");
|
|
console.log(" Please run a mirror operation first to test metadata mirroring.");
|
|
} else {
|
|
const testRepo = repos[0] as Repository;
|
|
console.log(`✅ Found test repository: ${testRepo.fullName}`);
|
|
|
|
// Test 3: Verify repository exists in Gitea
|
|
console.log("\n🔍 Test 3: Verifying repository exists in Gitea...");
|
|
|
|
const { isRepoPresentInGitea } = await import("@/lib/gitea");
|
|
const giteaOwner = giteaUser.username || giteaUser.login;
|
|
|
|
const repoExists = await isRepoPresentInGitea({
|
|
config,
|
|
owner: giteaOwner,
|
|
repoName: testRepo.name,
|
|
});
|
|
|
|
if (!repoExists) {
|
|
console.log(`⚠️ Repository ${testRepo.name} not found in Gitea at ${giteaOwner}`);
|
|
console.log(` This would cause metadata mirroring to fail with authentication errors`);
|
|
console.log(` Please ensure the repository is mirrored first before attempting metadata sync`);
|
|
} else {
|
|
console.log(`✅ Repository exists in Gitea at ${giteaOwner}/${testRepo.name}`);
|
|
|
|
// Test 4: Attempt to mirror metadata (dry run)
|
|
console.log("\n🔄 Test 4: Testing metadata mirroring authentication...");
|
|
|
|
try {
|
|
// Create Octokit instance
|
|
const octokit = new Octokit({
|
|
auth: config.githubConfig.token,
|
|
});
|
|
|
|
// Test by attempting to fetch labels (lightweight operation)
|
|
const { httpGet } = await import("@/lib/http-client");
|
|
const { decryptConfigTokens } = await import("@/lib/utils/config-encryption");
|
|
const decryptedConfig = decryptConfigTokens(config);
|
|
|
|
const labelsResponse = await httpGet(
|
|
`${config.giteaConfig.url}/api/v1/repos/${giteaOwner}/${testRepo.name}/labels`,
|
|
{
|
|
Authorization: `token ${decryptedConfig.giteaConfig.token}`,
|
|
}
|
|
);
|
|
|
|
console.log(`✅ Successfully authenticated for metadata operations`);
|
|
console.log(` - Can access repository labels endpoint`);
|
|
console.log(` - Found ${labelsResponse.data.length} existing labels`);
|
|
console.log(` - Authentication token is valid and has proper permissions`);
|
|
|
|
} catch (error) {
|
|
if (error instanceof Error && error.message.includes('uid: 0')) {
|
|
console.error(`❌ CRITICAL: Authentication failed with "uid: 0" error!`);
|
|
console.error(` This is the exact issue from GitHub issue #68`);
|
|
console.error(` Error: ${error.message}`);
|
|
} else {
|
|
console.error(`❌ Metadata operation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
console.log("TEST COMPLETE");
|
|
console.log("=".repeat(60));
|
|
|
|
// Summary
|
|
console.log("\n📊 Summary:");
|
|
console.log(` - Gitea URL: ${config.giteaConfig.url}`);
|
|
console.log(` - Gitea User: ${giteaUser?.username || giteaUser?.login || 'Unknown'}`);
|
|
console.log(` - Authentication: ${giteaUser ? '✅ Valid' : '❌ Invalid'}`);
|
|
console.log(` - Metadata Mirroring: ${config.giteaConfig.mirrorMetadata ? 'Enabled' : 'Disabled'}`);
|
|
if (config.giteaConfig.mirrorMetadata) {
|
|
console.log(` - Issues: ${config.giteaConfig.mirrorIssues ? 'Yes' : 'No'}`);
|
|
console.log(` - Pull Requests: ${config.giteaConfig.mirrorPullRequests ? 'Yes' : 'No'}`);
|
|
console.log(` - Labels: ${config.giteaConfig.mirrorLabels ? 'Yes' : 'No'}`);
|
|
console.log(` - Milestones: ${config.giteaConfig.mirrorMilestones ? 'Yes' : 'No'}`);
|
|
}
|
|
|
|
console.log("\n✨ If all tests passed, metadata mirroring should work without uid:0 errors!");
|
|
|
|
} catch (error) {
|
|
console.error("\n❌ Test failed with error:", error);
|
|
process.exit(1);
|
|
}
|
|
|
|
process.exit(0);
|
|
}
|
|
|
|
// Run the test
|
|
testMetadataMirroringAuth().catch(console.error); |