diff --git a/app/api/nextcloud/status/route.ts b/app/api/nextcloud/status/route.ts index 17cb17ce..6e3d25f6 100644 --- a/app/api/nextcloud/status/route.ts +++ b/app/api/nextcloud/status/route.ts @@ -10,10 +10,18 @@ async function sleep(ms: number) { async function parseXMLResponse(response: Response): Promise { const text = await response.text(); + console.log('XML Response:', text); // Debug log + const parser = new DOMParser(); const xmlDoc = parser.parseFromString(text, 'text/xml'); - // Convert XML to a simple object + // Check for parsing errors + const parserError = xmlDoc.getElementsByTagName('parsererror'); + if (parserError.length > 0) { + console.error('XML Parsing Error:', parserError[0].textContent); + throw new Error('Failed to parse XML response'); + } + const result: any = {}; const root = xmlDoc.documentElement; @@ -34,60 +42,76 @@ async function parseXMLResponse(response: Response): Promise { } async function getWebDAVCredentials(nextcloudUrl: string, username: string, adminUsername: string, adminPassword: string) { - // First, try to get the user's WebDAV password - const userInfoResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, { - headers: { - 'Authorization': `Basic ${Buffer.from(`${adminUsername}:${adminPassword}`).toString('base64')}`, - 'OCS-APIRequest': 'true', - }, - }); - - if (!userInfoResponse.ok) { - console.error('Failed to get user info:', await userInfoResponse.text()); - return null; - } - - const userInfo = await parseXMLResponse(userInfoResponse); - const webdavPassword = userInfo.webdav_password; - - if (!webdavPassword) { - // If no WebDAV password exists, create one - const createPasswordResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, { - method: 'PUT', - headers: { - 'Authorization': `Basic ${Buffer.from(`${adminUsername}:${adminPassword}`).toString('base64')}`, - 'OCS-APIRequest': 'true', - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: new URLSearchParams({ - key: 'webdav_password', - value: Math.random().toString(36).slice(-8), // Generate a random password - }).toString(), - }); - - if (!createPasswordResponse.ok) { - console.error('Failed to create WebDAV password:', await createPasswordResponse.text()); - return null; - } - - // Get the new WebDAV password - const newUserInfoResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, { + try { + // First, try to get the user's WebDAV password + const userInfoResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, { headers: { 'Authorization': `Basic ${Buffer.from(`${adminUsername}:${adminPassword}`).toString('base64')}`, 'OCS-APIRequest': 'true', }, }); - if (!newUserInfoResponse.ok) { - console.error('Failed to get new user info:', await newUserInfoResponse.text()); - return null; + if (!userInfoResponse.ok) { + console.error('Failed to get user info:', await userInfoResponse.text()); + throw new Error(`Failed to get user info: ${userInfoResponse.status} ${userInfoResponse.statusText}`); } - const newUserInfo = await parseXMLResponse(newUserInfoResponse); - return newUserInfo.webdav_password; - } + const userInfo = await parseXMLResponse(userInfoResponse); + console.log('User Info:', userInfo); // Debug log - return webdavPassword; + const webdavPassword = userInfo.webdav_password; + + if (!webdavPassword) { + // If no WebDAV password exists, create one + const randomPassword = Math.random().toString(36).slice(-8); + console.log('Creating new WebDAV password:', randomPassword); // Debug log + + const createPasswordResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, { + method: 'PUT', + headers: { + 'Authorization': `Basic ${Buffer.from(`${adminUsername}:${adminPassword}`).toString('base64')}`, + 'OCS-APIRequest': 'true', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + key: 'webdav_password', + value: randomPassword, + }).toString(), + }); + + if (!createPasswordResponse.ok) { + console.error('Failed to create WebDAV password:', await createPasswordResponse.text()); + throw new Error(`Failed to create WebDAV password: ${createPasswordResponse.status} ${createPasswordResponse.statusText}`); + } + + // Get the new WebDAV password + const newUserInfoResponse = await fetch(`${nextcloudUrl}/ocs/v1.php/cloud/users/${encodeURIComponent(username)}`, { + headers: { + 'Authorization': `Basic ${Buffer.from(`${adminUsername}:${adminPassword}`).toString('base64')}`, + 'OCS-APIRequest': 'true', + }, + }); + + if (!newUserInfoResponse.ok) { + console.error('Failed to get new user info:', await newUserInfoResponse.text()); + throw new Error(`Failed to get new user info: ${newUserInfoResponse.status} ${newUserInfoResponse.statusText}`); + } + + const newUserInfo = await parseXMLResponse(newUserInfoResponse); + console.log('New User Info:', newUserInfo); // Debug log + + if (!newUserInfo.webdav_password) { + throw new Error('WebDAV password was not set after creation'); + } + + return newUserInfo.webdav_password; + } + + return webdavPassword; + } catch (error) { + console.error('Error in getWebDAVCredentials:', error); + throw error; + } } export async function GET() {