Auth refactor #7112
10 changed files with 140 additions and 157 deletions
|
@ -156,7 +156,7 @@
|
|||
"json-loader": "^0.5.4",
|
||||
"lbry-format": "https://github.com/lbryio/lbry-format.git",
|
||||
"lbry-redux": "lbryio/lbry-redux#32b578707116d45f5b51b7ab523d200e75668676",
|
||||
"lbryinc": "lbryio/lbryinc#0b4e41ef90d6347819dd3453f2f9398a5c1b4f36",
|
||||
"lbryinc": "lbryio/lbryinc#c9ced4f226e06f4f188cb8dc31b561e1c27c5266",
|
||||
"lint-staged": "^7.0.2",
|
||||
"localforage": "^1.7.1",
|
||||
"lodash-es": "^4.17.14",
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import { DOMAIN } from 'config';
|
||||
import { connect } from 'react-redux';
|
||||
import { doSetDaemonSetting } from 'redux/actions/settings';
|
||||
import { doSetWelcomeVersion, doToggle3PAnalytics, doSignOut } from 'redux/actions/app';
|
||||
|
@ -10,17 +9,16 @@ import { version as appVersion } from 'package.json';
|
|||
|
||||
import PrivacyAgreement from './view';
|
||||
|
||||
const select = state => ({
|
||||
const select = (state) => ({
|
||||
authenticated: selectUserVerifiedEmail(state),
|
||||
});
|
||||
|
||||
const perform = dispatch => ({
|
||||
setWelcomeVersion: version => dispatch(doSetWelcomeVersion(version || WELCOME_VERSION)),
|
||||
setShareDataInternal: share => dispatch(doSetDaemonSetting(DAEMON_SETTINGS.SHARE_USAGE_DATA, share)),
|
||||
setShareDataThirdParty: share => dispatch(doToggle3PAnalytics(share)),
|
||||
const perform = (dispatch) => ({
|
||||
setWelcomeVersion: (version) => dispatch(doSetWelcomeVersion(version || WELCOME_VERSION)),
|
||||
setShareDataInternal: (share) => dispatch(doSetDaemonSetting(DAEMON_SETTINGS.SHARE_USAGE_DATA, share)),
|
||||
setShareDataThirdParty: (share) => dispatch(doToggle3PAnalytics(share)),
|
||||
signOut: () => dispatch(doSignOut()),
|
||||
authenticateIfSharingData: () =>
|
||||
dispatch(doAuthenticate(appVersion, undefined, undefined, true, undefined, undefined, DOMAIN)),
|
||||
authenticateIfSharingData: () => dispatch(doAuthenticate(appVersion, undefined, undefined, true)), // appVersion, shareData?, shareCallback, callInstall
|
||||
});
|
||||
|
||||
export default connect(select, perform)(PrivacyAgreement);
|
||||
|
|
35
ui/index.jsx
35
ui/index.jsx
|
@ -14,7 +14,7 @@ import * as MODALS from 'constants/modal_types';
|
|||
import React, { Fragment, useState, useEffect } from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
import { doDaemonReady, doAutoUpdate, doOpenModal, doHideModal, doToggle3PAnalytics } from 'redux/actions/app';
|
||||
import { doLbryReady, doAutoUpdate, doOpenModal, doHideModal, doToggle3PAnalytics } from 'redux/actions/app';
|
||||
import { Lbry, isURIValid, apiCall } from 'lbry-redux';
|
||||
import { setSearchApi } from 'redux/actions/search';
|
||||
import { doSetLanguage, doFetchLanguage, doUpdateIsNightAsync } from 'redux/actions/settings';
|
||||
|
@ -28,12 +28,7 @@ import { formatLbryUrlForWeb, formatInAppUrl } from 'util/url';
|
|||
import { PersistGate } from 'redux-persist/integration/react';
|
||||
import analytics from 'analytics';
|
||||
import { doToast } from 'redux/actions/notifications';
|
||||
import {
|
||||
getAuthToken,
|
||||
setAuthToken,
|
||||
doDeprecatedPasswordMigrationMarch2020,
|
||||
doAuthTokenRefresh,
|
||||
} from 'util/saved-passwords';
|
||||
import { getAuthToken, setAuthToken, doAuthTokenRefresh, deleteAuthToken, getTokens } from 'util/saved-passwords';
|
||||
import { X_LBRY_AUTH_TOKEN } from 'constants/token';
|
||||
import { LBRY_WEB_API, DEFAULT_LANGUAGE, LBRY_API_URL, LBRY_WEB_PUBLISH_API } from 'config';
|
||||
|
||||
|
@ -112,28 +107,34 @@ if (process.env.SEARCH_API_URL) {
|
|||
setSearchApi(process.env.SEARCH_API_URL);
|
||||
}
|
||||
|
||||
// Fix to make sure old users' cookies are set to the correct domain
|
||||
// This can be removed after March 11th, 2021
|
||||
// https://github.com/lbryio/lbry-desktop/pull/3830
|
||||
doDeprecatedPasswordMigrationMarch2020();
|
||||
doAuthTokenRefresh();
|
||||
// TODO KEYCLOAK
|
||||
if (getTokens().auth_token) {
|
||||
doAuthTokenRefresh();
|
||||
}
|
||||
|
||||
// We need to override Lbryio for getting/setting the authToken
|
||||
// We interact with ipcRenderer to get the auth key from a users keyring
|
||||
// We keep a local variable for authToken because `ipcRenderer.send` does not
|
||||
// contain a response, so there is no way to know when it's been set
|
||||
let authToken;
|
||||
Lbryio.setOverride('setAuthToken', (authToken) => {
|
||||
setAuthToken(authToken);
|
||||
setAuthToken(authToken); // set the cookie to auth_token=
|
||||
return authToken;
|
||||
});
|
||||
Lbryio.setOverride('deleteAuthToken', () => deleteAuthToken());
|
||||
|
||||
Lbryio.setOverride(
|
||||
'getTokens',
|
||||
() =>
|
||||
new Promise((resolve) => {
|
||||
resolve(getTokens());
|
||||
})
|
||||
);
|
||||
|
||||
Lbryio.setOverride(
|
||||
'getAuthToken',
|
||||
() =>
|
||||
new Promise((resolve) => {
|
||||
const authTokenToReturn = authToken || getAuthToken();
|
||||
resolve(authTokenToReturn);
|
||||
resolve(getAuthToken());
|
||||
})
|
||||
);
|
||||
|
||||
|
@ -266,7 +267,7 @@ function AppWrapper() {
|
|||
app.store.dispatch(doFetchLanguage(DEFAULT_LANGUAGE));
|
||||
}
|
||||
app.store.dispatch(doUpdateIsNightAsync());
|
||||
app.store.dispatch(doDaemonReady());
|
||||
app.store.dispatch(doLbryReady()); // get tokens, users, startup stuff
|
||||
app.store.dispatch(doBlackListedOutpointsSubscribe());
|
||||
app.store.dispatch(doFilteredOutpointsSubscribe());
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import { ipcRenderer, remote } from 'electron';
|
|||
import path from 'path';
|
||||
import * as ACTIONS from 'constants/action_types';
|
||||
import * as MODALS from 'constants/modal_types';
|
||||
import { DOMAIN, SIMPLE_SITE } from 'config';
|
||||
import { SIMPLE_SITE } from 'config';
|
||||
import {
|
||||
Lbry,
|
||||
doBalanceSubscribe,
|
||||
|
@ -353,7 +353,7 @@ export function doAlertWaitingForSync() {
|
|||
};
|
||||
}
|
||||
|
||||
export function doDaemonReady() {
|
||||
export function doLbryReady() {
|
||||
return (dispatch, getState) => {
|
||||
const state = getState();
|
||||
|
||||
|
@ -363,8 +363,6 @@ export function doDaemonReady() {
|
|||
dispatch(
|
||||
doAuthenticate(
|
||||
appVersion,
|
||||
undefined,
|
||||
undefined,
|
||||
shareUsageData,
|
||||
(status) => {
|
||||
const trendingAlgorithm =
|
||||
|
@ -377,8 +375,7 @@ export function doDaemonReady() {
|
|||
analytics.trendingAlgorithmEvent(trendingAlgorithm);
|
||||
}
|
||||
},
|
||||
undefined,
|
||||
DOMAIN
|
||||
undefined
|
||||
)
|
||||
);
|
||||
dispatch({ type: ACTIONS.DAEMON_READY });
|
||||
|
|
|
@ -50,11 +50,8 @@ export function doFetchInviteStatus(shouldCallRewardList = true) {
|
|||
};
|
||||
}
|
||||
|
||||
export function doInstallNew(appVersion, os = null, firebaseToken = null, callbackForUsersWhoAreSharingData, domain) {
|
||||
export function doInstallNew(appVersion, callbackForUsersWhoAreSharingData, domain) {
|
||||
const payload = { app_version: appVersion, domain };
|
||||
if (firebaseToken) {
|
||||
payload.firebase_token = firebaseToken;
|
||||
}
|
||||
|
||||
Lbry.status().then((status) => {
|
||||
payload.app_id =
|
||||
|
@ -64,7 +61,7 @@ export function doInstallNew(appVersion, os = null, firebaseToken = null, callba
|
|||
payload.node_id = status.lbry_id;
|
||||
Lbry.version().then((version) => {
|
||||
payload.daemon_version = version.lbrynet_version;
|
||||
payload.operating_system = os || version.os_system;
|
||||
payload.operating_system = version.os_system;
|
||||
payload.platform = version.platform;
|
||||
Lbryio.call('install', 'new', payload);
|
||||
|
||||
|
@ -75,33 +72,9 @@ export function doInstallNew(appVersion, os = null, firebaseToken = null, callba
|
|||
});
|
||||
}
|
||||
|
||||
export function doInstallNewWithParams(
|
||||
appVersion,
|
||||
installationId,
|
||||
nodeId,
|
||||
lbrynetVersion,
|
||||
os,
|
||||
platform,
|
||||
firebaseToken = null
|
||||
) {
|
||||
return () => {
|
||||
const payload = { app_version: appVersion };
|
||||
if (firebaseToken) {
|
||||
payload.firebase_token = firebaseToken;
|
||||
}
|
||||
|
||||
payload.app_id = installationId;
|
||||
payload.node_id = nodeId;
|
||||
payload.daemon_version = lbrynetVersion;
|
||||
payload.operating_system = os;
|
||||
payload.platform = platform;
|
||||
Lbryio.call('install', 'new', payload);
|
||||
};
|
||||
}
|
||||
|
||||
function checkAuthBusy() {
|
||||
let time = Date.now();
|
||||
return new Promise(function(resolve, reject) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
(function waitForAuth() {
|
||||
try {
|
||||
sessionStorage.setItem('test', 'available');
|
||||
|
@ -131,48 +104,59 @@ function checkAuthBusy() {
|
|||
}
|
||||
|
||||
// TODO: Call doInstallNew separately so we don't have to pass appVersion and os_system params?
|
||||
/**
|
||||
*
|
||||
* @param appVersion
|
||||
* @param shareUsageData
|
||||
* @param callbackForUsersWhoAreSharingData
|
||||
* @param callInstall
|
||||
* @returns {Function}
|
||||
*
|
||||
* Lbryio.fetchUser:
|
||||
* getTokens then getCurrentUser, and if !user, call userNew and return the user
|
||||
*
|
||||
*/
|
||||
export function doAuthenticate(
|
||||
appVersion,
|
||||
os = null,
|
||||
firebaseToken = null,
|
||||
shareUsageData = true,
|
||||
callbackForUsersWhoAreSharingData,
|
||||
callInstall = true,
|
||||
domain = null
|
||||
callInstall = true
|
||||
) {
|
||||
return (dispatch) => {
|
||||
return async (dispatch) => {
|
||||
dispatch({
|
||||
type: ACTIONS.AUTHENTICATION_STARTED,
|
||||
});
|
||||
checkAuthBusy()
|
||||
.then(() => {
|
||||
return Lbryio.authenticate(DOMAIN, getDefaultLanguage());
|
||||
})
|
||||
.then((user) => {
|
||||
try {
|
||||
await checkAuthBusy();
|
||||
const user = await Lbryio.fetchUser(DOMAIN, getDefaultLanguage());
|
||||
console.log('USER', user);
|
||||
if (sessionStorageAvailable) window.sessionStorage.removeItem(AUTH_IN_PROGRESS);
|
||||
Lbryio.getAuthToken().then((token) => {
|
||||
// put this back: accessToken: tokens.access_token
|
||||
if (user.error) {
|
||||
throw new Error(user.error.message);
|
||||
} else {
|
||||
Lbryio.getTokens().then((tokens) => {
|
||||
dispatch({
|
||||
type: ACTIONS.AUTHENTICATION_SUCCESS,
|
||||
data: { user, accessToken: token },
|
||||
data: { user, accessToken: tokens.auth_token }, // rename 'accessToken' = authToken
|
||||
});
|
||||
|
||||
if (shareUsageData) {
|
||||
dispatch(doRewardList());
|
||||
dispatch(doFetchInviteStatus(false));
|
||||
if (callInstall) {
|
||||
doInstallNew(appVersion, os, firebaseToken, callbackForUsersWhoAreSharingData, domain);
|
||||
doInstallNew(appVersion, callbackForUsersWhoAreSharingData, DOMAIN);
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
}
|
||||
} catch (error) {
|
||||
if (sessionStorageAvailable) window.sessionStorage.removeItem(AUTH_IN_PROGRESS);
|
||||
|
||||
dispatch({
|
||||
type: ACTIONS.AUTHENTICATION_FAILURE,
|
||||
data: { error },
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -183,7 +167,7 @@ export function doUserFetch() {
|
|||
type: ACTIONS.USER_FETCH_STARTED,
|
||||
});
|
||||
|
||||
Lbryio.getCurrentUser()
|
||||
Lbryio.fetchCurrentUser()
|
||||
.then((user) => {
|
||||
dispatch({
|
||||
type: ACTIONS.USER_FETCH_SUCCESS,
|
||||
|
@ -204,7 +188,7 @@ export function doUserFetch() {
|
|||
export function doUserCheckEmailVerified() {
|
||||
// This will happen in the background so we don't need loading booleans
|
||||
return (dispatch) => {
|
||||
Lbryio.getCurrentUser().then((user) => {
|
||||
Lbryio.fetchCurrentUser().then((user) => {
|
||||
if (user.has_verified_email) {
|
||||
dispatch(doRewardList());
|
||||
|
||||
|
|
|
@ -24,37 +24,44 @@ const defaultState = {
|
|||
invitees: undefined,
|
||||
referralLink: undefined,
|
||||
referralCode: undefined,
|
||||
user: undefined,
|
||||
accessToken: undefined,
|
||||
user: { has_verified_email: false },
|
||||
accessToken: undefined, // rename this
|
||||
youtubeChannelImportPending: false,
|
||||
youtubeChannelImportErrorMessage: '',
|
||||
referrerSetIsPending: false,
|
||||
referrerSetError: '',
|
||||
};
|
||||
|
||||
reducers[ACTIONS.AUTHENTICATION_STARTED] = state =>
|
||||
// does this do anything with user?
|
||||
reducers[ACTIONS.AUTHENTICATION_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
authenticationIsPending: true,
|
||||
userIsPending: true,
|
||||
// distinguish accessToken from authToken
|
||||
accessToken: defaultState.accessToken,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.AUTHENTICATION_SUCCESS] = (state, action) =>
|
||||
reducers[ACTIONS.AUTHENTICATION_SUCCESS] = (state, action) => {
|
||||
const newUserState = Object.assign({}, state, {
|
||||
authenticationIsPending: false,
|
||||
userIsPending: false,
|
||||
});
|
||||
if (action.data && action.data.user) {
|
||||
newUserState.user = action.data.user;
|
||||
}
|
||||
if (action.data && action.data.accessToken) {
|
||||
newUserState.accessToken = action.data.accessToken;
|
||||
}
|
||||
return newUserState;
|
||||
};
|
||||
|
||||
reducers[ACTIONS.AUTHENTICATION_FAILURE] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
authenticationIsPending: false,
|
||||
userIsPending: false,
|
||||
accessToken: action.data.accessToken,
|
||||
user: action.data.user,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.AUTHENTICATION_FAILURE] = state =>
|
||||
Object.assign({}, state, {
|
||||
authenticationIsPending: false,
|
||||
userIsPending: false,
|
||||
user: null,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_FETCH_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_FETCH_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
userIsPending: true,
|
||||
});
|
||||
|
@ -66,7 +73,7 @@ reducers[ACTIONS.USER_FETCH_SUCCESS] = (state, action) =>
|
|||
emailToVerify: action.data.user.has_verified_email ? null : state.emailToVerify,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_FETCH_FAILURE] = state =>
|
||||
reducers[ACTIONS.USER_FETCH_FAILURE] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
userIsPending: true,
|
||||
user: null,
|
||||
|
@ -88,7 +95,7 @@ reducers[ACTIONS.USER_PHONE_NEW_SUCCESS] = (state, action) =>
|
|||
phoneNewIsPending: false,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PHONE_RESET] = state =>
|
||||
reducers[ACTIONS.USER_PHONE_RESET] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
phoneToVerify: null,
|
||||
});
|
||||
|
@ -99,7 +106,7 @@ reducers[ACTIONS.USER_PHONE_NEW_FAILURE] = (state, action) =>
|
|||
phoneNewErrorMessage: action.data.error,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PHONE_VERIFY_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_PHONE_VERIFY_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
phoneVerifyIsPending: true,
|
||||
phoneVerifyErrorMessage: '',
|
||||
|
@ -118,7 +125,7 @@ reducers[ACTIONS.USER_PHONE_VERIFY_FAILURE] = (state, action) =>
|
|||
phoneVerifyErrorMessage: action.data.error,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
emailNewIsPending: true,
|
||||
emailNewErrorMessage: '',
|
||||
|
@ -136,12 +143,12 @@ reducers[ACTIONS.USER_EMAIL_NEW_SUCCESS] = (state, action) => {
|
|||
});
|
||||
};
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_EXISTS] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_EXISTS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
emailAlreadyExists: true,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_DOES_NOT_EXIST] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_DOES_NOT_EXIST] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
emailDoesNotExist: true,
|
||||
});
|
||||
|
@ -152,7 +159,7 @@ reducers[ACTIONS.USER_EMAIL_NEW_FAILURE] = (state, action) =>
|
|||
emailNewErrorMessage: action.data.error,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_CLEAR_ENTRY] = state => {
|
||||
reducers[ACTIONS.USER_EMAIL_NEW_CLEAR_ENTRY] = (state) => {
|
||||
const newUser = { ...state.user };
|
||||
delete newUser.primary_email;
|
||||
|
||||
|
@ -166,7 +173,7 @@ reducers[ACTIONS.USER_EMAIL_NEW_CLEAR_ENTRY] = state => {
|
|||
});
|
||||
};
|
||||
|
||||
reducers[ACTIONS.USER_PASSWORD_SET_CLEAR] = state =>
|
||||
reducers[ACTIONS.USER_PASSWORD_SET_CLEAR] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
passwordResetSuccess: false,
|
||||
passwordResetPending: false,
|
||||
|
@ -175,7 +182,7 @@ reducers[ACTIONS.USER_PASSWORD_SET_CLEAR] = state =>
|
|||
passwordSetSuccess: false,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
emailVerifyIsPending: true,
|
||||
emailVerifyErrorMessage: '',
|
||||
|
@ -202,7 +209,7 @@ reducers[ACTIONS.USER_EMAIL_VERIFY_SET] = (state, action) =>
|
|||
emailToVerify: action.data.email,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_IDENTITY_VERIFY_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_IDENTITY_VERIFY_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
identityVerifyIsPending: true,
|
||||
identityVerifyErrorMessage: '',
|
||||
|
@ -229,7 +236,7 @@ reducers[ACTIONS.FETCH_ACCESS_TOKEN_SUCCESS] = (state, action) => {
|
|||
});
|
||||
};
|
||||
|
||||
reducers[ACTIONS.USER_INVITE_STATUS_FETCH_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_INVITE_STATUS_FETCH_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
inviteStatusIsPending: true,
|
||||
});
|
||||
|
@ -243,13 +250,13 @@ reducers[ACTIONS.USER_INVITE_STATUS_FETCH_SUCCESS] = (state, action) =>
|
|||
referralCode: action.data.referralCode,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_INVITE_NEW_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_INVITE_NEW_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
inviteNewIsPending: true,
|
||||
inviteNewErrorMessage: '',
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_INVITE_NEW_SUCCESS] = state =>
|
||||
reducers[ACTIONS.USER_INVITE_NEW_SUCCESS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
inviteNewIsPending: false,
|
||||
inviteNewErrorMessage: '',
|
||||
|
@ -261,14 +268,14 @@ reducers[ACTIONS.USER_INVITE_NEW_FAILURE] = (state, action) =>
|
|||
inviteNewErrorMessage: action.data.error.message,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_INVITE_STATUS_FETCH_FAILURE] = state =>
|
||||
reducers[ACTIONS.USER_INVITE_STATUS_FETCH_FAILURE] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
inviteStatusIsPending: false,
|
||||
invitesRemaining: null,
|
||||
invitees: null,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_YOUTUBE_IMPORT_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_YOUTUBE_IMPORT_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
youtubeChannelImportPending: true,
|
||||
youtubeChannelImportErrorMessage: '',
|
||||
|
@ -293,28 +300,28 @@ reducers[ACTIONS.USER_YOUTUBE_IMPORT_FAILURE] = (state, action) =>
|
|||
youtubeChannelImportErrorMessage: action.data,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_RETRY_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_RETRY_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
resendingVerificationEmail: true,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_RETRY_SUCCESS] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_RETRY_SUCCESS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
resendingVerificationEmail: false,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_RETRY_FAILURE] = state =>
|
||||
reducers[ACTIONS.USER_EMAIL_VERIFY_RETRY_FAILURE] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
resendingVerificationEmail: false,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_SET_REFERRER_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_SET_REFERRER_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
referrerSetIsPending: true,
|
||||
referrerSetError: defaultState.referrerSetError,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_SET_REFERRER_SUCCESS] = state =>
|
||||
reducers[ACTIONS.USER_SET_REFERRER_SUCCESS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
referrerSetIsPending: false,
|
||||
referrerSetError: defaultState.referrerSetError,
|
||||
|
@ -326,25 +333,25 @@ reducers[ACTIONS.USER_SET_REFERRER_FAILURE] = (state, action) =>
|
|||
referrerSetError: action.data.error.message,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_SET_REFERRER_RESET] = state =>
|
||||
reducers[ACTIONS.USER_SET_REFERRER_RESET] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
referrerSetIsPending: false,
|
||||
referrerSetError: defaultState.referrerSetError,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PASSWORD_EXISTS] = state =>
|
||||
reducers[ACTIONS.USER_PASSWORD_EXISTS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
passwordExistsForUser: true,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PASSWORD_RESET_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_PASSWORD_RESET_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
passwordResetPending: true,
|
||||
passwordResetSuccess: defaultState.passwordResetSuccess,
|
||||
passwordResetError: null,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PASSWORD_RESET_SUCCESS] = state =>
|
||||
reducers[ACTIONS.USER_PASSWORD_RESET_SUCCESS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
passwordResetPending: false,
|
||||
passwordResetSuccess: true,
|
||||
|
@ -356,13 +363,13 @@ reducers[ACTIONS.USER_PASSWORD_RESET_FAILURE] = (state, action) =>
|
|||
passwordResetError: action.data.error,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PASSWORD_SET_STARTED] = state =>
|
||||
reducers[ACTIONS.USER_PASSWORD_SET_STARTED] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
passwordSetPending: true,
|
||||
passwordSetSuccess: defaultState.passwordSetSuccess,
|
||||
});
|
||||
|
||||
reducers[ACTIONS.USER_PASSWORD_SET_SUCCESS] = state =>
|
||||
reducers[ACTIONS.USER_PASSWORD_SET_SUCCESS] = (state) =>
|
||||
Object.assign({}, state, {
|
||||
passwordSetPending: false,
|
||||
passwordSetSuccess: true,
|
||||
|
|
16
ui/store.js
16
ui/store.js
|
@ -11,7 +11,7 @@ import { routerMiddleware } from 'connected-react-router';
|
|||
import createRootReducer from './reducers';
|
||||
import { Lbry, buildSharedStateMiddleware, ACTIONS as LBRY_REDUX_ACTIONS } from 'lbry-redux';
|
||||
import { doSyncLoop } from 'redux/actions/sync';
|
||||
import { getAuthToken } from 'util/saved-passwords';
|
||||
import { getTokens } from 'util/saved-passwords';
|
||||
import { generateInitialUrl } from 'util/url';
|
||||
import { X_LBRY_AUTH_TOKEN } from 'constants/token';
|
||||
|
||||
|
@ -189,12 +189,14 @@ const sharedStateCb = ({ dispatch, getState }) => {
|
|||
|
||||
const populateAuthTokenHeader = () => {
|
||||
return (next) => (action) => {
|
||||
if (
|
||||
(action.type === ACTIONS.USER_FETCH_SUCCESS || action.type === ACTIONS.AUTHENTICATION_SUCCESS) &&
|
||||
action.data.user.has_verified_email === true
|
||||
) {
|
||||
const authToken = getAuthToken();
|
||||
Lbry.setApiHeader(X_LBRY_AUTH_TOKEN, authToken);
|
||||
if (action.type === ACTIONS.USER_FETCH_SUCCESS || action.type === ACTIONS.AUTHENTICATION_SUCCESS) {
|
||||
if (action.data) {
|
||||
}
|
||||
const tokens = getTokens();
|
||||
// if (tokens.access_token) {
|
||||
// Lbry.setApiHeader('Authorization', 'Bearer ' + tokens.access_token);
|
||||
// }
|
||||
Lbry.setApiHeader(X_LBRY_AUTH_TOKEN, tokens.auth_token);
|
||||
}
|
||||
|
||||
return next(action);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
const { DOMAIN } = require('../../config.js');
|
||||
const { DOMAIN } = require('config.js');
|
||||
const AUTH_TOKEN = 'auth_token';
|
||||
const SAVED_PASSWORD = 'saved_password';
|
||||
const DEPRECATED_SAVED_PASSWORD = 'saved-password';
|
||||
|
@ -59,7 +59,7 @@ function deleteCookie(name) {
|
|||
}
|
||||
|
||||
function setSavedPassword(value, saveToDisk) {
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
const password = value === undefined || value === null ? '' : value;
|
||||
sessionPassword = password;
|
||||
|
||||
|
@ -74,17 +74,17 @@ function setSavedPassword(value, saveToDisk) {
|
|||
}
|
||||
|
||||
function getSavedPassword() {
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
if (sessionPassword) {
|
||||
resolve(sessionPassword);
|
||||
}
|
||||
|
||||
return getPasswordFromCookie().then(p => resolve(p));
|
||||
return getPasswordFromCookie().then((p) => resolve(p));
|
||||
});
|
||||
}
|
||||
|
||||
function getPasswordFromCookie() {
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
let password;
|
||||
password = getCookie(SAVED_PASSWORD);
|
||||
resolve(password);
|
||||
|
@ -92,7 +92,7 @@ function getPasswordFromCookie() {
|
|||
}
|
||||
|
||||
function deleteSavedPassword() {
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
deleteCookie(SAVED_PASSWORD);
|
||||
resolve();
|
||||
});
|
||||
|
@ -102,19 +102,24 @@ function getAuthToken() {
|
|||
return getCookie(AUTH_TOKEN);
|
||||
}
|
||||
|
||||
// will take oidc token getter
|
||||
function getTokens() {
|
||||
return { auth_token: getAuthToken(), access_token: null };
|
||||
}
|
||||
|
||||
function setAuthToken(value) {
|
||||
return setCookie(AUTH_TOKEN, value, 365);
|
||||
}
|
||||
|
||||
function deleteAuthToken() {
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
deleteCookie(AUTH_TOKEN);
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
function doSignOutCleanup() {
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
deleteAuthToken();
|
||||
deleteSavedPassword();
|
||||
resolve();
|
||||
|
@ -122,10 +127,10 @@ function doSignOutCleanup() {
|
|||
}
|
||||
|
||||
function doAuthTokenRefresh() {
|
||||
const authToken = getAuthToken();
|
||||
const { auth_token: authToken } = getAuthToken();
|
||||
if (authToken) {
|
||||
deleteAuthToken();
|
||||
setAuthToken(authToken);
|
||||
setCookie(AUTH_TOKEN, authToken, 365);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -147,6 +152,7 @@ module.exports = {
|
|||
deleteSavedPassword,
|
||||
getAuthToken,
|
||||
setAuthToken,
|
||||
getTokens,
|
||||
deleteAuthToken,
|
||||
doSignOutCleanup,
|
||||
doAuthTokenRefresh,
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
let robots;
|
||||
async function getRobots(ctx) {
|
||||
if (!robots) {
|
||||
robots = fs.readFileSync(path.join(__dirname, '/../dist/public/robots.txt'), 'utf8');
|
||||
}
|
||||
return robots;
|
||||
}
|
||||
|
||||
module.exports = { getRobots };
|
|
@ -10148,9 +10148,9 @@ lbry-redux@lbryio/lbry-redux#32b578707116d45f5b51b7ab523d200e75668676:
|
|||
reselect "^3.0.0"
|
||||
uuid "^8.3.1"
|
||||
|
||||
lbryinc@lbryio/lbryinc#0b4e41ef90d6347819dd3453f2f9398a5c1b4f36:
|
||||
lbryinc@lbryio/lbryinc#c9ced4f226e06f4f188cb8dc31b561e1c27c5266:
|
||||
version "0.0.1"
|
||||
resolved "https://codeload.github.com/lbryio/lbryinc/tar.gz/0b4e41ef90d6347819dd3453f2f9398a5c1b4f36"
|
||||
resolved "https://codeload.github.com/lbryio/lbryinc/tar.gz/c9ced4f226e06f4f188cb8dc31b561e1c27c5266"
|
||||
dependencies:
|
||||
reselect "^3.0.0"
|
||||
|
||||
|
|
Loading…
Reference in a new issue