aboutsummaryrefslogtreecommitdiff
path: root/extension
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2023-10-04 12:07:14 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2023-10-04 12:07:14 -0400
commitfcf2497e534cf5e0cae4cc2cd56962688a14bbad (patch)
tree6435cde441b8d54390d013d840a9154575f7e3a1 /extension
parent8f75b74c1cdc7a9bd4a29392b481b8902eafba53 (diff)
fix params method arguments
Diffstat (limited to 'extension')
-rw-r--r--extension/src/entries/background/auth-api.ts68
-rw-r--r--extension/src/entries/background/identity-api.ts44
-rw-r--r--extension/src/entries/background/main.ts6
-rw-r--r--extension/src/entries/background/nostr-api.ts78
-rw-r--r--extension/src/entries/background/permissions.ts6
-rw-r--r--extension/src/entries/background/server-api/endpoints.ts6
-rw-r--r--extension/src/entries/background/server-api/index.ts13
-rw-r--r--extension/src/entries/contentScript/nostr-shim.js2
-rw-r--r--extension/src/entries/options/components/SiteSettings.vue12
9 files changed, 124 insertions, 111 deletions
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<T extends JsonObject> {
- (message: BridgeMessage<T>): Promise<any>
+ (message: T): Promise<any>
}
+export interface MessageHandler<T extends JsonObject> {
+ (message: T): Promise<any>
+}
+
+export interface ApiMessageHandler<T extends JsonObject> {
+ (message: T, apiHandle: { axios: AxiosInstance }): Promise<any>
+}
+
+
export const useAuthApi = (() => {
const { loggedIn } = useSession();
@@ -49,37 +58,51 @@ export const useAuthApi = (() => {
throw { ...errMsg };
}
}
-
- const protect = <T extends JsonObject>(cbHandler: ProectedHandler<T>) =>{
- return (message: BridgeMessage<T>) : Promise<any> => {
+
+ const handleMessage = <T extends JsonObject> (cbHandler: MessageHandler<T>) => {
+ return (message: BridgeMessage<T>): Promise<any> => {
+ return cbHandler(message.data)
+ }
+ }
+
+ const handleProtectedMessage = <T extends JsonObject> (cbHandler: ProectedHandler<T>) => {
+ return (message: BridgeMessage<T>): Promise<any> => {
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<LoginMessage>): Promise<any> => {
+ const handleApiCall = <T extends JsonObject>(cbHandler: ApiMessageHandler<T>) => {
+ return (message: BridgeMessage<T>): Promise<any> => {
+ return apiCall((m) => cbHandler(message.data, m))
+ }
+ }
+ const handleProtectedApicall = <T extends JsonObject>(cbHandler: ApiMessageHandler<T>) => {
+ return (message: BridgeMessage<T>): Promise<any> => {
+ 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<any> => {
//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<void> => {
- return await apiCall(async () => {
- await logout()
- //Cleanup after logout
- clearLoginState()
- })
+ const onLogout = handleProtectedApicall(async () : Promise<void> => {
+ await logout()
+ //Cleanup after logout
+ clearLoginState()
})
- const onGetProfile = protect(async () : Promise<any> => {
- return await apiCall(async () => await getProfile())
- })
+ const onGetProfile = handleProtectedApicall(() : Promise<any> => getProfile())
const onGetStatus = async (): Promise<ClientStatus> => {
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 <https://www.gnu.org/licenses/>.
+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<NostrIdentiy>(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 <https://www.gnu.org/licenses/>.
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 <HistoryMessage>('history', protect(async ({data}) =>{
+onMessage<HistoryMessage>('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<NostrPubKey | null>({} as NostrPubKey)
- const onGetPubKey = () => {
- //Selected key is allowed from content script
- return { ...selectedKey.value }
- }
-
- const onDeleteKey = protect<NostrPubKey>(({ data }) => apiCall(() => execRequest<NostrPubKey>(Endpoints.DeleteKey, data)))
+ //Selected key is allowed from content script
+ const onGetPubKey = () => ({ ...selectedKey.value });
- const onSelectKey = protect<NostrPubKey>(async ({ data }) => {
- //Set the selected key to the value
- selectedKey.value = data
- })
+ const onDeleteKey = handleProtectedApicall<NostrPubKey>(data => execRequest<NostrPubKey>(Endpoints.DeleteKey, data))
- const onGetAllKeys = protect(async () => {
- return await apiCall(async () => {
+ //Set the selected key to the value
+ const onSelectKey = handleProtectedMessage<NostrPubKey>(data => (selectedKey.value = data, Promise.resolve()));
- //Get the keys from the server
- const data = await execRequest<NostrPubKey[]>(Endpoints.GetKeys);
+ const onGetAllKeys = handleProtectedApicall(async () => {
+ //Get the keys from the server
+ const data = await execRequest<NostrPubKey[]>(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<EventMessage>) => {
+ //Unprotect the signing handler so it can be called from the content script
+ const onSignEvent = handleApiCall<EventMessage>(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<NostrEvent>(Endpoints.SignEvent, data.event);
- return { event };
- })
+ const event = await execRequest<NostrEvent>(Endpoints.SignEvent, data.event);
+ return { event };
})
- const onGetRelays = async () => {
- return await apiCall(async () => {
- //Get preferred relays for the current user
- const data = await execRequest<NostrRelay[]>(Endpoints.GetRelays)
- return [ ...data ]
- })
- }
+ const onGetRelays = handleApiCall<any>(async () => {
+ //Get preferred relays for the current user
+ const data = await execRequest<NostrRelay[]>(Endpoints.GetRelays)
+ return [...data]
+ })
+ const onSetRelay = handleProtectedApicall<NostrRelay>(data => execRequest<NostrRelay>(Endpoints.SetRelay, data));
- const onSetRelay = protect<NostrRelay>(({ data }) => apiCall(() => execRequest<NostrRelay>(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 <https://www.gnu.org/licenses/>.
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<any>
onResponse: (response: any, request?: any) => Promise<any>
}
@@ -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<string>) => {
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<string>) => {
id: Endpoints.SignEvent,
method: 'POST',
path: () => `${get(nostrUrl)}?type=signEvent`,
- onRequest: ([event]) => Promise.resolve(event),
+ onRequest: (event) => Promise.resolve(event),
onResponse: async (response: WebMessage<NostrEvent>) => {
- return response.getResultOrThrow()
+ const res = response.getResultOrThrow()
+ delete res.KeyId;
+ return res;
}
})
@@ -71,7 +74,7 @@ export const initApi = (nostrUrl: Ref<string>) => {
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 @@
<div class="mt-2">
<label class="pl-1">BaseUrl</label>
<input class="w-full input" v-model="v$.apiUrl.$model" :class="{'error': v$.apiUrl.$invalid }" />
- <p class="pl-1 mt-1 text-xs text-red-500">
+ <p class="pl-1 mt-1 text-xs text-gray-600 dark:text-gray-400">
* The http path to the vault server (must start with http:// or https://)
</p>
</div>
<div class="mt-2">
<label class="pl-1">Account endpoint</label>
<input class="w-full input" v-model="v$.accountBasePath.$model" :class="{ 'error': v$.accountBasePath.$invalid }" />
- <p class="pl-1 mt-1 text-xs text-red-500">
+ <p class="pl-1 mt-1 text-xs text-gray-600 dark:text-gray-400">
* This is the path to the account server endpoint (must start with /)
</p>
</div>
<div class="mt-2">
<label class="pl-1">Nostr endpoint</label>
<input class="w-full input" v-model="v$.nostrEndpoint.$model" :class="{ 'error': v$.nostrEndpoint.$invalid }" />
- <p class="pl-1 mt-1 text-xs text-red-500">
+ <p class="pl-1 mt-1 text-xs text-gray-600 dark:text-gray-400">
* This is the path to the Nostr plugin endpoint path (must start with /)
</p>
</div>
</fieldset>
<div class="flex justify-end mt-2">
- <button :disabled="!modified || waiting" class="rounded btn sm" :class="{'primary':modified}" @click="onSave">Save</button>
+ <button :disabled="!modified || waiting" class="rounded btn sm" @click="onSave">Save</button>
</div>
</div>
</form>
@@ -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'
})