Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); PROTO-1866: merge change email and post auth into one route by alecsavvy · Pull Request #9028 · AudiusProject/apps · GitHub
Skip to content
9 changes: 3 additions & 6 deletions packages/common/src/hooks/useChangeEmailFormConfiguration.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,16 +100,13 @@ export const useChangeEmailFormConfiguration = (onComplete: () => void) => {
const libs = await audiusBackend.getAudiusLibsTyped()

try {
// Try to change email
await libs.identityService!.changeEmail({
email,
otp: sanitizedOtp
})
await libs.Account!.changeCredentials({
newUsername: email,
newPassword: password,
oldUsername: oldEmail,
oldPassword: password
oldPassword: password,
otp: sanitizedOtp,
email
})
onComplete()
} catch (e) {
Expand Down
114 changes: 93 additions & 21 deletions packages/identity-service/src/routes/authentication.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,12 @@ module.exports = function (app) {
app.post(
'/authentication',
handleResponse(async (req, res, next) => {
const redis = req.app.get('redis')
const sendgrid = req.app.get('sendgrid')
if (!sendgrid) {
req.logger.error('Missing sendgrid api key')
}

// body should contain {iv, cipherText, lookupKey}
const body = req.body
const headers = req.headers
Expand All@@ -40,6 +46,93 @@ module.exports = function (app) {
try {
const transaction = await models.sequelize.transaction()

// default to null
let walletAddress = null
if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

const { email, oldLookupKey } = body
if (email) {
if (!oldLookupKey) {
return errorResponseBadRequest(
'Missing one of the required fields: oldLookupKey'
)
}

// require signed headers for changing email
if (walletAddress === null) {
return errorResponseBadRequest('Invalid credentials')
}

// check if new artifacts already exist and are deleted
const newArtifacts = await models.Authentication.findOne({
where: { lookupKey: body.lookupKey },
paranoid: false
})

// if artifacts exist or they were previously deleted
if (newArtifacts) {
// artifacts passed already exist
return errorResponseBadRequest('Invalid credentials')
}

// if user has wallet connected to auth artifacts, compare old lookupkey with wallet address
const oldArtifacts = await models.Authentication.findOne({
where: { lookupKey: oldLookupKey }
})
if (!oldArtifacts) {
return errorResponseBadRequest('Invalid credentials')
}

if (
oldArtifacts.walletAddress !== undefined &&
oldArtifacts.walletAddress !== null
) {
// if signature doesn't match old artifacts
if (walletAddress !== oldArtifacts.walletAddress) {
return errorResponseBadRequest('Invalid credentials')
}
}

const otp = body.otp

if (!otp) {
await sendOtp({ email, redis, sendgrid })
return errorResponseForbidden('Missing otp')
}

const isOtpValid = await validateOtp({ email, otp, redis })
if (!isOtpValid) {
return errorResponseBadRequest('Invalid credentials')
}

// change email of user whose signature was passed in the call
// require wallet address from signature when updating email
if (walletAddress !== null) {
const userRecord = await models.User.findOne({
where: { walletAddress },
transaction
})

await userRecord.update({ email }, { transaction })
}
}

// Check if an existing record exists but is soft deleted (since the Authentication model is 'paranoid'
// Setting the option paranoid to true searches both soft-deleted and non-deleted objects
// https://sequelize.org/master/manual/paranoid.html
Expand All@@ -49,26 +142,6 @@ module.exports = function (app) {
paranoid: false
})
if (!existingRecord) {
// default to null
let walletAddress = null

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to top of function so recovered walletAddress is accessible in multiple spots

if (
headers &&
headers[EncodedDataMessageHeader] &&
headers[EncodedDataSignatureHeader]
) {
const encodedDataMessage = headers[EncodedDataMessageHeader]
const encodedDataSignature = headers[EncodedDataSignatureHeader]
try {
walletAddress = sigUtil.recoverPersonalSignature({
data: encodedDataMessage,
sig: encodedDataSignature
})
} catch (err) {
// keep address as null for future user recovery
req.logger.error('Error recovering users signed address', err)
}
}

await models.Authentication.create(
{
iv: body.iv,
Expand All@@ -90,7 +163,6 @@ module.exports = function (app) {
})
}

const oldLookupKey = body.oldLookupKey
if (oldLookupKey && oldLookupKey !== body.lookupKey) {
await models.Authentication.destroy(
{ where: { lookupKey: oldLookupKey } },
Expand Down
Loading