(relativePath: string, serverOrigin: string, filename: string)
| 997 | } |
| 998 | |
| 999 | async function createWebdavShare(relativePath: string, serverOrigin: string, filename: string): Promise<string> { |
| 1000 | const { webdavServerType, webdavShareType } = settings.store as { |
| 1001 | webdavServerType?: string; |
| 1002 | webdavShareType?: string; |
| 1003 | }; |
| 1004 | |
| 1005 | const ocsVersion = webdavServerType === "owncloud" ? "v1" : "v2"; |
| 1006 | const ocsUrl = `${serverOrigin}/ocs/${ocsVersion}.php/apps/files_sharing/api/v1/shares?format=json`; |
| 1007 | |
| 1008 | const authHeader = buildWebdavAuthHeader(); |
| 1009 | const ocsHeaders: Record<string, string> = { |
| 1010 | "OCS-APIRequest": "true", |
| 1011 | "Content-Type": "application/x-www-form-urlencoded" |
| 1012 | }; |
| 1013 | if (authHeader) { |
| 1014 | ocsHeaders.Authorization = authHeader; |
| 1015 | } |
| 1016 | |
| 1017 | const body = new URLSearchParams({ |
| 1018 | path: `/${relativePath}`, |
| 1019 | shareType: "3", |
| 1020 | permissions: "1" |
| 1021 | }).toString(); |
| 1022 | |
| 1023 | let shareToken: string; |
| 1024 | let shareUrl: string | undefined; |
| 1025 | |
| 1026 | if (Native) { |
| 1027 | const result = await Native.createWebdavShare(ocsUrl, ocsHeaders, body); |
| 1028 | if (!result.success) { |
| 1029 | throw new Error(result.error || "Failed to create public share"); |
| 1030 | } |
| 1031 | shareToken = result.url || ""; |
| 1032 | if (!shareToken) { |
| 1033 | throw new Error("No share token returned from server"); |
| 1034 | } |
| 1035 | } else { |
| 1036 | const response = await uploadRequestWithTimeout(ocsUrl, { |
| 1037 | method: "POST", |
| 1038 | headers: ocsHeaders, |
| 1039 | body |
| 1040 | }); |
| 1041 | |
| 1042 | const responseText = await response.text(); |
| 1043 | |
| 1044 | if (!response.ok) { |
| 1045 | throw new Error(`Failed to create public share: ${response.status} ${responseText}`); |
| 1046 | } |
| 1047 | |
| 1048 | let shareData: { ocs?: { data?: { url?: string; token?: string; }; meta?: Record<string, string>; }; }; |
| 1049 | try { |
| 1050 | shareData = JSON.parse(responseText); |
| 1051 | } catch { |
| 1052 | throw new Error(`Failed to parse share response: ${responseText.slice(0, 200)}`); |
| 1053 | } |
| 1054 | |
| 1055 | shareToken = shareData?.ocs?.data?.token ?? ""; |
| 1056 |
no test coverage detected