85 lines
2.4 KiB
JavaScript
85 lines
2.4 KiB
JavaScript
import { NextResponse } from "next/server";
|
|
import { homedir } from "os";
|
|
import { join } from "path";
|
|
import Database from "better-sqlite3";
|
|
|
|
/**
|
|
* GET /api/oauth/cursor/auto-import
|
|
* Auto-detect and extract Cursor tokens from local SQLite database
|
|
*/
|
|
export async function GET() {
|
|
try {
|
|
const platform = process.platform;
|
|
let dbPath;
|
|
|
|
// Determine database path based on platform
|
|
if (platform === "darwin") {
|
|
dbPath = join(homedir(), "Library/Application Support/Cursor/User/globalStorage/state.vscdb");
|
|
} else if (platform === "linux") {
|
|
dbPath = join(homedir(), ".config/Cursor/User/globalStorage/state.vscdb");
|
|
} else if (platform === "win32") {
|
|
dbPath = join(process.env.APPDATA || "", "Cursor/User/globalStorage/state.vscdb");
|
|
} else {
|
|
return NextResponse.json(
|
|
{ error: "Unsupported platform", found: false },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Try to open database
|
|
let db;
|
|
try {
|
|
db = new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
} catch (error) {
|
|
return NextResponse.json({
|
|
found: false,
|
|
error: "Cursor database not found. Make sure Cursor IDE is installed and you are logged in.",
|
|
});
|
|
}
|
|
|
|
try {
|
|
// Extract tokens from database
|
|
const rows = db.prepare(
|
|
"SELECT key, value FROM itemTable WHERE key IN (?, ?)"
|
|
).all("cursorAuth/accessToken", "storage.serviceMachineId");
|
|
|
|
const tokens = {};
|
|
for (const row of rows) {
|
|
if (row.key === "cursorAuth/accessToken") {
|
|
tokens.accessToken = row.value;
|
|
} else if (row.key === "storage.serviceMachineId") {
|
|
tokens.machineId = row.value;
|
|
}
|
|
}
|
|
|
|
db.close();
|
|
|
|
// Validate tokens exist
|
|
if (!tokens.accessToken || !tokens.machineId) {
|
|
return NextResponse.json({
|
|
found: false,
|
|
error: "Tokens not found in database. Please login to Cursor IDE first.",
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({
|
|
found: true,
|
|
accessToken: tokens.accessToken,
|
|
machineId: tokens.machineId,
|
|
});
|
|
} catch (error) {
|
|
db?.close();
|
|
return NextResponse.json({
|
|
found: false,
|
|
error: `Failed to read database: ${error.message}`,
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.log("Cursor auto-import error:", error);
|
|
return NextResponse.json(
|
|
{ found: false, error: error.message },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|