From aa8f201b3c760d811143f1c63b084507d293c581 Mon Sep 17 00:00:00 2001 From: AlexanderGeere Date: Tue, 2 Jul 2024 16:43:40 +0200 Subject: [PATCH 1/6] Bones of success --- lib/plugins/userIDB.mjs | 21 +++++++++++++++++---- mod/sign/_sign.js | 4 +++- mod/sign/firebase.js | 27 +++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 mod/sign/firebase.js diff --git a/lib/plugins/userIDB.mjs b/lib/plugins/userIDB.mjs index 166a1e919..1b8c886d6 100644 --- a/lib/plugins/userIDB.mjs +++ b/lib/plugins/userIDB.mjs @@ -28,10 +28,23 @@ export function userIDB(plugin, mapview) { updateLayer(layer, mapview.layers[layer.key]) }) - mapp.utils.userIndexedDB.put('locales', locale) - - alert(`User ${mapp.user.email} IndexedDB updated.`) - + if(!plugin.object_store){ + mapp.utils.userIndexedDB.put('locales', locale) + alert(`User ${mapp.user.email} IndexedDB updated.`) + } + else{ + let instance = mapp.host.replace('/','').replaceAll('/','_') + fetch(`${mapp.host}/api/sign/${plugin.object_store}?${mapp.utils.paramString({email: mapp.user.email.replaceAll('.',''),instance: instance})}`).then( + async response => { + let responseJSON = await response.json() + fetch(responseJSON.signedUrl,{ + method: 'PATCH', + body:JSON.stringify({'locales':locale}) + }).then( + alert(`User ${mapp.user.email} Firebase Table updated.`) + ) + }) + } }}>
`); } diff --git a/mod/sign/_sign.js b/mod/sign/_sign.js index f3768da54..81ce3e28e 100644 --- a/mod/sign/_sign.js +++ b/mod/sign/_sign.js @@ -3,11 +3,13 @@ */ const cloudinary = require('./cloudinary') +const firebase = require('./firebase') module.exports = async (req, res) => { const signer = { - cloudinary + cloudinary, + firebase } if (!Object.hasOwn(signer, req.params.provider)) { diff --git a/mod/sign/firebase.js b/mod/sign/firebase.js new file mode 100644 index 000000000..901ca85e7 --- /dev/null +++ b/mod/sign/firebase.js @@ -0,0 +1,27 @@ +/** +@module /sign/firebase +*/ + +async function sign_firebase(req){ + let auth_url = `${process.env.FIREBASE_AUTH_URL}${process.env.FIREBASE_API_KEY}` + let email = process.env.TRANSPORT_EMAIL + let password = process.env.FIREBASE_PASSWORD + let environment = process.env.PRIVATE.includes('pg.a') ? 'live' : 'dev' + + const response = await fetch(auth_url, { + method: 'POST', + body: JSON.stringify( + { + email: email, + password: password, + returnSecureToken: true + }), + }); + + const responseJSON = await response.json() + + const url = `${process.env.FIREBASE_DB_URL}/${environment}_workspaces/${req.params.instance}/${req.params.email}.json?auth=${responseJSON.idToken}` + return {signedUrl: url} +} + +module.exports = async req => sign_firebase(req) \ No newline at end of file From 10115cc6ad882c878172afcb91642f0db78f8645 Mon Sep 17 00:00:00 2001 From: AlexanderGeere Date: Wed, 3 Jul 2024 16:08:02 +0200 Subject: [PATCH 2/6] Warnings and writing to the store --- lib/plugins/userIDB.mjs | 7 +++++++ mod/sign/firebase.js | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/plugins/userIDB.mjs b/lib/plugins/userIDB.mjs index 1b8c886d6..5f083a008 100644 --- a/lib/plugins/userIDB.mjs +++ b/lib/plugins/userIDB.mjs @@ -37,6 +37,13 @@ export function userIDB(plugin, mapview) { fetch(`${mapp.host}/api/sign/${plugin.object_store}?${mapp.utils.paramString({email: mapp.user.email.replaceAll('.',''),instance: instance})}`).then( async response => { let responseJSON = await response.json() + + if(responseJSON.missing_keys){ + console.warn(`UserIDB - Firebase: missing environment key(s) ${responseJSON.missing_keys.join(',')}`) + alert(`User ${mapp.user.email} Firebase Table failed to update.`) + return + } + fetch(responseJSON.signedUrl,{ method: 'PATCH', body:JSON.stringify({'locales':locale}) diff --git a/mod/sign/firebase.js b/mod/sign/firebase.js index 901ca85e7..7ff087281 100644 --- a/mod/sign/firebase.js +++ b/mod/sign/firebase.js @@ -3,6 +3,23 @@ */ async function sign_firebase(req){ + + let firebase_keys = 'FIREBASE_AUTH_URL,FIREBASE_API_KEY,TRANSPORT_EMAIL,FIREBASE_PASSWORD,FIREBASE_DB_URL' + + Object.keys(process.env).forEach( + element => { + if(firebase_keys.includes(element)){ + firebase_keys = firebase_keys.replace(`,${element}`,'') + firebase_keys = firebase_keys.replace(`${element},`,'') + firebase_keys = firebase_keys.replace(element,'') + } + } + ) + + if(firebase_keys.length > 4){ + return {signedUrl: null, missing_keys: firebase_keys.split(',')} + } + let auth_url = `${process.env.FIREBASE_AUTH_URL}${process.env.FIREBASE_API_KEY}` let email = process.env.TRANSPORT_EMAIL let password = process.env.FIREBASE_PASSWORD From 4811a2561ea2c6ed291ee4c891440e45c474d4ed Mon Sep 17 00:00:00 2001 From: AlexanderGeere Date: Mon, 15 Jul 2024 10:12:46 +0200 Subject: [PATCH 3/6] Signing api for firebase --- lib/plugins/userIDB.mjs | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/lib/plugins/userIDB.mjs b/lib/plugins/userIDB.mjs index 5f083a008..dec7ccbf7 100644 --- a/lib/plugins/userIDB.mjs +++ b/lib/plugins/userIDB.mjs @@ -28,30 +28,9 @@ export function userIDB(plugin, mapview) { updateLayer(layer, mapview.layers[layer.key]) }) - if(!plugin.object_store){ - mapp.utils.userIndexedDB.put('locales', locale) - alert(`User ${mapp.user.email} IndexedDB updated.`) - } - else{ - let instance = mapp.host.replace('/','').replaceAll('/','_') - fetch(`${mapp.host}/api/sign/${plugin.object_store}?${mapp.utils.paramString({email: mapp.user.email.replaceAll('.',''),instance: instance})}`).then( - async response => { - let responseJSON = await response.json() - - if(responseJSON.missing_keys){ - console.warn(`UserIDB - Firebase: missing environment key(s) ${responseJSON.missing_keys.join(',')}`) - alert(`User ${mapp.user.email} Firebase Table failed to update.`) - return - } - - fetch(responseJSON.signedUrl,{ - method: 'PATCH', - body:JSON.stringify({'locales':locale}) - }).then( - alert(`User ${mapp.user.email} Firebase Table updated.`) - ) - }) - } + mapp.utils.userIndexedDB.put('locales', locale) + alert(`User ${mapp.user.email} IndexedDB updated.`) + }}>
`); } From 05e5c46d257edfdee07234047da36080f6c4c822 Mon Sep 17 00:00:00 2001 From: AlexanderGeere Date: Mon, 22 Jul 2024 15:22:26 +0200 Subject: [PATCH 4/6] documentation --- mod/sign/firebase.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/mod/sign/firebase.js b/mod/sign/firebase.js index 7ff087281..728626745 100644 --- a/mod/sign/firebase.js +++ b/mod/sign/firebase.js @@ -1,14 +1,24 @@ /** -@module /sign/firebase +* @module /sign/firebase +* @description A module for producing signed urls for use with firebase object storage. */ +/** +* @description Creates a signed url for object storage within firebase. +* @function sign_firebase +* @param {req} - request parameters. +* @returns {Object} - Object containing the signed url e.g {signedUrl: xxxxxx} +*/ async function sign_firebase(req){ + //Check for keys needed to make the request in the workspace let firebase_keys = 'FIREBASE_AUTH_URL,FIREBASE_API_KEY,TRANSPORT_EMAIL,FIREBASE_PASSWORD,FIREBASE_DB_URL' Object.keys(process.env).forEach( element => { if(firebase_keys.includes(element)){ + + //If the key is found remove it from the list firebase_keys = firebase_keys.replace(`,${element}`,'') firebase_keys = firebase_keys.replace(`${element},`,'') firebase_keys = firebase_keys.replace(element,'') @@ -16,13 +26,18 @@ async function sign_firebase(req){ } ) + + //Send missing keys if something is not available for the request if(firebase_keys.length > 4){ return {signedUrl: null, missing_keys: firebase_keys.split(',')} } + let auth_url = `${process.env.FIREBASE_AUTH_URL}${process.env.FIREBASE_API_KEY}` let email = process.env.TRANSPORT_EMAIL let password = process.env.FIREBASE_PASSWORD + + //Use the private key to determine whether its a dev or live instance let environment = process.env.PRIVATE.includes('pg.a') ? 'live' : 'dev' const response = await fetch(auth_url, { @@ -37,6 +52,7 @@ async function sign_firebase(req){ const responseJSON = await response.json() + //Build up signed url const url = `${process.env.FIREBASE_DB_URL}/${environment}_workspaces/${req.params.instance}/${req.params.email}.json?auth=${responseJSON.idToken}` return {signedUrl: url} } From 39e84ae2600060f7fa4ff7cb48b0de41e05646ee Mon Sep 17 00:00:00 2001 From: AlexanderGeere Date: Mon, 22 Jul 2024 15:33:38 +0200 Subject: [PATCH 5/6] a little more documentation --- mod/sign/firebase.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/sign/firebase.js b/mod/sign/firebase.js index 728626745..18347c434 100644 --- a/mod/sign/firebase.js +++ b/mod/sign/firebase.js @@ -6,7 +6,8 @@ /** * @description Creates a signed url for object storage within firebase. * @function sign_firebase -* @param {req} - request parameters. +* @param {req} req.email - The users email address. +* @param {req} req.instance - The instance the user is on. * @returns {Object} - Object containing the signed url e.g {signedUrl: xxxxxx} */ async function sign_firebase(req){ From 2d4f517a51fa1a639dca82651c9b200b5a339a27 Mon Sep 17 00:00:00 2001 From: dbauszus-glx Date: Tue, 10 Sep 2024 18:37:38 +0100 Subject: [PATCH 6/6] format script --- mod/sign/firebase.js | 91 +++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/mod/sign/firebase.js b/mod/sign/firebase.js index 18347c434..442cfa1d9 100644 --- a/mod/sign/firebase.js +++ b/mod/sign/firebase.js @@ -1,61 +1,64 @@ /** -* @module /sign/firebase -* @description A module for producing signed urls for use with firebase object storage. +## /sign/firebase + +A module for producing signed urls for use with firebase object storage. + +@module /sign/firebase */ +module.exports = async req => sign_firebase(req) + /** -* @description Creates a signed url for object storage within firebase. -* @function sign_firebase -* @param {req} req.email - The users email address. -* @param {req} req.instance - The instance the user is on. -* @returns {Object} - Object containing the signed url e.g {signedUrl: xxxxxx} -*/ -async function sign_firebase(req){ +@function sign_firebase - //Check for keys needed to make the request in the workspace - let firebase_keys = 'FIREBASE_AUTH_URL,FIREBASE_API_KEY,TRANSPORT_EMAIL,FIREBASE_PASSWORD,FIREBASE_DB_URL' +@description Creates a signed url for object storage within firebase. - Object.keys(process.env).forEach( - element => { - if(firebase_keys.includes(element)){ +@param {req} req.email - The users email address. +@param {req} req.instance - The instance the user is on. +@returns {Object} Object containing the signed url e.g {signedUrl: xxxxxx} +*/ +async function sign_firebase(req) { - //If the key is found remove it from the list - firebase_keys = firebase_keys.replace(`,${element}`,'') - firebase_keys = firebase_keys.replace(`${element},`,'') - firebase_keys = firebase_keys.replace(element,'') - } - } - ) + //Check for keys needed to make the request in the workspace + let firebase_keys = 'FIREBASE_AUTH_URL,FIREBASE_API_KEY,TRANSPORT_EMAIL,FIREBASE_PASSWORD,FIREBASE_DB_URL' + Object.keys(process.env).forEach( + element => { + if (firebase_keys.includes(element)) { - //Send missing keys if something is not available for the request - if(firebase_keys.length > 4){ - return {signedUrl: null, missing_keys: firebase_keys.split(',')} + //If the key is found remove it from the list + firebase_keys = firebase_keys.replace(`,${element}`, '') + firebase_keys = firebase_keys.replace(`${element},`, '') + firebase_keys = firebase_keys.replace(element, '') + } } + ) + //Send missing keys if something is not available for the request + if (firebase_keys.length > 4) { + return { signedUrl: null, missing_keys: firebase_keys.split(',') } + } - let auth_url = `${process.env.FIREBASE_AUTH_URL}${process.env.FIREBASE_API_KEY}` - let email = process.env.TRANSPORT_EMAIL - let password = process.env.FIREBASE_PASSWORD + let auth_url = `${process.env.FIREBASE_AUTH_URL}${process.env.FIREBASE_API_KEY}` + let email = process.env.TRANSPORT_EMAIL + let password = process.env.FIREBASE_PASSWORD - //Use the private key to determine whether its a dev or live instance - let environment = process.env.PRIVATE.includes('pg.a') ? 'live' : 'dev' + //Use the private key to determine whether its a dev or live instance + let environment = process.env.PRIVATE.includes('pg.a') ? 'live' : 'dev' - const response = await fetch(auth_url, { - method: 'POST', - body: JSON.stringify( - { - email: email, - password: password, - returnSecureToken: true - }), - }); + const response = await fetch(auth_url, { + method: 'POST', + body: JSON.stringify( + { + email: email, + password: password, + returnSecureToken: true + }), + }); - const responseJSON = await response.json() + const responseJSON = await response.json() - //Build up signed url - const url = `${process.env.FIREBASE_DB_URL}/${environment}_workspaces/${req.params.instance}/${req.params.email}.json?auth=${responseJSON.idToken}` - return {signedUrl: url} -} + const url = `${process.env.FIREBASE_DB_URL}/${environment}_workspaces/${req.params.instance}/${req.params.email}.json?auth=${responseJSON.idToken}` -module.exports = async req => sign_firebase(req) \ No newline at end of file + return { signedUrl: url } +}