carnet route
This commit is contained in:
parent
49ee892d50
commit
580cc20c5c
@ -140,33 +140,6 @@ async function ensureFolderStructure(nextcloudUrl: string, username: string, pas
|
||||
|
||||
async function getWebDAVCredentials(nextcloudUrl: string, username: string, adminUsername: string, adminPassword: string, userId: string) {
|
||||
try {
|
||||
// Check cache first
|
||||
const cachedCredentials = credentialsCache.get(userId);
|
||||
if (cachedCredentials) {
|
||||
const cacheAge = Date.now() - cachedCredentials.timestamp;
|
||||
if (cacheAge < 5 * 60 * 1000) { // 5 minutes cache
|
||||
// Verify the cached credentials still work
|
||||
const verifyResponse = await fetch(`${nextcloudUrl}/remote.php/dav/files/${encodeURIComponent(username)}/`, {
|
||||
method: 'PROPFIND',
|
||||
headers: {
|
||||
'Authorization': `Basic ${Buffer.from(`${username}:${cachedCredentials.password}`).toString('base64')}`,
|
||||
'Depth': '1',
|
||||
'Content-Type': 'application/xml',
|
||||
},
|
||||
body: '<?xml version="1.0" encoding="UTF-8"?><d:propfind xmlns:d="DAV:"><d:prop><d:resourcetype/></d:prop></d:propfind>',
|
||||
});
|
||||
|
||||
if (verifyResponse.ok) {
|
||||
console.log('Using cached credentials');
|
||||
return cachedCredentials.password;
|
||||
}
|
||||
|
||||
// If verification failed, remove from cache
|
||||
console.log('Cached credentials verification failed');
|
||||
credentialsCache.delete(userId);
|
||||
}
|
||||
}
|
||||
|
||||
// First check if user exists in Nextcloud
|
||||
const userInfoResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, {
|
||||
headers: {
|
||||
@ -184,27 +157,45 @@ async function getWebDAVCredentials(nextcloudUrl: string, username: string, admi
|
||||
throw new Error(`Failed to get user info: ${userInfoResponse.status} ${userInfoResponse.statusText}`);
|
||||
}
|
||||
|
||||
// Try to use the admin password first
|
||||
const adminVerifyResponse = await fetch(`${nextcloudUrl}/remote.php/dav/files/${encodeURIComponent(username)}/`, {
|
||||
method: 'PROPFIND',
|
||||
headers: {
|
||||
'Authorization': `Basic ${Buffer.from(`${username}:${adminPassword}`).toString('base64')}`,
|
||||
'Depth': '1',
|
||||
'Content-Type': 'application/xml',
|
||||
},
|
||||
body: '<?xml version="1.0" encoding="UTF-8"?><d:propfind xmlns:d="DAV:"><d:prop><d:resourcetype/></d:prop></d:propfind>',
|
||||
// Check database for existing credentials
|
||||
const existingCredentials = await prisma.webDAVCredentials.findUnique({
|
||||
where: { userId }
|
||||
});
|
||||
|
||||
if (adminVerifyResponse.ok) {
|
||||
console.log('Using admin password for WebDAV access');
|
||||
return adminPassword;
|
||||
if (existingCredentials) {
|
||||
// Verify if the existing credentials still work
|
||||
const verifyResponse = await fetch(`${nextcloudUrl}/remote.php/dav/files/${encodeURIComponent(username)}/`, {
|
||||
method: 'PROPFIND',
|
||||
headers: {
|
||||
'Authorization': `Basic ${Buffer.from(`${username}:${existingCredentials.password}`).toString('base64')}`,
|
||||
'Depth': '1',
|
||||
'Content-Type': 'application/xml',
|
||||
},
|
||||
body: '<?xml version="1.0" encoding="UTF-8"?><d:propfind xmlns:d="DAV:"><d:prop><d:resourcetype/></d:prop></d:propfind>',
|
||||
});
|
||||
|
||||
if (verifyResponse.ok) {
|
||||
console.log('Using existing credentials from database');
|
||||
// Update cache
|
||||
credentialsCache.set(userId, {
|
||||
password: existingCredentials.password,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
return existingCredentials.password;
|
||||
}
|
||||
|
||||
// If verification failed, delete the invalid credentials
|
||||
console.log('Existing credentials verification failed, removing from database');
|
||||
await prisma.webDAVCredentials.delete({
|
||||
where: { userId }
|
||||
});
|
||||
}
|
||||
|
||||
// If admin password doesn't work, generate a new password
|
||||
// If we get here, we need to generate a new password
|
||||
const newPassword = Math.random().toString(36).slice(-12);
|
||||
console.log('Setting new password for user');
|
||||
|
||||
// Set the user's password
|
||||
// Set the user's password in Nextcloud
|
||||
const setPasswordResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
@ -222,15 +213,26 @@ async function getWebDAVCredentials(nextcloudUrl: string, username: string, admi
|
||||
throw new Error(`Failed to set password: ${setPasswordResponse.status} ${setPasswordResponse.statusText}`);
|
||||
}
|
||||
|
||||
// Store the new credentials in the database
|
||||
await prisma.webDAVCredentials.upsert({
|
||||
where: { userId },
|
||||
update: {
|
||||
username: username,
|
||||
password: newPassword
|
||||
},
|
||||
create: {
|
||||
userId,
|
||||
username: username,
|
||||
password: newPassword
|
||||
}
|
||||
});
|
||||
|
||||
// Update cache
|
||||
credentialsCache.set(userId, {
|
||||
password: newPassword,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
|
||||
// Try to create folders, but don't fail if it doesn't work
|
||||
await ensureFolderStructure(nextcloudUrl, username, newPassword);
|
||||
|
||||
return newPassword;
|
||||
} catch (error) {
|
||||
console.error('Error in getWebDAVCredentials:', error);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user