这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
540c216
change login flow to handle admin secret persistence
Aug 7, 2019
3e80d0d
handle headers init state
Aug 9, 2019
4e416ce
add tooltip for remember-me
Aug 9, 2019
d3a6869
remove log, make label clickable
Aug 21, 2019
506cc22
fix a closure scope bug
Aug 22, 2019
7312c33
handle login verification at route level
Aug 22, 2019
7fd8eb8
update Login.js
rikinsk Aug 26, 2019
cc22c8c
Merge branch 'master' into issue-250-internal
rikinsk Aug 26, 2019
cc455d1
Merge branch 'master' into issue-250-internal
rikinsk Aug 28, 2019
5a01ac5
refactor
rikinsk Aug 29, 2019
ac6339c
Merge branch 'master' into issue-250-internal
rikinsk Aug 29, 2019
f217598
remove extra file
rikinsk Aug 29, 2019
314e186
refactor
rikinsk Aug 29, 2019
8d0c26e
Merge branch 'master' into issue-250-internal
rikinsk Sep 9, 2019
753f91f
add id to tooltips
rikinsk Sep 9, 2019
e5c346a
remove adminsecretlabel + update admin secret storage flow
rikinsk Sep 9, 2019
6f2b32b
fix heartIcon close handling
rikinsk Sep 10, 2019
70696df
.
rikinsk Sep 10, 2019
c095b9b
Merge branch 'master' into issue-250-internal
rikinsk Sep 17, 2019
7ccfd1f
Merge branch 'master' into issue-250-internal
rikinsk Sep 20, 2019
0ce1f95
fix admin secret setting
rikinsk Sep 20, 2019
164af21
fix urlPrefix
rikinsk Sep 20, 2019
e79b44d
Merge branch 'master' into issue-250-internal
rikinsk Sep 20, 2019
b3b6b06
add admin secret header if not present
rikinsk Sep 21, 2019
890e4da
update jwt analyzer icon
rikinsk Sep 23, 2019
a70427d
Merge branch 'master' into issue-250-internal
rikinsk Sep 24, 2019
6806028
persist if admin secret header has already been added
rikinsk Sep 24, 2019
84ee322
set cli console mode as constant
rikinsk Sep 25, 2019
538ed26
handle CLI admin secret errors
rikinsk Sep 25, 2019
2a462f5
make separate logout page
rikinsk Sep 25, 2019
77c0538
Merge branch 'master' into issue-250-internal
rikinsk Sep 25, 2019
be88baa
fix typos
rikinsk Sep 25, 2019
94ac7c3
fix typos
rikinsk Sep 25, 2019
fd437bc
fix typos
rikinsk Sep 25, 2019
9a2b64a
fix typos
rikinsk Sep 25, 2019
d0b3fd9
fix cli error
rikinsk Sep 25, 2019
05e16df
fix login page path
rikinsk Sep 25, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion console/cypress/helpers/dataHelpers.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ADMIN_SECRET_HEADER_KEY } from '../../src/constants';

