UNPKG

@nextcloud/auth

Version:

Nextcloud helpers related to authentication and the current user

162 lines (161 loc) 4.4 kB
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