From fcf2497e534cf5e0cae4cc2cd56962688a14bbad Mon Sep 17 00:00:00 2001 From: vnugent Date: Wed, 4 Oct 2023 12:07:14 -0400 Subject: fix params method arguments --- extension/src/entries/background/auth-api.ts | 68 +++++++++++++------ extension/src/entries/background/identity-api.ts | 44 ++++++------ extension/src/entries/background/main.ts | 6 +- extension/src/entries/background/nostr-api.ts | 78 +++++++++------------- extension/src/entries/background/permissions.ts | 6 +- .../src/entries/background/server-api/endpoints.ts | 6 +- .../src/entries/background/server-api/index.ts | 13 ++-- extension/src/entries/contentScript/nostr-shim.js | 2 +- .../entries/options/components/SiteSettings.vue | 12 ++-- 9 files changed, 124 insertions(+), 111 deletions(-) (limited to 'extension/src/entries') diff --git a/extension/src/entries/background/auth-api.ts b/extension/src/entries/background/auth-api.ts index ed18b5b..64a46e4 100644 --- a/extension/src/entries/background/auth-api.ts +++ b/extension/src/entries/background/auth-api.ts @@ -26,9 +26,18 @@ interface ApiHandle { } export interface ProectedHandler { - (message: BridgeMessage): Promise + (message: T): Promise } +export interface MessageHandler { + (message: T): Promise +} + +export interface ApiMessageHandler { + (message: T, apiHandle: { axios: AxiosInstance }): Promise +} + + export const useAuthApi = (() => { const { loggedIn } = useSession(); @@ -49,37 +58,51 @@ export const useAuthApi = (() => { throw { ...errMsg }; } } - - const protect = (cbHandler: ProectedHandler) =>{ - return (message: BridgeMessage) : Promise => { + + const handleMessage = (cbHandler: MessageHandler) => { + return (message: BridgeMessage): Promise => { + return cbHandler(message.data) + } + } + + const handleProtectedMessage = (cbHandler: ProectedHandler) => { + return (message: BridgeMessage): Promise => { if (message.sender.context === 'options' || message.sender.context === 'popup') { - return cbHandler(message) + return cbHandler(message.data) } throw new Error('Unauthorized') } } - const onLogin = protect(async ({data} : BridgeMessage): Promise => { + const handleApiCall = (cbHandler: ApiMessageHandler) => { + return (message: BridgeMessage): Promise => { + return apiCall((m) => cbHandler(message.data, m)) + } + } + const handleProtectedApicall = (cbHandler: ApiMessageHandler) => { + return (message: BridgeMessage): Promise => { + if (message.sender.context === 'options' || message.sender.context === 'popup') { + return apiCall((m) => cbHandler(message.data, m)) + } + throw new Error('Unauthorized') + } + } + + const onLogin = handleProtectedApicall(async (data : LoginMessage): Promise => { //Perform login - return await apiCall(async ({ axios }) => { - const { login } = usePkiAuth(`${currentConfig.value.accountBasePath}/pki`); - await login(data.token) - return true; - }) + const { login } = usePkiAuth(`${currentConfig.value.accountBasePath}/pki`); + await login(data.token) + return true; }) - const onLogout = protect(async () : Promise => { - return await apiCall(async () => { - await logout() - //Cleanup after logout - clearLoginState() - }) + const onLogout = handleProtectedApicall(async () : Promise => { + await logout() + //Cleanup after logout + clearLoginState() }) - const onGetProfile = protect(async () : Promise => { - return await apiCall(async () => await getProfile()) - }) + const onGetProfile = handleProtectedApicall(() : Promise => getProfile()) const onGetStatus = async (): Promise => { return { @@ -124,7 +147,10 @@ export const useAuthApi = (() => { return{ loggedIn, apiCall, - protect, + handleMessage, + handleProtectedMessage, + handleApiCall, + handleProtectedApicall, userName, onLogin, onLogout, diff --git a/extension/src/entries/background/identity-api.ts b/extension/src/entries/background/identity-api.ts index 612f36e..c835f7c 100644 --- a/extension/src/entries/background/identity-api.ts +++ b/extension/src/entries/background/identity-api.ts @@ -13,42 +13,40 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { NostrIdentiy } from "../../bg-api/types"; import { useAuthApi } from "./auth-api"; import { useSettings } from "./settings"; export const useIdentityApi = (() => { - const { apiCall, protect } = useAuthApi(); + const { handleProtectedApicall } = useAuthApi(); const { currentConfig } = useSettings(); - const onCreateIdentity = protect(async ({data}) => { + const onCreateIdentity = handleProtectedApicall(async (data, { axios }) => { //Create a new identity - return await apiCall(async ({ axios }) => { - const response = await axios.put(`${currentConfig.value.nostrEndpoint}?type=identity`, data) - - if (response.data.success) { - return response.data.result; - } - //If we get here, the login failed - throw { response } - }) + const response = await axios.put(`${currentConfig.value.nostrEndpoint}?type=identity`, data) + + if (response.data.success) { + return response.data.result; + } + + //If we get here, the login failed + throw { response } }) - const onUpdateIdentity = protect(async ({data}) => { - return await apiCall(async ({ axios }) => { + const onUpdateIdentity = handleProtectedApicall(async (data, { axios }) => { + delete data.Created; + delete data.LastModified; - delete data.Created; - delete data.LastModified; + //Create a new identity + const response = await axios.patch(`${currentConfig.value.nostrEndpoint}?type=identity`, data) - //Create a new identity - const response = await axios.patch(`${currentConfig.value.nostrEndpoint}?type=identity`, data) + if (response.data.success) { + return response.data.result; + } - if (response.data.success) { - return response.data.result; - } - //If we get here, the login failed - throw { response } - }) + //If we get here, the login failed + throw { response } }) return () =>{ diff --git a/extension/src/entries/background/main.ts b/extension/src/entries/background/main.ts index b4080d6..7573b7a 100644 --- a/extension/src/entries/background/main.ts +++ b/extension/src/entries/background/main.ts @@ -14,7 +14,7 @@ // along with this program. If not, see . import { runtime } from "webextension-polyfill"; -import { HistoryEvent, useHistory } from "./history"; +import { useHistory } from "./history"; import { useNostrApi } from "./nostr-api"; import { useIdentityApi } from "./identity-api"; import { useSettings } from "./settings"; @@ -37,7 +37,7 @@ onMessage('getSiteConfig', onGetSiteConfig); onMessage('setSiteConfig', onSetSitConfig); //Register the api handlers -const { onGetProfile, onGetStatus, onLogin, onLogout, protect } = useAuthApi(); +const { onGetProfile, onGetStatus, onLogin, onLogout, handleProtectedMessage } = useAuthApi(); onMessage('getProfile', onGetProfile); onMessage('getStatus', onGetStatus); @@ -88,7 +88,7 @@ interface HistoryMessage extends JsonObject { event: string } -onMessage ('history', protect(async ({data}) =>{ +onMessage('history', handleProtectedMessage(async (data) =>{ switch(data.action){ case HistoryType.get: return getHistory(); diff --git a/extension/src/entries/background/nostr-api.ts b/extension/src/entries/background/nostr-api.ts index fb9130b..3c862ff 100644 --- a/extension/src/entries/background/nostr-api.ts +++ b/extension/src/entries/background/nostr-api.ts @@ -18,14 +18,13 @@ import { useAuthApi } from "./auth-api"; import { computed, ref, watch } from "vue"; import { find, isArray } from "lodash"; -import { BridgeMessage } from "webext-bridge"; -import { NostrRelay, NostrPubKey, EventMessage, NostrEvent } from './types' import { Endpoints, initApi } from "./server-api"; +import { NostrRelay, NostrPubKey, EventMessage, NostrEvent } from './types' export const useNostrApi = (() => { const { currentConfig } = useSettings(); - const { apiCall, protect, loggedIn } = useAuthApi(); + const { handleProtectedApicall, handleApiCall, handleProtectedMessage, loggedIn } = useAuthApi(); const nostrUrl = computed(() => currentConfig.value.nostrEndpoint || '/nostr') @@ -35,70 +34,57 @@ export const useNostrApi = (() => { //Get the current selected key const selectedKey = ref({} as NostrPubKey) - const onGetPubKey = () => { - //Selected key is allowed from content script - return { ...selectedKey.value } - } - - const onDeleteKey = protect(({ data }) => apiCall(() => execRequest(Endpoints.DeleteKey, data))) + //Selected key is allowed from content script + const onGetPubKey = () => ({ ...selectedKey.value }); - const onSelectKey = protect(async ({ data }) => { - //Set the selected key to the value - selectedKey.value = data - }) + const onDeleteKey = handleProtectedApicall(data => execRequest(Endpoints.DeleteKey, data)) - const onGetAllKeys = protect(async () => { - return await apiCall(async () => { + //Set the selected key to the value + const onSelectKey = handleProtectedMessage(data => (selectedKey.value = data, Promise.resolve())); - //Get the keys from the server - const data = await execRequest(Endpoints.GetKeys); + const onGetAllKeys = handleProtectedApicall(async () => { + //Get the keys from the server + const data = await execRequest(Endpoints.GetKeys); - //Response must be an array of key objects - if (!isArray(data)) { - return []; - } + //Response must be an array of key objects + if (!isArray(data)) { + return []; + } - //Make sure the selected keyid is in the list, otherwise unselect the key - if (data?.length > 0) { - if (!find(data, k => k.Id === selectedKey.value?.Id)) { - selectedKey.value = null; - } + //Make sure the selected keyid is in the list, otherwise unselect the key + if (data?.length > 0) { + if (!find(data, k => k.Id === selectedKey.value?.Id)) { + selectedKey.value = null; } + } - return [ ...data ] - }) + return [...data] }) - //Unprotect this handler so it can be called from the content script - const onSignEvent = (async ({ data }: BridgeMessage) => { + //Unprotect the signing handler so it can be called from the content script + const onSignEvent = handleApiCall(async (data) => { //Set the key id from our current selection data.event.KeyId = selectedKey.value?.Id || ''; //Pass key selection error to server - //Sign the event - return await apiCall(async () => { - //Sign the event - const event = await execRequest(Endpoints.SignEvent, data.event); - return { event }; - }) + const event = await execRequest(Endpoints.SignEvent, data.event); + return { event }; }) - const onGetRelays = async () => { - return await apiCall(async () => { - //Get preferred relays for the current user - const data = await execRequest(Endpoints.GetRelays) - return [ ...data ] - }) - } + const onGetRelays = handleApiCall(async () => { + //Get preferred relays for the current user + const data = await execRequest(Endpoints.GetRelays) + return [...data] + }) + const onSetRelay = handleProtectedApicall(data => execRequest(Endpoints.SetRelay, data)); - const onSetRelay = protect(({ data }) => apiCall(() => execRequest(Endpoints.SetRelay, data))); - const onNip04Encrypt = protect(async ({ data }) => { + const onNip04Encrypt = handleProtectedMessage(async (data) => { console.log('nip04.encrypt', data) return { ciphertext: 'ciphertext' } }) - const onNip04Decrypt = protect(async ({ data }) => { + const onNip04Decrypt = handleProtectedMessage(async (data) => { console.log('nip04.decrypt', data) return { plaintext: 'plaintext' } }) diff --git a/extension/src/entries/background/permissions.ts b/extension/src/entries/background/permissions.ts index f12c84c..4732bb7 100644 --- a/extension/src/entries/background/permissions.ts +++ b/extension/src/entries/background/permissions.ts @@ -14,7 +14,7 @@ // along with this program. If not, see . import { useStorageAsync } from "@vueuse/core"; -import { find, isEmpty, remove } from "lodash"; +import { find, isEmpty, merge, remove } from "lodash"; import { storage } from "webextension-polyfill"; import { useAuthApi } from "./auth-api"; import { useSettings } from "./settings"; @@ -50,7 +50,7 @@ export const removeAutoAllow = async (origin, mKind, keyId) => { export const useSitePermissions = (() => { - const { apiCall, protect } = useAuthApi(); + const { apiCall, handleProtectedMessage } = useAuthApi(); const { currentConfig } = useSettings(); @@ -66,7 +66,7 @@ export const useSitePermissions = (() => { return merge(defaultConfig, siteConfig) } - const onIsSiteEnabled = protect(async ({ data }) => { + const onIsSiteEnabled = handleProtectedMessage(async (data) => { }) diff --git a/extension/src/entries/background/server-api/endpoints.ts b/extension/src/entries/background/server-api/endpoints.ts index b27bfa9..6da9c71 100644 --- a/extension/src/entries/background/server-api/endpoints.ts +++ b/extension/src/entries/background/server-api/endpoints.ts @@ -19,7 +19,7 @@ import { Method } from "axios"; export interface EndpointDefinition { readonly method: Method - path(request?: any): string + path(...request: any): string onRequest: (...request: any) => Promise onResponse: (response: any, request?: any) => Promise } @@ -49,11 +49,11 @@ export const initEndponts = () => { } //Compute the path from the request - const path = endpoint.path(request); + const path = endpoint.path(...request); //Execute the request handler const req = await endpoint.onRequest(...request); - + //Get axios const axios = useAxios(null); diff --git a/extension/src/entries/background/server-api/index.ts b/extension/src/entries/background/server-api/index.ts index ee6582d..84598df 100644 --- a/extension/src/entries/background/server-api/index.ts +++ b/extension/src/entries/background/server-api/index.ts @@ -18,7 +18,8 @@ import { Ref } from "vue" import { get } from '@vueuse/core' import { WebMessage } from "@vnuge/vnlib.browser" import { initEndponts } from "./endpoints" -import { NostrEvent } from "../types" +import { NostrEvent, NostrRelay } from "../types" +import { NostrIdentiy } from "../../../bg-api/types" export enum Endpoints { GetKeys = 'getKeys', @@ -44,7 +45,7 @@ export const initApi = (nostrUrl: Ref) => { registerEndpoint({ id: Endpoints.DeleteKey, method: 'DELETE', - path: ([key]) => `${get(nostrUrl)}?type=identity&key_id=${key.Id}`, + path: (key:NostrIdentiy) => `${get(nostrUrl)}?type=identity&key_id=${key.Id}`, onRequest: () => Promise.resolve(), onResponse: (response: WebMessage) => response.getResultOrThrow() }) @@ -53,9 +54,11 @@ export const initApi = (nostrUrl: Ref) => { id: Endpoints.SignEvent, method: 'POST', path: () => `${get(nostrUrl)}?type=signEvent`, - onRequest: ([event]) => Promise.resolve(event), + onRequest: (event) => Promise.resolve(event), onResponse: async (response: WebMessage) => { - return response.getResultOrThrow() + const res = response.getResultOrThrow() + delete res.KeyId; + return res; } }) @@ -71,7 +74,7 @@ export const initApi = (nostrUrl: Ref) => { id: Endpoints.SetRelay, method: 'POST', path: () => `${get(nostrUrl)}?type=relay`, - onRequest: ([relay]) => Promise.resolve(relay), + onRequest: (relay:NostrRelay) => Promise.resolve(relay), onResponse: (response) => Promise.resolve(response) }) diff --git a/extension/src/entries/contentScript/nostr-shim.js b/extension/src/entries/contentScript/nostr-shim.js index 26b17a9..d0ca973 100644 --- a/extension/src/entries/contentScript/nostr-shim.js +++ b/extension/src/entries/contentScript/nostr-shim.js @@ -27,7 +27,7 @@ const nip07Enabled = () => getSiteConfig().then(p => p.autoInject); const ext = '@vnuge/nvault-extension' -let _promptHandler = () => {} +let _promptHandler = () => Promise.resolve({}) export const usePrompt = (callback) => { //Register the callback diff --git a/extension/src/entries/options/components/SiteSettings.vue b/extension/src/entries/options/components/SiteSettings.vue index 01d3eac..2b32a93 100644 --- a/extension/src/entries/options/components/SiteSettings.vue +++ b/extension/src/entries/options/components/SiteSettings.vue @@ -76,27 +76,27 @@
-

+

* The http path to the vault server (must start with http:// or https://)

-

+

* This is the path to the account server endpoint (must start with /)

-

+

* This is the path to the Nostr plugin endpoint path (must start with /)

- +
@@ -114,7 +114,7 @@ import{ Switch } from '@headlessui/vue' import useVuelidate from '@vuelidate/core' const { waiting } = useWait(); -const form = useFormToaster(); +const { info } = useFormToaster(); const { getSiteConfig, saveSiteConfig } = useManagment(); const { apply, data, buffer, modified } = useDataBuffer({ @@ -171,7 +171,7 @@ const onSave = async () => { return; } - form.info({ + info({ title: 'Reloading in 4 seconds', text: 'Your configuration will be saved and the extension will reload in 4 seconds' }) -- cgit