export const baseUrl = Cypress.config('baseUrl');
export const dataTypes = [
'serial',
Expand Down Expand Up @@ -41,7 +43,7 @@ export const makeDataAPIOptions = (dataApiUrl, key, body) => ({
method: 'POST',
url: makeDataAPIUrl(dataApiUrl),
headers: {
'x-hasura-admin-secret': key,
[ADMIN_SECRET_HEADER_KEY]: key,
},
body,
failOnStatusCode: false,
Expand Down
4 changes: 3 additions & 1 deletion console/cypress/helpers/eventHelpers.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ADMIN_SECRET_HEADER_KEY } from '../../src/constants';

export const baseUrl = Cypress.config('baseUrl');
export const queryTypes = ['insert', 'update', 'delete'];
export const getTriggerName = (i, testName = '') =>
Expand All @@ -14,7 +16,7 @@ export const makeDataAPIOptions = (dataApiUrl, key, body) => ({
method: 'POST',
url: makeDataAPIUrl(dataApiUrl),
headers: {
'x-hasura-admin-secret': key,
[ADMIN_SECRET_HEADER_KEY]: key,
},
body,
failOnStatusCode: false,
Expand Down
4 changes: 3 additions & 1 deletion console/cypress/helpers/remoteSchemaHelpers.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ADMIN_SECRET_HEADER_KEY } from '../../src/constants';

export const baseUrl = Cypress.config('baseUrl');
export const getRemoteSchemaName = (i, schemaName) =>
`test-remote-schema-${schemaName}-${i}`;
Expand All @@ -14,7 +16,7 @@ export const makeDataAPIOptions = (dataApiUrl, key, body) => ({
method: 'POST',
url: makeDataAPIUrl(dataApiUrl),
headers: {
'x-hasura-admin-secret': key,
[ADMIN_SECRET_HEADER_KEY]: key,
},
body,
failOnStatusCode: false,
Expand Down
99 changes: 28 additions & 71 deletions console/src/Globals.js
Original file line number Diff line number Diff line change
@@ -1,107 +1,64 @@
import { SERVER_CONSOLE_MODE } from './constants';
import { getFeaturesCompatibility } from './helpers/versionUtils';
import { stripTrailingSlash } from './components/Common/utils/urlUtils';

/* helper tools to format explain json */
/* set helper tools into window */

/* eslint-disable */
import sqlFormatter from './helpers/sql-formatter.min';
import hljs from './helpers/highlight.min';
import { getFeaturesCompatibility } from './helpers/versionUtils';
/* eslint-enable */

/* */
if (
window &&
typeof window === 'object' &&
!window.sqlFormatter &&
!window.hljs
) {
window.sqlFormatter = sqlFormatter;
window.hljs = hljs;
}

const checkExtraSlashes = url => {
if (!url) {
return url;
}
if (url[url.length - 1] === '/') {
return url.slice(0, url.length - 1);
}
return url;
};
/* initialize globals */

const globals = {
apiHost: window.__env.apiHost,
apiPort: window.__env.apiPort,
dataApiUrl: checkExtraSlashes(window.__env.dataApiUrl),
dataApiUrl: stripTrailingSlash(window.__env.dataApiUrl),
devDataApiUrl: window.__env.devDataApiUrl,
nodeEnv: window.__env.nodeEnv,
adminSecret: window.__env.adminSecret || window.__env.accessKey,
isAdminSecretSet:
window.__env.isAdminSecretSet || window.__env.isAccessKeySet,
adminSecretLabel:
window.__env.isAdminSecretSet !== undefined ||
window.__env.adminSecret !== undefined
? 'admin-secret'
: 'access-key',
consoleMode:
window.__env.consoleMode === 'hasuradb'
? 'server'
: window.__env.consoleMode,
urlPrefix: checkExtraSlashes(window.__env.urlPrefix),
adminSecret: window.__env.adminSecret || null, // will be updated after login/logout
isAdminSecretSet: window.__env.isAdminSecretSet || false,
consoleMode: window.__env.consoleMode || SERVER_CONSOLE_MODE,
urlPrefix: stripTrailingSlash(window.__env.urlPrefix) || '',
enableTelemetry: window.__env.enableTelemetry,
telemetryTopic:
window.__env.nodeEnv !== 'development' ? 'console' : 'console_test',
assetsPath: window.__env.assetsPath,
serverVersion: window.__env.serverVersion,
consoleAssetVersion: CONSOLE_ASSET_VERSION,
consoleAssetVersion: CONSOLE_ASSET_VERSION, // set during console build
featuresCompatibility: window.__env.serverVersion
? getFeaturesCompatibility(window.__env.serverVersion)
: null,
};

// set defaults
if (!window.__env.urlPrefix) {
globals.urlPrefix = '/';
}

if (!window.__env.consoleMode) {
globals.consoleMode = SERVER_CONSOLE_MODE;
}

if (!globals.adminSecret) {
globals.adminSecret = null;
}

if (globals.isAdminSecretSet === undefined) {
globals.isAdminSecretSet = false;
}

if (
window &&
typeof window === 'object' &&
!window.sqlFormatter &&
!window.hljs
) {
window.sqlFormatter = sqlFormatter;
window.hljs = hljs;
}

if (globals.consoleMode === SERVER_CONSOLE_MODE) {
if (globals.nodeEnv !== 'development') {
if (window.__env.consolePath) {
const safeCurrentUrl = checkExtraSlashes(window.location.href);
globals.dataApiUrl = safeCurrentUrl.slice(
const consolePath = window.__env.consolePath;
if (consolePath) {
const currentUrl = stripTrailingSlash(window.location.href);
globals.dataApiUrl = currentUrl.slice(
0,
safeCurrentUrl.lastIndexOf(window.__env.consolePath)
currentUrl.lastIndexOf(consolePath)
);
const currentPath = checkExtraSlashes(window.location.pathname);

const currentPath = stripTrailingSlash(window.location.pathname);
globals.urlPrefix =
currentPath.slice(
0,
currentPath.lastIndexOf(window.__env.consolePath)
) + '/console';
currentPath.slice(0, currentPath.lastIndexOf(consolePath)) + '/console';
} else {
const windowUrl = window.location.protocol + '//' + window.location.host;

globals.dataApiUrl = windowUrl;
}
}
/*
* Require the exact usecase
if (globals.nodeEnv === 'development') {
globals.dataApiUrl = globals.devDataApiUrl;
}
*/
}

export default globals;
7 changes: 3 additions & 4 deletions console/src/components/AppState.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import globals from 'Globals';

const stateKey = 'CONSOLE_LOCAL_INFO:' + globals.dataApiUrl;
const CONSOLE_ADMIN_SECRET =
globals.adminSecretLabel === 'admin-secret'
? 'CONSOLE_ADMIN_SECRET'
: 'CONSOLE_ACCESS_KEY';
const CONSOLE_ADMIN_SECRET = 'CONSOLE_ADMIN_SECRET';

const loadAppState = () => JSON.parse(window.localStorage.getItem(stateKey));

Expand All @@ -21,6 +18,8 @@ const saveAdminSecretState = state => {

const clearAdminSecretState = () => {
window.localStorage.removeItem(CONSOLE_ADMIN_SECRET);

globals.adminSecret = null;
};

const clearState = () => window.localStorage.removeItem(stateKey);
Expand Down
4 changes: 4 additions & 0 deletions console/src/components/Common/Common.scss
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,10 @@ input {
margin: 0 !important;
}

.remove_margin_top {
margin-top: 0 !important;
}

.display_inline {
display: inline-block;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const WarningSymbol = ({
tooltipPlacement = 'right',
customStyle = null,
}) => {
const tooltip = <Tooltip>{tooltipText}</Tooltip>;
const tooltip = <Tooltip id={tooltipText}>{tooltipText}</Tooltip>;

return (
<div className={styles.display_inline}>
Expand Down
8 changes: 8 additions & 0 deletions console/src/components/Common/utils/urlUtils.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
export const getPathRoot = path => {
return path.split('/')[1];
};

export const stripTrailingSlash = url => {
if (url && url.endsWith('/')) {
return url.slice(0, -1);
}

return url;
};
2 changes: 1 addition & 1 deletion console/src/components/Error/ErrorBoundary.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
loadInconsistentObjects,
redirectToMetadataStatus,
isMetadataStatusPage,
} from '../Services/Metadata/Actions';
} from '../Services/Settings/Actions';
import Spinner from '../Common/Spinner/Spinner';

import PageNotFound, { NotFoundError } from './PageNotFound';
Expand Down
67 changes: 67 additions & 0 deletions console/src/components/Login/Actions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import Endpoints, { globalCookiePolicy } from '../../Endpoints';
import { UPDATE_DATA_HEADERS } from '../Services/Data/DataActions';
import { saveAdminSecretState } from '../AppState';
import { ADMIN_SECRET_HEADER_KEY, CLI_CONSOLE_MODE } from '../../constants';
import requestAction from '../../utils/requestAction';
import globals from '../../Globals';

export const verifyLogin = ({
adminSecret,
shouldPersist,
successCallback,
errorCallback,
dispatch,
}) => {
const url = Endpoints.getSchema;
const requestOptions = {
credentials: globalCookiePolicy,
method: 'POST',
headers: {
[ADMIN_SECRET_HEADER_KEY]: adminSecret,
'content-type': 'application/json',
},
body: JSON.stringify({
type: 'select',
args: {
table: {
name: 'hdb_table',
schema: 'hdb_catalog',
},
columns: ['table_schema'],
where: { table_schema: 'public' },
limit: 1,
},
}),
};

dispatch(requestAction(url, requestOptions)).then(
() => {
if (adminSecret) {
if (globals.consoleMode !== CLI_CONSOLE_MODE) {
// set admin secret to local storage
if (shouldPersist) {
saveAdminSecretState(adminSecret);
}

// set admin secret in globals
globals.adminSecret = adminSecret;
}

// set data headers in redux
dispatch({
type: UPDATE_DATA_HEADERS,
data: {
'content-type': 'application/json',
[ADMIN_SECRET_HEADER_KEY]: adminSecret,
},
});
}
if (successCallback) {
successCallback();
}
},
error => {
errorCallback(error);
}
);
};
Loading