@nextcloud/auth
Version:
Nextcloud helpers related to authentication and the current user
1 lines • 7.27 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../lib/requesttoken.ts","../lib/csp-nonce.ts","../lib/guest.ts","../lib/user.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { subscribe } from '@nextcloud/event-bus'\n\nexport interface CsrfTokenObserver {\n\t(token: string): void;\n}\n\nlet token: string | null | undefined\nconst observers: CsrfTokenObserver[] = []\n\n/**\n * Get current request token\n *\n * @return {string|null} Current request token or null if not set\n */\nexport function getRequestToken(): string | null {\n\tif (token === undefined) {\n\t\t// Only on first load, try to get token from document\n\t\ttoken = document.head.dataset.requesttoken ?? null\n\t}\n\treturn token\n}\n\n/**\n * Add an observer which is called when the CSRF token changes\n *\n * @param observer The observer\n */\nexport function onRequestTokenUpdate(observer: CsrfTokenObserver): void {\n\tobservers.push(observer)\n}\n\n// Listen to server event and keep token in sync\nsubscribe('csrf-token-update', (e: unknown) => {\n\ttoken = (e as { token: string }).token\n\n\tobservers.forEach((observer) => {\n\t\ttry {\n\t\t\tobserver(token!)\n\t\t} catch (e) {\n\t\t\tconsole.error('Error updating CSRF token observer', e)\n\t\t}\n\t})\n})\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\nimport { getRequestToken } from './requesttoken'\n\n/**\n * Get the CSP nonce for script loading\n *\n * @return Current nonce if set\n * @example When using webpack this can be used to allow webpack to dynamically load additional modules:\n * ```js\n * import { getCSPNonce } from '@nextcloud/auth'\n *\n * __webpack_nonce__ = getCSPNonce()\n * ```\n */\nexport function getCSPNonce(): string | undefined {\n\tconst meta = document?.querySelector<HTMLMetaElement>('meta[name=\"csp-nonce\"]')\n\t// backwards compatibility with older Nextcloud versions\n\tif (!meta) {\n\t\tconst token = getRequestToken()\n\t\treturn token ? btoa(token) : undefined\n\t}\n\treturn meta.nonce\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { getBuilder } from '@nextcloud/browser-storage'\nimport { NextcloudUser } from './user'\nimport { emit, subscribe } from '@nextcloud/event-bus'\n\nconst browserStorage = getBuilder('public').persist().build()\n\nclass GuestUser implements NextcloudUser {\n\n\tprivate _displayName: string | null\n\treadonly uid: string\n\treadonly isAdmin: boolean\n\n\tconstructor() {\n\t\tif (!browserStorage.getItem('guestUid')) {\n\t\t\tbrowserStorage.setItem('guestUid', self.crypto.randomUUID())\n\t\t}\n\n\t\tthis._displayName = browserStorage.getItem('guestNickname') || ''\n\t\tthis.uid = browserStorage.getItem('guestUid') || self.crypto.randomUUID()\n\t\tthis.isAdmin = false\n\n\t\tsubscribe('user:info:changed', (guest) => {\n\t\t\tthis._displayName = guest.displayName\n\t\t\tbrowserStorage.setItem('guestNickname', guest.displayName || '')\n\t\t})\n\n\t}\n\n\tget displayName(): string | null {\n\t\treturn this._displayName\n\t}\n\n\tset displayName(displayName: string) {\n\t\tthis._displayName = displayName\n\t\tbrowserStorage.setItem('guestNickname', displayName)\n\t\temit('user:info:changed', this)\n\t}\n\n}\n\nlet currentUser: NextcloudUser | undefined\n\n/**\n * Get the currently Guest user or null if not logged in\n */\nexport function getGuestUser(): NextcloudUser {\n\tif (!currentUser) {\n\t\tcurrentUser = new GuestUser()\n\t}\n\n\treturn currentUser\n}\n\n/**\n * Get the guest nickname for public pages\n */\nexport function getGuestNickname(): string | null {\n\treturn getGuestUser()?.displayName || null\n}\n\n/**\n * Set the guest nickname for public pages\n * @param nickname The nickname to set\n */\nexport function setGuestNickname(nickname: string): void {\n\tif (!nickname || nickname.trim().length === 0) {\n\t\tthrow new Error('Nickname cannot be empty')\n\t}\n\n\tgetGuestUser().displayName = nickname\n}\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\ndeclare global {\n\tinterface Window {\n\t\t_oc_isadmin?: boolean\n\t}\n}\n\nexport interface NextcloudUser {\n\tuid: string,\n\tdisplayName: string | null,\n\tisAdmin: boolean,\n}\n\nlet currentUser: NextcloudUser | null | undefined\n\nconst getAttribute = (el: HTMLHeadElement | undefined, attribute: string): string | null => {\n\tif (el) {\n\t\treturn el.getAttribute(attribute)\n\t}\n\n\treturn null\n}\n\n/**\n * Get the currently logged in Nextcloud user or null if not logged in\n */\nexport function getCurrentUser(): NextcloudUser | null {\n\tif (currentUser !== undefined) {\n\t\treturn currentUser\n\t}\n\n\tconst head = document?.getElementsByTagName('head')[0]\n\tif (!head) {\n\t\treturn null\n\t}\n\n\t// No user logged in so cache and return null\n\tconst uid = getAttribute(head, 'data-user')\n\tif (uid === null) {\n\t\tcurrentUser = null\n\t\treturn currentUser\n\t}\n\n\tcurrentUser = {\n\t\tuid,\n\t\tdisplayName: getAttribute(head, 'data-user-displayname'),\n\t\tisAdmin: !!window._oc_isadmin,\n\t} as NextcloudUser\n\n\treturn currentUser\n}\n"],"names":["subscribe","e","token","getBuilder","emit","currentUser"],"mappings":";;;;AAUA,IAAI;AACJ,MAAM,YAAiC,CAAC;AAOjC,SAAS,kBAAiC;AAChD,MAAI,UAAU,QAAW;AAEhB,YAAA,SAAS,KAAK,QAAQ,gBAAgB;AAAA,EAAA;AAExC,SAAA;AACR;AAOO,SAAS,qBAAqB,UAAmC;AACvE,YAAU,KAAK,QAAQ;AACxB;AAGAA,SAAAA,UAAU,qBAAqB,CAAC,MAAe;AAC9C,UAAS,EAAwB;AAEvB,YAAA,QAAQ,CAAC,aAAa;AAC3B,QAAA;AACH,eAAS,KAAM;AAAA,aACPC,IAAG;AACH,cAAA,MAAM,sCAAsCA,EAAC;AAAA,IAAA;AAAA,EACtD,CACA;AACF,CAAC;AC5BM,SAAS,cAAkC;AAC3C,QAAA,OAAO,UAAU,cAA+B,wBAAwB;AAE9E,MAAI,CAAC,MAAM;AACV,UAAMC,SAAQ,gBAAgB;AACvB,WAAAA,SAAQ,KAAKA,MAAK,IAAI;AAAA,EAAA;AAE9B,SAAO,KAAK;AACb;AClBA,MAAM,iBAAiBC,iBAAAA,WAAW,QAAQ,EAAE,QAAA,EAAU,MAAM;AAE5D,MAAM,UAAmC;AAAA,EAEhC;AAAA,EACC;AAAA,EACA;AAAA,EAET,cAAc;AACb,QAAI,CAAC,eAAe,QAAQ,UAAU,GAAG;AACxC,qBAAe,QAAQ,YAAY,KAAK,OAAO,YAAY;AAAA,IAAA;AAG5D,SAAK,eAAe,eAAe,QAAQ,eAAe,KAAK;AAC/D,SAAK,MAAM,eAAe,QAAQ,UAAU,KAAK,KAAK,OAAO,WAAW;AACxE,SAAK,UAAU;AAELH,uBAAA,qBAAqB,CAAC,UAAU;AACzC,WAAK,eAAe,MAAM;AAC1B,qBAAe,QAAQ,iBAAiB,MAAM,eAAe,EAAE;AAAA,IAAA,CAC/D;AAAA,EAAA;AAAA,EAIF,IAAI,cAA6B;AAChC,WAAO,KAAK;AAAA,EAAA;AAAA,EAGb,IAAI,YAAY,aAAqB;AACpC,SAAK,eAAe;AACL,mBAAA,QAAQ,iBAAiB,WAAW;AACnDI,aAAA,KAAK,qBAAqB,IAAI;AAAA,EAAA;AAGhC;AAEA,IAAIC;AAKG,SAAS,eAA8B;AAC7C,MAAI,CAACA,eAAa;AACjBA,oBAAc,IAAI,UAAU;AAAA,EAAA;AAGtB,SAAAA;AACR;AAKO,SAAS,mBAAkC;AAC1C,SAAA,aAAA,GAAgB,eAAe;AACvC;AAMO,SAAS,iBAAiB,UAAwB;AACxD,MAAI,CAAC,YAAY,SAAS,KAAK,EAAE,WAAW,GAAG;AACxC,UAAA,IAAI,MAAM,0BAA0B;AAAA,EAAA;AAG3C,eAAA,EAAe,cAAc;AAC9B;AC1DA,IAAI;AAEJ,MAAM,eAAe,CAAC,IAAiC,cAAqC;AAC3F,MAAI,IAAI;AACA,WAAA,GAAG,aAAa,SAAS;AAAA,EAAA;AAG1B,SAAA;AACR;AAKO,SAAS,iBAAuC;AACtD,MAAI,gBAAgB,QAAW;AACvB,WAAA;AAAA,EAAA;AAGR,QAAM,OAAO,UAAU,qBAAqB,MAAM,EAAE,CAAC;AACrD,MAAI,CAAC,MAAM;AACH,WAAA;AAAA,EAAA;AAIF,QAAA,MAAM,aAAa,MAAM,WAAW;AAC1C,MAAI,QAAQ,MAAM;AACH,kBAAA;AACP,WAAA;AAAA,EAAA;AAGM,gBAAA;AAAA,IACb;AAAA,IACA,aAAa,aAAa,MAAM,uBAAuB;AAAA,IACvD,SAAS,CAAC,CAAC,OAAO;AAAA,EACnB;AAEO,SAAA;AACR;;;;;;;;"}