'use strict'; const { requestBuffer } = require('./http-client'); function authHeader(config) { const token = Buffer.from(`${config.username}:${config.password}`).toString('base64'); return `Basic ${token}`; } function ocsUrl(config, path, query) { const base = config.nextcloudUrl.replace(/\/$/, ''); const q = query || 'format=json'; const sep = path.includes('?') ? '&' : '?'; return `${base}${path}${sep}${q}`; } function tlsOptions(config) { return config.verifyTls !== false && config.verifyTls !== 'false'; } function parseOcsBody(bodyBuffer) { const text = bodyBuffer.toString('utf8'); try { const json = JSON.parse(text); const ocs = json.ocs || json; const meta = ocs.meta || {}; const statuscode = meta.statuscode ?? meta.statusCode ?? 200; if (statuscode >= 400) { const message = meta.message || meta.status || text.slice(0, 200); throw new Error(`OCS ${statuscode}: ${message}`); } return { statusCode: statuscode, data: ocs.data, raw: json }; } catch (err) { if (err.message.startsWith('OCS ')) { throw err; } throw new Error(`OCS-svar kunde inte parsas: ${text.slice(0, 200)}`); } } async function ocsRequest(config, { method = 'GET', path, query, body, headers = {}, contentType }) { const url = ocsUrl(config, path, query); const reqHeaders = { Authorization: authHeader(config), 'OCS-APIRequest': 'true', Accept: 'application/json', ...headers }; let payload; if (body !== undefined) { if (Buffer.isBuffer(body)) { payload = body; } else if (typeof body === 'string') { payload = Buffer.from(body, 'utf8'); reqHeaders['Content-Type'] = contentType || 'application/json'; } else { payload = Buffer.from(JSON.stringify(body), 'utf8'); reqHeaders['Content-Type'] = contentType || 'application/json'; } reqHeaders['Content-Length'] = payload.length; } const res = await requestBuffer({ url, method, headers: reqHeaders, body: payload, rejectUnauthorized: tlsOptions(config) }); if (res.statusCode === 401 || res.statusCode === 403) { throw new Error(`OCS ${res.statusCode}: kontrollera app-lösenord`); } return { httpStatus: res.statusCode, ...parseOcsBody(res.body) }; } module.exports = { ocsRequest, ocsUrl };