@nextcloud/auth
Version:
Nextcloud helpers related to authentication and the current user
162 lines (161 loc) • 4.4 kB
JavaScript
import { subscribe, emit, unsubscribe } from "@nextcloud/event-bus";
import { generateUrl } from "@nextcloud/router";
import { getBuilder } from "@nextcloud/browser-storage";
_subscribeToTokenUpdates();
function getRequestToken() {
if (globalThis._nc_auth_requestToken) {
return globalThis._nc_auth_requestToken;
}
if (globalThis.document) {
return document.head.dataset.requesttoken ?? null;
}
return null;
}
function setRequestToken(token) {
if (!token || typeof token !== "string") {
throw new Error("Invalid CSRF token given", { cause: { token } });
}
if (globalThis._nc_auth_requestToken === token) {
return;
}
globalThis._nc_auth_requestToken = token;
if (globalThis.document) {
document.head.dataset.requesttoken = token;
}
emit("csrf-token-update", { token, _internal: true });
}
async function fetchRequestToken() {
const url = generateUrl("/csrftoken");
const response = await fetch(url);
if (!response.ok) {
throw new Error("Could not fetch CSRF token from API", { cause: response });
}
try {
const { token } = await response.json();
setRequestToken(token);
return token;
} catch (error) {
throw new Error("Could not parse CSRF token from API response", { cause: error });
}
}
function onRequestTokenUpdate(observer) {
const wrapper = async ({ token }) => {
try {
observer(token);
} catch (error) {
console.error("Error updating CSRF token observer", error);
}
};
subscribe("csrf-token-update", wrapper);
return () => unsubscribe("csrf-token-update", wrapper);
}
function _subscribeToTokenUpdates() {
subscribe("csrf-token-update", ({ token, _internal }) => {
if (!_internal) {
setRequestToken(token);
}
});
}
function getCSPNonce() {
const meta = document?.querySelector('meta[name="csp-nonce"]');
if (!meta) {
const token = getRequestToken();
return token ? btoa(token) : void 0;
}
return meta.nonce;
}
/*!
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
const browserStorage = getBuilder("public").persist().build();
class GuestUser {
_displayName;
uid;
isAdmin;
constructor() {
if (!browserStorage.getItem("guestUid")) {
browserStorage.setItem("guestUid", randomUUID());
}
this._displayName = browserStorage.getItem("guestNickname") || "";
this.uid = browserStorage.getItem("guestUid") || randomUUID();
this.isAdmin = false;
subscribe("user:info:changed", (guest) => {
this._displayName = guest.displayName;
browserStorage.setItem("guestNickname", guest.displayName || "");
});
}
get displayName() {
return this._displayName;
}
set displayName(displayName) {
this._displayName = displayName;
browserStorage.setItem("guestNickname", displayName);
emit("user:info:changed", this);
}
}
let currentUser$1;
function getGuestUser() {
if (!currentUser$1) {
currentUser$1 = new GuestUser();
}
return currentUser$1;
}
function getGuestNickname() {
return getGuestUser()?.displayName || null;
}
function setGuestNickname(nickname) {
if (!nickname || nickname.trim().length === 0) {
throw new Error("Nickname cannot be empty");
}
getGuestUser().displayName = nickname;
}
function randomUUID() {
if (globalThis.crypto?.randomUUID) {
return globalThis.crypto.randomUUID();
}
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
const r = Math.random() * 16 | 0;
const v = c === "x" ? r : r & 3 | 8;
return v.toString(16);
});
}
let currentUser;
function getAttribute(el, attribute) {
if (el) {
return el.getAttribute(attribute);
}
return null;
}
function getCurrentUser() {
if (currentUser !== void 0) {
return currentUser;
}
const head = document?.getElementsByTagName("head")[0];
if (!head) {
return null;
}
const uid = getAttribute(head, "data-user");
if (uid === null) {
currentUser = null;
return currentUser;
}
currentUser = {
uid,
displayName: getAttribute(head, "data-user-displayname"),
isAdmin: !!window._oc_isadmin
};
return currentUser;
}
export {
fetchRequestToken,
getCSPNonce,
getCurrentUser,
getGuestNickname,
getGuestUser,
getRequestToken,
onRequestTokenUpdate,
setGuestNickname,
setRequestToken
};
//# sourceMappingURL=index.mjs.map