From f2d31155551a3397f9bbe162bd25b75f611d2cd0 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Wed, 6 Feb 2019 17:18:02 +0530
Subject: [PATCH 01/18] update docs
---
docs/graphql/manual/auth/basics.rst | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/docs/graphql/manual/auth/basics.rst b/docs/graphql/manual/auth/basics.rst
index 18af232a31bfd..6e4e2931d5d07 100644
--- a/docs/graphql/manual/auth/basics.rst
+++ b/docs/graphql/manual/auth/basics.rst
@@ -106,7 +106,10 @@ You can notice above how the same query now only includes the right slice of dat
]
}
- This rule reads as: allow selecting an article if it was published after "31-12-2018" and its author is the current user.
+ This rule reads as: allow selecting an article if it was published after "31-12-2018" and its author is the current
+ user.
+
+ **Note:** The operators ``_has_keys_all`` and ``_has_keys_any`` are currently not supported in permission rules
.. _restrict_columns:
From fbd4436838c63c04d9239adfc3261c17abaa65c8 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 03:20:37 +0530
Subject: [PATCH 02/18] update console permission builder
---
.../PermissionBuilder/PermissionBuilder.js | 258 ++++++++++++------
.../PermissionBuilder/utils.js | 180 +++++++++---
.../Data/TablePermissions/Permissions.js | 9 +-
3 files changed, 316 insertions(+), 131 deletions(-)
diff --git a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/PermissionBuilder.js b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/PermissionBuilder.js
index f513b38084062..111b77189680a 100644
--- a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/PermissionBuilder.js
+++ b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/PermissionBuilder.js
@@ -11,14 +11,21 @@ import {
getTableRelationship,
getTableDef,
getTableSchema,
+ getColumnType,
+ isJsonString,
getAllJsonPaths,
isNotOperator,
isAndOrOperator,
isColumnOperator,
- isBoolColumnOperator,
- isArrayColumnOperator,
+ isBoolTypeColumnOperator,
+ isArrayTypeColumnOperator,
+ isJsonTypeColumnOperator,
boolOperators,
- columnOperators,
+ genericOperators,
+ textColumnOperators,
+ jsonColumnOperators,
+ topologyColumnOperators,
+ PGTypes
} from './utils';
import QueryBuilderJson from '../../../../QueryBuilderJson/QueryBuilderJson';
@@ -41,6 +48,8 @@ class PermissionBuilder extends React.Component {
}
componentDidUpdate(prevProps) {
+ // check for and fetch any missing schemas if
+ // either permission filter or available table schemas have changed
if (
this.props.filter !== prevProps.filter ||
this.props.allTableSchemas.length !== prevProps.allTableSchemas.length
@@ -71,7 +80,7 @@ class PermissionBuilder extends React.Component {
} else if (isNotOperator(operator)) {
const newPath = pathSplit.slice(1).join('.');
_missingSchemas = findMissingSchemas(newPath, currTable);
- } else if (isColumnOperator(operator) || isArrayColumnOperator(operator)) {
+ } else if (isColumnOperator(operator)) {
// no missing schemas
} else {
const { allTableSchemas } = this.props;
@@ -127,6 +136,8 @@ class PermissionBuilder extends React.Component {
);
};
+ /********************************/
+
const getFilter = (conditions, prefix, value = '') => {
let _where = {};
@@ -195,7 +206,7 @@ class PermissionBuilder extends React.Component {
const position = parseInt(opPrefixSplit[0], 10);
_filter[operator] = opConditions || [];
- if (opValue) {
+ if (opValue !== '') {
_filter[operator][position] = opValue;
} else {
_filter[operator].splice(position, 1);
@@ -240,7 +251,7 @@ class PermissionBuilder extends React.Component {
const opConditions = isLast ? null : conditions[operator];
- if (operator === '--') {
+ if (operator === '') {
// blank where
} else if (isAndOrOperator(operator)) {
_where = getAndOrOperatorFilter(
@@ -258,7 +269,7 @@ class PermissionBuilder extends React.Component {
newPrefix,
isLast
);
- } else if (isArrayColumnOperator(operator)) {
+ } else if (isArrayTypeColumnOperator(operator)) {
_where = getArrayColumnOperatorFilter(
operator,
value,
@@ -294,43 +305,34 @@ class PermissionBuilder extends React.Component {
dispatch(dispatchFuncSetFilter(JSON.stringify(newFilter)));
};
- const renderBoolSelect = (dispatchFunc, value) => {
- const boolDispatchFunc = val => {
- let boolVal = '';
- if (val === 'true') {
- boolVal = true;
- } else if (val === 'false') {
- boolVal = false;
- }
-
- dispatchFunc(boolVal);
- };
+ /********************************/
- let selectValue = '';
- if (value === true) {
- selectValue = 'true';
- } else if (value === false) {
- selectValue = 'false';
- }
+ const renderBoolSelect = (
+ selectDispatchFunc,
+ value,
+ prefix = '',
+ disabledValues = []
+ ) => {
+ const _value = (typeof value === 'boolean') ? value.toString() : '';
- const selectValues = ['true', 'false'];
+ const values = ['true', 'false'];
- return renderSelect(boolDispatchFunc, selectValue, selectValues);
+ return renderSelect(selectDispatchFunc, _value, values, prefix, disabledValues);
};
const renderSelect = (
- dispatchFunc,
+ selectDispatchFunc,
value,
values,
prefix = '',
disabledValues = []
) => {
const dispatchSelect = e => {
- dispatchFunc(e.target.value);
+ selectDispatchFunc(e.target.value);
};
const _selectOptions = [];
- ['--'].concat(values).forEach((val, i) => {
+ [''].concat(values).forEach((val, i) => {
const optionVal = addToPrefix(prefix, val);
_selectOptions.push(
- {val}
+ {val || '--'}
);
});
- const selectedValue = addToPrefix(prefix, value || '--');
+ const selectedValue = addToPrefix(prefix, value);
return (
{
+ const renderInput = (inputDispatchFunc, value) => {
const dispatchInput = e => {
- dispatchFunc({ prefix: prefix, value: e.target.value });
+ inputDispatchFunc(e.target.value);
};
- const dispatchSuggestion = () => {
- dispatchFunc({ prefix: prefix, value: 'X-HASURA-USER-ID' });
- };
+ let _value = value;
+
+ if (typeof value === 'object') {
+ _value = JSON.stringify(value);
+ }
- const input = wrapDoubleQuotes(
+ return (
);
+ };
+
+ const renderSuggestion = (suggestionDispatchFunc, inputValue, displayValue = null) => {
+ const dispatchSuggestion = () => {
+ suggestionDispatchFunc(inputValue);
+ };
- const suggestion = (
+ return (
- [X-Hasura-User-Id]
+ [{ displayValue || inputValue }]
);
+ };
+
+ /********************************/
+
+ const renderValue = (dispatchFunc, value, prefix, valueType) => {
+ const dispatchInput = val => {
+ let _val = val;
+
+ if (val !== '') {
+ if (PGTypes.boolean.includes(valueType)) {
+ _val = (val === 'true');
+ } else if (PGTypes.numeric.includes(valueType) && !isNaN(val) && val.substr(-1) !== '.') {
+ _val = Number(val);
+ } else if ((PGTypes.json.includes(valueType) || PGTypes.postgis.includes(valueType)) && isJsonString(val)) {
+ _val = JSON.parse(val);
+ }
+ }
+
+ dispatchFunc({ prefix: prefix, value: _val });
+ };
+
+ const inputBox = () => {
+ return renderInput(dispatchInput, value);
+ };
+
+ const sessionVariableSuggestion = () => {
+ return renderSuggestion(dispatchInput, 'X-Hasura-User-Id');
+ };
+
+ const jsonSuggestion = () => {
+ return renderSuggestion(dispatchInput, '{}', 'JSON');
+ };
+
+ let input;
+ let suggestion;
+
+ if (PGTypes.boolean.includes(valueType)) {
+ input = renderBoolSelect(dispatchInput, value);
+ } else if (PGTypes.json.includes(valueType) || PGTypes.postgis.includes(valueType)) {
+ input = inputBox();
+ suggestion = jsonSuggestion();
+ } else {
+ input = wrapDoubleQuotes(inputBox());
+ suggestion = sessionVariableSuggestion();
+ }
return (
@@ -393,10 +448,10 @@ class PermissionBuilder extends React.Component {
);
};
- const renderInputArray = (dispatchFunc, values, prefix) => {
+ const renderValueArray = (dispatchFunc, values, prefix, valueType) => {
const _inputArray = [];
(values || []).concat(['']).map((val, i) => {
- const input = renderInput(dispatchFunc, val, addToPrefix(prefix, i));
+ const input = renderValue(dispatchFunc, val, addToPrefix(prefix, i), valueType);
_inputArray.push(input);
});
@@ -410,54 +465,72 @@ class PermissionBuilder extends React.Component {
);
};
- const renderOperatorExp = (dispatchFunc, condition, prefix) => {
- const dispatchColumnOperator = val => {
+ const renderOperatorExp = (dispatchFunc, expression, prefix, valueType) => {
+ const dispatchColumnOperatorSelect = val => {
dispatchFunc({ prefix: val });
};
- let _condition = condition;
- if (typeof _condition === 'string') {
- _condition = { $eq: _condition };
+ // let _expression = expression;
+ // if (typeof _expression === 'string') {
+ // _expression = { $eq: _expression };
+ // }
+
+ const operator = Object.keys(expression)[0];
+ const operationValue = expression[operator];
+
+ let operators;
+ if (PGTypes.character.includes(valueType)) {
+ operators = textColumnOperators;
+ } else if (PGTypes.json.includes(valueType)) {
+ operators = jsonColumnOperators;
+ } else if (PGTypes.postgis.includes(valueType)) {
+ operators = topologyColumnOperators;
+ } else {
+ operators = genericOperators;
}
- const operator = Object.keys(_condition)[0];
- const operationValue = _condition[operator];
-
- const operatorSelect = renderSelect(
- dispatchColumnOperator,
+ const _operatorSelect = renderSelect(
+ dispatchColumnOperatorSelect,
operator,
- columnOperators,
+ operators,
prefix
);
- let valueInput = '';
+ let _valueInput = '';
if (operator) {
- if (isArrayColumnOperator(operator)) {
- valueInput = renderInputArray(
+ if (isArrayTypeColumnOperator(operator)) {
+ _valueInput = renderValueArray(
+ dispatchFunc,
+ operationValue,
+ addToPrefix(prefix, operator),
+ valueType
+ );
+ } else if (isBoolTypeColumnOperator(operator)) {
+ _valueInput = renderValue(
dispatchFunc,
operationValue,
- addToPrefix(prefix, operator)
+ addToPrefix(prefix, operator),
+ 'boolean'
);
- } else if (isBoolColumnOperator(operator)) {
- const boolOperatorDispatchFunc = val => {
- dispatchFunc({ prefix: addToPrefix(prefix, operator), value: val });
- };
-
- valueInput = renderBoolSelect(
- boolOperatorDispatchFunc,
- operationValue
+ } else if (isJsonTypeColumnOperator(operator)) {
+ _valueInput = renderValue(
+ dispatchFunc,
+ operationValue,
+ addToPrefix(prefix, operator),
+ 'jsonb'
);
} else {
// normal column operator
- valueInput = renderInput(
+ _valueInput = renderValue(
dispatchFunc,
operationValue,
- addToPrefix(prefix, operator)
+ addToPrefix(prefix, operator),
+ valueType
);
}
}
- const _operatorExp = [{ key: operatorSelect, value: valueInput }];
+ const _operatorExp = [{ key: _operatorSelect, value: _valueInput }];
const unselectedElements = [];
if (!operator) {
@@ -475,7 +548,7 @@ class PermissionBuilder extends React.Component {
const renderColumnExp = (
dispatchFunc,
column,
- condition,
+ expression,
table,
tableSchemas,
prefix
@@ -494,13 +567,15 @@ class PermissionBuilder extends React.Component {
_columnExp = renderBoolExp(
dispatchFunc,
- condition,
+ expression,
refTable,
tableSchemas,
prefix
); // eslint-disable-line no-use-before-define
} else {
- _columnExp = renderOperatorExp(dispatchFunc, condition, prefix);
+ const columnType = getColumnType(column, tableSchema);
+
+ _columnExp = renderOperatorExp(dispatchFunc, expression, prefix, columnType);
}
return _columnExp;
@@ -508,17 +583,17 @@ class PermissionBuilder extends React.Component {
const renderBoolExpArray = (
dispatchFunc,
- conditions,
+ expressions,
table,
tableSchemas,
prefix
) => {
const _boolExpArray = [];
- conditions.concat([{}]).forEach((condition, i) => {
+ expressions.concat([{}]).forEach((expression, i) => {
const _boolExp = renderBoolExp(
dispatchFunc,
- condition,
+ expression,
table,
tableSchemas,
addToPrefix(prefix, i)
@@ -526,7 +601,7 @@ class PermissionBuilder extends React.Component {
_boolExpArray.push(_boolExp);
});
- const unselectedElements = [conditions.length];
+ const unselectedElements = [expressions.length];
return (
{
- const dispatchOperation = val => {
+ const dispatchOperationSelect = val => {
dispatchFunc({ prefix: val });
};
let operation = null;
- if (condition) {
- operation = Object.keys(condition)[0];
+ if (expression) {
+ operation = Object.keys(expression)[0];
}
let tableColumns = [];
@@ -561,44 +636,43 @@ class PermissionBuilder extends React.Component {
}
const columnOptions = tableColumns.concat(tableRelationships);
- const operationOptions = Object.values(boolOperators);
const operatorOptions = columnOptions
.concat(['---'])
- .concat(operationOptions);
+ .concat(boolOperators);
- const boolExpKey = renderSelect(
- dispatchOperation,
+ const _boolExpKey = renderSelect(
+ dispatchOperationSelect,
operation,
operatorOptions,
prefix,
['---']
);
- let boolExpValue = null;
+ let _boolExpValue = null;
if (operation) {
const newPrefix = addToPrefix(prefix, operation);
if (isAndOrOperator(operation)) {
- boolExpValue = renderBoolExpArray(
+ _boolExpValue = renderBoolExpArray(
dispatchFunc,
- condition[operation],
+ expression[operation],
table,
tableSchemas,
newPrefix
);
} else if (isNotOperator(operation)) {
- boolExpValue = renderBoolExp(
+ _boolExpValue = renderBoolExp(
dispatchFunc,
- condition[operation],
+ expression[operation],
table,
tableSchemas,
newPrefix
);
} else {
- boolExpValue = renderColumnExp(
+ _boolExpValue = renderColumnExp(
dispatchFunc,
operation,
- condition[operation],
+ expression[operation],
table,
tableSchemas,
newPrefix
@@ -606,7 +680,7 @@ class PermissionBuilder extends React.Component {
}
}
- const _boolExp = [{ key: boolExpKey, value: boolExpValue }];
+ const _boolExp = [{ key: _boolExpKey, value: _boolExpValue }];
const unselectedElements = [];
if (!operation) {
@@ -621,6 +695,8 @@ class PermissionBuilder extends React.Component {
);
};
+ /********************************/
+
const showPermissionBuilder = () => {
const { tableName, schemaName, filter, allTableSchemas } = this.props;
diff --git a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
index a544d811be3bc..56ae3e67dad15 100644
--- a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
+++ b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
@@ -1,10 +1,54 @@
-export const boolOperators = {
- and: '_and',
- not: '_not',
- or: '_or',
+/* Constants */
+
+export const PGTypes = {
+ boolean: [
+ 'boolean'
+ ],
+ uuid: [
+ 'uuid'
+ ],
+ numeric: [
+ 'smallint',
+ 'integer',
+ 'bigint',
+ 'decimal',
+ 'numeric',
+ 'real',
+ 'double precision',
+ ],
+ character: [
+ 'character',
+ 'character varying',
+ 'text'
+ ],
+ dateTime: [
+ 'timestamp',
+ 'timestamp with time zone',
+ 'date',
+ 'time',
+ 'time with time zone',
+ 'interval'
+ ],
+ json: [
+ 'json',
+ 'jsonb'
+ ],
+ postgis: [
+ 'geometry',
+ 'geography'
+ ]
};
-export const columnOperators = [
+export const notBoolOperators = [
+ '_not'
+];
+
+export const andOrBoolOperators = [
+ '_and',
+ '_or'
+];
+
+export const genericSimpleColumnOperators = [
'_eq',
'_ne',
'_in',
@@ -12,55 +56,93 @@ export const columnOperators = [
'_gt',
'_lt',
'_gte',
- '_lte',
+ '_lte'
+];
+
+export const genericArrayColumnOperators = [
+ '_in',
+ '_nin'
+];
+
+export const genericBoolColumnOperators = [
+ '_is_null'
+];
+
+export const textOnlyColumnOperators = [
'_like',
'_nlike',
+ '_ilike',
+ '_nilike',
'_similar',
'_nsimilar',
- '_is_null',
];
-export const arrayColumnOperators = ['_in', '_nin'];
-
-export const boolColumnOperators = ['_is_null'];
-
-export const legacyOperatorsMap = {
- $and: '_and',
- $or: '_or',
- $not: '_not',
- $eq: '_eq',
- $ne: '_ne',
- $in: '_in',
- $nin: '_nin',
- $gt: '_gt',
- $lt: '_lt',
- $gte: '_gte',
- $lte: '_lte',
- $like: '_like',
- $nlike: '_nlike',
- $similar: '_similar',
- $nsimilar: '_nsimilar',
- $is_null: '_is_null',
-};
+export const jsonColumnOperators = [
+ '_contains',
+ '_contained_in'
+];
+
+export const topologyColumnOperators = [
+ '_st_contains',
+ '_st_crosses',
+ '_st_equals',
+ '_st_intersects',
+ '_st_overlaps',
+ '_st_touches',
+ '_st_within',
+ '_st_d_within'
+];
+
+export const boolOperators = notBoolOperators
+ .concat(andOrBoolOperators);
+
+export const columnOperators = genericSimpleColumnOperators
+ .concat(genericArrayColumnOperators)
+ .concat(genericBoolColumnOperators)
+ .concat(textOnlyColumnOperators)
+ .concat(jsonColumnOperators)
+ .concat(topologyColumnOperators);
+
+export const genericOperators = genericSimpleColumnOperators
+ .concat(genericArrayColumnOperators)
+ .concat(genericBoolColumnOperators);
+
+export const textColumnOperators = genericOperators
+ .concat(textOnlyColumnOperators);
+
+export const allOperators = boolOperators
+ .concat(columnOperators);
+
+/* Util functions */
export function isNotOperator(value) {
- return value === boolOperators.not;
+ return notBoolOperators.includes(value);
}
export function isAndOrOperator(value) {
- return value === boolOperators.or || value === boolOperators.and;
+ return andOrBoolOperators.includes(value);
}
-export function isArrayColumnOperator(value) {
- return arrayColumnOperators.indexOf(value) !== -1;
+export function isArrayTypeColumnOperator(value) {
+ return genericArrayColumnOperators.includes(value);
}
-export function isBoolColumnOperator(value) {
- return boolColumnOperators.indexOf(value) !== -1;
+export function isBoolTypeColumnOperator(value) {
+ return genericBoolColumnOperators.includes(value);
+}
+
+export function isJsonTypeColumnOperator(value) {
+ return jsonColumnOperators
+ .concat(topologyColumnOperators)
+ .includes(value);
}
export function isColumnOperator(value) {
- return columnOperators.indexOf(value) !== -1;
+ return columnOperators.includes(value);
+}
+
+export function getLegacyOperator(operator) {
+ return operator.replace('_', '$');
}
export function addToPrefix(prefix, value) {
@@ -156,6 +238,32 @@ export function getRefTable(rel, tableSchema) {
return _refTable;
}
+export function getColumnType(columnName, tableSchema) {
+ let _columnType = '';
+
+ if (!tableSchema || !columnName) {
+ return _columnType;
+ }
+
+ const columnSchema = tableSchema.columns.find(_columnSchema => (_columnSchema.column_name === columnName));
+
+ if (columnSchema) {
+ _columnType = columnSchema.data_type;
+ }
+
+ return _columnType;
+}
+
+export function isJsonString(str) {
+ try {
+ JSON.parse(str);
+ } catch (e) {
+ return false;
+ }
+
+ return true;
+}
+
export function getAllJsonPaths(json, prefix = '') {
const _paths = [];
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 56785e67b87b6..8ca9453eaef64 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -42,7 +42,7 @@ import TableHeader from '../TableCommon/TableHeader';
import ViewHeader from '../TableBrowseRows/ViewHeader';
import { setTable, fetchViewInfoFromInformationSchema } from '../DataActions';
import { getIngForm, escapeRegExp } from '../utils';
-import { legacyOperatorsMap } from './PermissionBuilder/utils';
+import { allOperators, getLegacyOperator } from './PermissionBuilder/utils';
import semverCheck from '../../../../helpers/semver';
import Button from '../../Layout/Button/Button';
@@ -1337,9 +1337,10 @@ class Permissions extends Component {
}
// replace legacy operator values
- Object.keys(legacyOperatorsMap).forEach(legacyOperator => {
- const legacyString = '"' + legacyOperator + '"';
- const currentString = '"' + legacyOperatorsMap[legacyOperator] + '"';
+ allOperators.forEach(operator => {
+ const currentString = '"' + operator + '"';
+ const legacyString = '"' + getLegacyOperator(operator) + '"';
+
filterString = filterString.replace(
new RegExp(escapeRegExp(legacyString), 'g'),
currentString
From 2fe38f84bc72af5434fd0b07f2383a21a499a4a4 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 16:16:42 +0530
Subject: [PATCH 03/18] fix postgis type in console permissions
---
.../Services/Data/TablePermissions/PermissionBuilder/utils.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
index 56ae3e67dad15..183c0ed9900fa 100644
--- a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
+++ b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
@@ -249,6 +249,10 @@ export function getColumnType(columnName, tableSchema) {
if (columnSchema) {
_columnType = columnSchema.data_type;
+
+ if (_columnType === 'USER-DEFINED') {
+ _columnType = columnSchema.udt_name;
+ }
}
return _columnType;
From a056d547b2bb9a3c40d5ee7ae2762b39271822d3 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 16:25:34 +0530
Subject: [PATCH 04/18] update package-lock.json
---
console/package-lock.json | 55 +++++++++++++++++++++++++++------------
1 file changed, 38 insertions(+), 17 deletions(-)
diff --git a/console/package-lock.json b/console/package-lock.json
index 8608c573dd2a7..7c34d65c6af4c 100644
--- a/console/package-lock.json
+++ b/console/package-lock.json
@@ -5448,7 +5448,7 @@
"dependencies": {
"combined-stream": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"requires": {
"delayed-stream": "~1.0.0"
@@ -5541,7 +5541,8 @@
},
"ansi-regex": {
"version": "2.1.1",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"aproba": {
"version": "1.2.0",
@@ -5559,11 +5560,13 @@
},
"balanced-match": {
"version": "1.0.0",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
+ "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -5576,15 +5579,18 @@
},
"code-point-at": {
"version": "1.1.0",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -5687,7 +5693,8 @@
},
"inherits": {
"version": "2.0.3",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -5697,6 +5704,7 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -5709,17 +5717,20 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -5736,6 +5747,7 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -5808,7 +5820,8 @@
},
"number-is-nan": {
"version": "1.0.1",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -5818,6 +5831,7 @@
"once": {
"version": "1.4.0",
"bundled": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -5893,7 +5907,8 @@
},
"safe-buffer": {
"version": "5.1.1",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -5923,6 +5938,7 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -5940,6 +5956,7 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
+ "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -5978,11 +5995,13 @@
},
"wrappy": {
"version": "1.0.2",
- "bundled": true
+ "bundled": true,
+ "optional": true
},
"yallist": {
"version": "3.0.2",
- "bundled": true
+ "bundled": true,
+ "optional": true
}
}
},
@@ -8829,7 +8848,7 @@
},
"node-fetch": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
+ "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
"integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
},
"node-gyp": {
@@ -9259,6 +9278,7 @@
"version": "0.1.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"kind-of": "^3.0.2",
"longest": "^1.0.1",
@@ -10262,7 +10282,8 @@
"longest": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"lru-cache": {
"version": "4.1.3",
@@ -11472,7 +11493,7 @@
},
"onetime": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
"dev": true
},
@@ -11569,7 +11590,7 @@
},
"p-is-promise": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
"integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
"dev": true
},
@@ -16738,7 +16759,7 @@
},
"whatwg-fetch": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
+ "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
"integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
},
"whet.extend": {
From fed6a76ab389df1ccc0a961e17711107d6239475 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 18:18:35 +0530
Subject: [PATCH 05/18] update to
---
.../Services/Data/Function/Permission/Permission.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/console/src/components/Services/Data/Function/Permission/Permission.js b/console/src/components/Services/Data/Function/Permission/Permission.js
index de9f6c490eabf..04d635f0e63ce 100644
--- a/console/src/components/Services/Data/Function/Permission/Permission.js
+++ b/console/src/components/Services/Data/Function/Permission/Permission.js
@@ -2,7 +2,7 @@ import React from 'react';
import Helmet from 'react-helmet';
import CommonTabLayout from '../../../Layout/CommonTabLayout/CommonTabLayout';
-// import { Link } from 'react-router';
+import { Link } from 'react-router';
import { push } from 'react-router-redux';
import { pageTitle, appPrefix } from '../Modify/constants';
@@ -82,14 +82,14 @@ class Permission extends React.Component {
applicable to the data returned by this function
);
From c3f8cffd6f63d05c6f9fc978539b5a290e4f6093 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 18:34:38 +0530
Subject: [PATCH 06/18] replace indexOf with includes
---
.../components/QueryBuilderJson/QueryBuilderJson.js | 6 +++---
.../PermissionBuilder/PermissionBuilder.js | 4 ++--
.../Services/Data/TablePermissions/Permissions.js | 10 +++++-----
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/console/src/components/QueryBuilderJson/QueryBuilderJson.js b/console/src/components/QueryBuilderJson/QueryBuilderJson.js
index d03bbb4013e23..5bc631c823201 100644
--- a/console/src/components/QueryBuilderJson/QueryBuilderJson.js
+++ b/console/src/components/QueryBuilderJson/QueryBuilderJson.js
@@ -109,14 +109,14 @@ class QueryBuilderJson extends React.Component {
Object.keys(object).forEach((key, i) => {
objectArray.push({ key: key, value: object[key] });
// replace unselected key with array position
- if (unselectedElements.indexOf(key) !== -1) {
+ if (unselectedElements.includes(key)) {
unselectedElements[unselectedElements.indexOf(key)] = i;
}
});
}
objectArray.forEach((_object, i) => {
- const unselected = unselectedElements.indexOf(i) !== -1;
+ const unselected = unselectedElements.includes(i);
_jsonObject.push(
{
/* eslint-disable no-use-before-define */
- const unselected = unselectedElements.indexOf(i) !== -1;
+ const unselected = unselectedElements.includes(i);
_jsonArray.push(
{val || '--'}
@@ -561,7 +561,7 @@ class PermissionBuilder extends React.Component {
}
let _columnExp = '';
- if (tableRelationships.indexOf(column) !== -1) {
+ if (tableRelationships.includes(column)) {
const rel = getTableRelationship(tableSchema, column);
const refTable = getRefTable(rel, tableSchema);
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 9fc4b08ce5944..60fd92785be95 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -321,7 +321,7 @@ class Permissions extends Component {
if (role === 'admin') {
_permission = permissionsSymbols.fullAccess;
- } else if (Object.keys(rolePermissions).indexOf(role) === -1) {
+ } else if (!Object.keys(rolePermissions).includes(role)) {
_permission = permissionsSymbols.noAccess;
} else {
const permissions = rolePermissions[role][queryType];
@@ -342,7 +342,7 @@ class Permissions extends Component {
if (JSON.stringify(permissions[filterKey]) === '{}') {
if (
checkColumns &&
- permissions.columns.indexOf('*') === -1 &&
+ !permissions.columns.includes('*') &&
permissions.columns.length !== tableSchema.columns.length
) {
_permission = permissionsSymbols.partialAccess;
@@ -1208,7 +1208,7 @@ class Permissions extends Component {
return tableSchema.columns.map((colObj, i) => {
const column = colObj.column_name;
const checked = permsState[query]
- ? permsState[query].columns.indexOf(column) !== -1
+ ? permsState[query].columns.includes(column)
: false;
return (
@@ -1235,7 +1235,7 @@ class Permissions extends Component {
if (
getQueriesWithPermColumns(
semverCheck('insertPermRestrictColumns', this.props.serverVersion)
- ).indexOf(query) !== -1
+ ).includes(query)
) {
const dispatchToggleAllColumns = () => {
const allColumns = tableSchema.columns.map(c => c.column_name);
@@ -1593,7 +1593,7 @@ class Permissions extends Component {
};
const roleList = [];
currentPermissions.map(perm => {
- if (roleList.indexOf(perm.role_name) === -1) {
+ if (!roleList.includes(perm.role_name)) {
roleList.push(perm.role_name);
}
});
From 347a520ce614578e20140d25d9cd9cc3db7699cf Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 18:49:15 +0530
Subject: [PATCH 07/18] update partial access filter icon in permissions
---
.../Services/Data/TablePermissions/Permissions.js | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 60fd92785be95..a2296532e7b0f 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -618,14 +618,9 @@ class Permissions extends Component {
const getPermissionsTable = (tableSchema, queryTypes, permsState) => {
const permissionsSymbols = {
- //
fullAccess: ,
- //
noAccess: ,
- //
- partialAccess: (
-
- ),
+ partialAccess: ,
};
return (
From 3b40d415745ddf766f0b7c3e25d49a2b69f72932 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 19:50:40 +0530
Subject: [PATCH 08/18] add relationship permissions text
---
.../Services/Data/TablePermissions/Actions.js | 4 +-
.../Data/TablePermissions/Permissions.js | 63 ++++++++++++++-----
2 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Actions.js b/console/src/components/Services/Data/TablePermissions/Actions.js
index 6c5ba1c29bba1..5c02984524b76 100644
--- a/console/src/components/Services/Data/TablePermissions/Actions.js
+++ b/console/src/components/Services/Data/TablePermissions/Actions.js
@@ -53,9 +53,9 @@ export const SET_TYPE_CONFIG = 'ModifyTable/SET_TYPE_CONFIG';
/* */
-const getQueriesWithPermColumns = insert => {
+const getQueriesWithPermColumns = allowInsert => {
const queries = ['select', 'update'];
- if (insert) {
+ if (allowInsert) {
queries.push('insert');
}
return queries;
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index a2296532e7b0f..ffee64e0bef4c 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -1193,6 +1193,8 @@ class Permissions extends Component {
};
const getColumnList = (tableSchema, permsState) => {
+ const _columnList = [];
+
const query = permsState.query;
const dispatchToggleColumn = e => {
@@ -1200,13 +1202,11 @@ class Permissions extends Component {
dispatch(permToggleColumn(column));
};
- return tableSchema.columns.map((colObj, i) => {
+ tableSchema.columns.forEach((colObj, i) => {
const column = colObj.column_name;
- const checked = permsState[query]
- ? permsState[query].columns.includes(column)
- : false;
+ const checked = permsState[query] ? permsState[query].columns.includes(column) : false;
- return (
+ _columnList.push(
@@ -1222,32 +1222,60 @@ class Permissions extends Component {
);
});
+
+ _columnList.push(
+
+ );
+
+ return _columnList;
+ };
+
+ const getRelationshipsMsg = (tableSchema) => {
+ let _relationshipsMsg = '';
+
+ const relationships = tableSchema.relationships.map(relObj => relObj.rel_name);
+
+ if (relationships.length) {
+ _relationshipsMsg = (
+
+ For relationship{relationships.length !== 1 ? 's' : ''} {relationships.join(', ')} set permissions
+ on the corresponding remote table/view.
+
+ );
+ }
+
+ return _relationshipsMsg;
};
const getColumnSection = (tableSchema, permsState) => {
+ const { serverVersion } = this.props;
+
let _columnSection = '';
+
const query = permsState.query;
- if (
- getQueriesWithPermColumns(
- semverCheck('insertPermRestrictColumns', this.props.serverVersion)
- ).includes(query)
- ) {
+
+ const allowInsertPermColumns = semverCheck('insertPermRestrictColumns', serverVersion);
+ const queriesWithPermColumns = getQueriesWithPermColumns(allowInsertPermColumns);
+
+ if (queriesWithPermColumns.includes(query)) {
const dispatchToggleAllColumns = () => {
const allColumns = tableSchema.columns.map(c => c.column_name);
dispatch(permToggleAllColumns(allColumns));
};
+
let accessText;
if (query === 'insert') {
- accessText = 'Allow input for';
+ accessText = 'input for';
} else if (query === 'select') {
- accessText = 'Allow access to';
+ accessText = 'access to';
} else {
- accessText = 'Allow updates to';
+ accessText = 'updates to';
}
+
_columnSection = (
- {accessText} these columns :
+ Allow {accessText} these columns :
- {getColumnList(tableSchema, permsState)}
-
+
+ { getColumnList(tableSchema, permsState) }
+
+ { getRelationshipsMsg(tableSchema) }
+
);
}
From 21b65117da1f64941f4d68c3761b9293d41a39ce Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Thu, 14 Feb 2019 19:55:46 +0530
Subject: [PATCH 09/18] update relationship permissions text
---
.../components/Services/Data/TablePermissions/Permissions.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index ffee64e0bef4c..2facf3df1b897 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -1239,7 +1239,7 @@ class Permissions extends Component {
_relationshipsMsg = (
For relationship{relationships.length !== 1 ? 's' : ''} {relationships.join(', ')} set permissions
- on the corresponding remote table/view.
+ on the corresponding table/view.
);
}
From 38d484020e025bd5c93ef6b7bf000ba7e66fee11 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Fri, 15 Feb 2019 14:45:01 +0530
Subject: [PATCH 10/18] removed geography from postgis operators
---
.../Services/Data/TablePermissions/PermissionBuilder/utils.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
index d7133073957d6..76ddd5a7173bc 100644
--- a/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
+++ b/console/src/components/Services/Data/TablePermissions/PermissionBuilder/utils.js
@@ -35,7 +35,6 @@ export const PGTypes = {
],
postgis: [
'geometry',
- 'geography'
]
};
From 32abe4a5dafc6ced41a3f1db08103ff2c6cb59fe Mon Sep 17 00:00:00 2001
From: wawhal
Date: Fri, 15 Feb 2019 16:48:35 +0530
Subject: [PATCH 11/18] update console perm test to support types
---
console/cypress/integration/validators/validators.js | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/console/cypress/integration/validators/validators.js b/console/cypress/integration/validators/validators.js
index 40de2c66f91ab..d369526be1854 100644
--- a/console/cypress/integration/validators/validators.js
+++ b/console/cypress/integration/validators/validators.js
@@ -260,9 +260,9 @@ const compareChecks = (permObj, check, query, columns) => {
}
} else if (query === 'insert') {
// eslint-disable-line no-lonely-if
- expect(permObj.check[getColName(0)]._eq === '1').to.be.true; // eslint-dsable-line eqeqeq
+ expect(permObj.check[getColName(0)]._eq === 1).to.be.true;
} else {
- expect(permObj.filter[getColName(0)]._eq === '1').to.be.true;
+ expect(permObj.filter[getColName(0)]._eq === 1).to.be.true;
if (query === 'select' || query === 'update') {
columns.forEach((col, index) => {
expect(permObj.columns.includes(getColName(index)));
@@ -319,7 +319,6 @@ export const validatePermission = (
};
const requestOptions = makeDataAPIOptions(dataApiUrl, adminSecret, reqBody);
cy.request(requestOptions).then(response => {
- cy.log(JSON.stringify(response));
const tableSchema = response.body.find(
table => table.table_name === tableName
);
From 3fccd3dbff5e420dedb0f2ae508b9986ab83082a Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Fri, 15 Feb 2019 17:13:13 +0530
Subject: [PATCH 12/18] update permissions bulk actions section
---
.../Data/TablePermissions/Permissions.js | 20 ++++++-------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 2facf3df1b897..9a95b8257a533 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -417,18 +417,10 @@ class Permissions extends Component {
_permissionsRowHtml.push( );
} else {
const bulkSelect = permsState.bulkSelect;
- const currentInputSelection = bulkSelect.filter(e => e === role)
- .length ? (
-
- ) : (
+ const currentInputSelection = (
e === role).length}
data-role={role}
className={styles.bulkSelect}
type="checkbox"
@@ -1726,7 +1718,7 @@ class Permissions extends Component {
}
// const currentPermissions = tableSchema.permissions;
const bulkSelect = permsState.bulkSelect;
- const bulkDeleteClicked = () => {
+ const handleBulkRemoveClick = () => {
if (window.confirm('Are you sure?')) {
dispatch(permRemoveMultipleRoles(tableSchema));
}
@@ -1750,8 +1742,8 @@ class Permissions extends Component {
})}
-
- Delete
+
+ Remove Permissions
@@ -1808,8 +1800,8 @@ class Permissions extends Component {
Permissions
{getPermissionsTable(tSchema, qTypes, permissionsState)}
- {getEditSection(tSchema, qTypes, permissionsState)}
{getBulkSection(tSchema, qTypes, permissionsState)}
+ {getEditSection(tSchema, qTypes, permissionsState)}
From 0f2ea54347f162c256a15bd67a9ac500dc7bfa02 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Fri, 15 Feb 2019 17:18:52 +0530
Subject: [PATCH 13/18] update relationship msg margin
---
.../components/Services/Data/TablePermissions/Permissions.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 9a95b8257a533..bc333a046bd0b 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -1229,7 +1229,7 @@ class Permissions extends Component {
if (relationships.length) {
_relationshipsMsg = (
-
+
For relationship{relationships.length !== 1 ? 's' : ''} {relationships.join(', ')} set permissions
on the corresponding table/view.
From 8a9247cee49e65f5686ab94d61698e7c3d2fad52 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Fri, 15 Feb 2019 17:59:17 +0530
Subject: [PATCH 14/18] update relationship msg
---
.../Data/TablePermissions/Permissions.js | 32 +++++++------------
1 file changed, 11 insertions(+), 21 deletions(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index bc333a046bd0b..11e8aceab8b3a 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -1230,8 +1230,8 @@ class Permissions extends Component {
if (relationships.length) {
_relationshipsMsg = (
- For relationship{relationships.length !== 1 ? 's' : ''} {relationships.join(', ')} set permissions
- on the corresponding table/view.
+ For relationship{relationships.length !== 1 ? 's' : ''} : {relationships.join(', ')} .
+ Set permissions on the corresponding table/view.
);
}
@@ -1647,25 +1647,15 @@ class Permissions extends Component {
Apply same {permsState.query} permissions to other roles
{roleListHtml}
- {permsState.applySamePermissions.length ? (
-
- Apply
-
- ) : (
-
- Apply
-
- )}
+
+ Apply
+
);
}
From 5f708ac7cbd4677da27f2bae1070d4cc6c05faba Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Fri, 15 Feb 2019 18:40:55 +0530
Subject: [PATCH 15/18] improve save other role permissions UX
---
.../Data/TablePermissions/Permissions.js | 586 +++++++++---------
1 file changed, 300 insertions(+), 286 deletions(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 11e8aceab8b3a..025e9f282d7c1 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -703,160 +703,160 @@ class Permissions extends Component {
const setOptions =
insertState && insertState.localSet && insertState.localSet.length > 0
? insertState.localSet.map((s, i) => {
- return (
-
-
+
+ this.onSetKeyChange(e, 'insert')}
+ data-index-id={i}
+ data-test={'column-presets-column-' + i}
>
- this.onSetKeyChange(e, 'insert')}
- data-index-id={i}
- data-test={'column-presets-column-' + i}
- >
-
+
Column Name
-
- {columns && columns.length > 0
- ? columns.map((c, key) => (
-
- {c.column_name}
-
- ))
- : null}
-
-
-
+ {columns && columns.length > 0
+ ? columns.map((c, key) => (
+
+ {c.column_name}
+
+ ))
+ : null}
+
+
+
+ this.onSetTypeChange(e, 'insert')}
+ data-index-id={i}
+ data-test={'column-presets-type-' + i}
+ value={setConfigValueType(s.value) || ''}
>
- this.onSetTypeChange(e, 'insert')}
- data-index-id={i}
- data-test={'column-presets-type-' + i}
- value={setConfigValueType(s.value) || ''}
- >
-
+
Select Preset Type
-
- static
- from session variable
-
-
-
+ static
+ from session variable
+
+
+
- {setConfigValueType(s.value) === 'session' ? (
-
- X-Hasura-
- this.onSetValueChange(e, 'insert')}
- data-test={'column-presets-value-' + i}
- data-index-id={i}
- data-prefix-val={X_HASURA_CONST}
- />
-
- ) : (
-
+ {setConfigValueType(s.value) === 'session' ? (
+
+ X-Hasura-
+ this.onSetValueChange(e, 'insert')}
data-test={'column-presets-value-' + i}
- indexId={i}
+ data-index-id={i}
data-prefix-val={X_HASURA_CONST}
/>
- )}
-
- {setConfigValueType(s.value) === 'session' ? (
-
+ ) : (
+ this.onSetValueChange(e, 'insert')}
+ data-test={'column-presets-value-' + i}
+ indexId={i}
+ data-prefix-val={X_HASURA_CONST}
+ />
+ )}
+
+ {setConfigValueType(s.value) === 'session' ? (
+
+ }
+ >
e.g. X-Hasura-User-Id
-
- ) : (
-
+ ) : (
+
+ }
+ >
e.g. false, 1, some-text
-
- )}
- {i !== insertState.localSet.length - 1 ? (
-
+ )}
+ {i !== insertState.localSet.length - 1 ? (
+
- this.deleteSetKeyVal(e, 'insert')}
- data-index-id={i}
- />
-
- ) : (
-
+ this.deleteSetKeyVal(e, 'insert')}
+ data-index-id={i}
+ />
+
+ ) : (
+
- )}
-
- );
- })
+ }
+ />
+ )}
+
+ );
+ })
: null;
return (
@@ -928,160 +928,160 @@ class Permissions extends Component {
const setOptions =
updateState && updateState.localSet && updateState.localSet.length > 0
? updateState.localSet.map((s, i) => {
- return (
-
-
+
+ this.onSetKeyChange(e, 'update')}
+ data-index-id={i}
>
- this.onSetKeyChange(e, 'update')}
- data-index-id={i}
- >
-
+
Column Name
-
- {columns && columns.length > 0
- ? columns.map((c, key) => (
-
- {c.column_name}
-
- ))
- : null}
-
-
-
+ {columns && columns.length > 0
+ ? columns.map((c, key) => (
+
+ {c.column_name}
+
+ ))
+ : null}
+
+
+
+ this.onSetTypeChange(e, 'update')}
+ data-index-id={i}
+ data-test={'column-presets-type-' + i}
+ value={setConfigValueType(s.value) || ''}
>
- this.onSetTypeChange(e, 'update')}
- data-index-id={i}
- data-test={'column-presets-type-' + i}
- value={setConfigValueType(s.value) || ''}
- >
-
+
Select Preset Type
-
- static
- from session variable
-
-
-
+ static
+ from session variable
+
+
+
- {setConfigValueType(s.value) === 'session' ? (
-
- X-Hasura-
- this.onSetValueChange(e, 'update')}
- data-index-id={i}
- data-prefix-val={X_HASURA_CONST}
- data-test={'column-presets-value-' + i}
- />
-
- ) : (
-
+ {setConfigValueType(s.value) === 'session' ? (
+
+ X-Hasura-
+ this.onSetValueChange(e, 'update')}
- indexId={i}
+ data-index-id={i}
data-prefix-val={X_HASURA_CONST}
data-test={'column-presets-value-' + i}
/>
- )}
-
- {setConfigValueType(s.value) === 'session' ? (
-
+ ) : (
+ this.onSetValueChange(e, 'update')}
+ indexId={i}
+ data-prefix-val={X_HASURA_CONST}
+ data-test={'column-presets-value-' + i}
+ />
+ )}
+
+ {setConfigValueType(s.value) === 'session' ? (
+
+ }
+ >
e.g. X-Hasura-User-Id
-
- ) : (
-
+ ) : (
+
+ }
+ >
e.g. false, 1, some-text
-
- )}
- {i !== updateState.localSet.length - 1 ? (
-
+ )}
+ {i !== updateState.localSet.length - 1 ? (
+
- this.deleteSetKeyVal(e, 'update')}
- data-index-id={i}
- />
-
- ) : (
-
+ this.deleteSetKeyVal(e, 'update')}
+ data-index-id={i}
+ />
+
+ ) : (
+
- )}
-
- );
- })
+ }
+ />
+ )}
+
+ );
+ })
: null;
return (
(
-
- {value}
-
- );
-
- const getButtonsSection = (tableSchema, permsState) => {
- const dispatchSavePermissions = () => {
- dispatch(permChangePermissions(permChangeTypes.save));
- };
-
- const dispatchRemoveAccess = () => {
- const isOk = confirm('Are you sure?');
- if (isOk) {
- dispatch(permChangePermissions(permChangeTypes.delete));
- }
- };
-
- const dispatchCloseEdit = () => {
- dispatch(permCloseEdit());
- };
-
- const rolePermissions = tableSchema.permissions.find(
- p => p.role_name === permsState.role
- );
- const currQueryPermissions = rolePermissions
- ? rolePermissions.permissions[permsState.query]
- : undefined;
- const newQueryPermissions = permsState[permsState.query];
-
- const disableSave =
- JSON.stringify(newQueryPermissions) ===
- JSON.stringify(currQueryPermissions);
- const disableRemoveAccess = !currQueryPermissions;
-
- const saveButton = getButton(
- 'Save permissions',
- 'yellow',
- dispatchSavePermissions,
- disableSave
- );
-
- const removeAccessButton = getButton(
- 'Remove',
- 'red',
- dispatchRemoveAccess,
- disableRemoveAccess
- );
-
- const closeButton = getButton('Close', 'white', dispatchCloseEdit);
+ const getBulkApplySection = (tableSchema, permsState) => {
const currentPermissions = tableSchema.permissions;
+
const applySameSelected = e => {
const isChecked = e.target.checked;
const selectedRole = e.target.getAttribute('data-role');
dispatch(permSetSameSelect(isChecked, selectedRole));
};
+
const applySameBulk = () => {
if (window.confirm('Are you sure?')) {
dispatch(applySamePermissionsBulk(tableSchema));
}
};
+
const roleList = [];
currentPermissions.map(perm => {
if (!roleList.includes(perm.role_name)) {
roleList.push(perm.role_name);
}
});
+
+ const rolePermissions = tableSchema.permissions.find(
+ p => p.role_name === permsState.role
+ );
+ const currQueryPermissions = rolePermissions
+ ? rolePermissions.permissions[permsState.query]
+ : undefined;
+
// get list of unique names
const roleListHtml = [];
roleList.map(role => {
@@ -1640,10 +1595,11 @@ class Permissions extends Component {
);
}
});
+
let applyBulkPermissions = null;
if (roleListHtml.length) {
applyBulkPermissions = (
-
+
Apply same {permsState.query} permissions to other roles
{roleListHtml}
@@ -1654,18 +1610,77 @@ class Permissions extends Component {
size="sm"
disabled={!permsState.applySamePermissions.length}
>
- Apply
+ Save permissions
);
}
+ return applyBulkPermissions;
+ };
+
+ const getButton = (value, color, onClickFn, disabled) => (
+
+ {value}
+
+ );
+
+ const getButtonsSection = (tableSchema, permsState) => {
+ const dispatchSavePermissions = () => {
+ dispatch(permChangePermissions(permChangeTypes.save));
+ };
+
+ const dispatchRemoveAccess = () => {
+ const isOk = confirm('Are you sure?');
+ if (isOk) {
+ dispatch(permChangePermissions(permChangeTypes.delete));
+ }
+ };
+
+ const dispatchCloseEdit = () => {
+ dispatch(permCloseEdit());
+ };
+
+ const rolePermissions = tableSchema.permissions.find(
+ p => p.role_name === permsState.role
+ );
+ const currQueryPermissions = rolePermissions
+ ? rolePermissions.permissions[permsState.query]
+ : undefined;
+ const newQueryPermissions = permsState[permsState.query];
+
+ const disableSave = permsState.applySamePermissions.length ||
+ (JSON.stringify(newQueryPermissions) === JSON.stringify(currQueryPermissions));
+ const disableRemoveAccess = !currQueryPermissions;
+
+ const saveButton = getButton(
+ 'Save permissions',
+ 'yellow',
+ dispatchSavePermissions,
+ disableSave
+ );
+
+ const removeAccessButton = getButton(
+ 'Remove',
+ 'red',
+ dispatchRemoveAccess,
+ disableRemoveAccess
+ );
+
+ const closeButton = getButton('Close', 'white', dispatchCloseEdit);
+
return (
{saveButton}
{removeAccessButton}
{closeButton}
- {applyBulkPermissions}
);
};
@@ -1680,14 +1695,13 @@ class Permissions extends Component {
{getRowSection(queryTypes, permsState)}
{getColumnSection(tableSchema, permsState)}
- {showAggregation ? getAggregationSection(permsState) : null}
+ {showAggregation && getAggregationSection(permsState)}
{getLimitSection(permsState)}
{getUpsertSection(permsState)}
- {showInsertPrefix
- ? getInsertSetPermission(tableSchema, permsState)
- : null}
+ {showInsertPrefix && getInsertSetPermission(tableSchema, permsState)}
{showUpdatePresets && getUpdateSetSection(tableSchema, permsState)}
{getButtonsSection(tableSchema, permsState)}
+ {getBulkApplySection(tableSchema, permsState)}
);
From 4930ad14fc90e67bcfd19b3c170dc225367e754b Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Fri, 15 Feb 2019 19:16:27 +0530
Subject: [PATCH 16/18] bug fix
---
.../src/components/Services/Data/TablePermissions/Actions.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/console/src/components/Services/Data/TablePermissions/Actions.js b/console/src/components/Services/Data/TablePermissions/Actions.js
index 5c02984524b76..eaad9d18aee26 100644
--- a/console/src/components/Services/Data/TablePermissions/Actions.js
+++ b/console/src/components/Services/Data/TablePermissions/Actions.js
@@ -455,7 +455,7 @@ const applySamePermissionsBulk = tableSchema => {
const table = tableSchema.table_name;
const currentQueryType = permissionsState.query;
const toBeAppliedPermission = permissionsState[currentQueryType];
- const selectedRoles = permissionsState.applySamePermissions;
+ const selectedRoles = permissionsState.applySamePermissions.concat([permissionsState.role]);
const permissionsUpQueries = [];
const permissionsDownQueries = [];
From ec59e1a1f4b12bc784b45d7d0fd08c0846ee4e20 Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Sat, 16 Feb 2019 14:21:05 +0530
Subject: [PATCH 17/18] show all roles in permissions
---
.../Services/Data/TableModify/Modify.scss | 2 +-
.../Services/Data/TablePermissions/Actions.js | 7 +-
.../Data/TablePermissions/Permissions.js | 212 +++++++++---------
3 files changed, 116 insertions(+), 105 deletions(-)
diff --git a/console/src/components/Services/Data/TableModify/Modify.scss b/console/src/components/Services/Data/TableModify/Modify.scss
index 361126c4bab55..11890a3322c08 100644
--- a/console/src/components/Services/Data/TableModify/Modify.scss
+++ b/console/src/components/Services/Data/TableModify/Modify.scss
@@ -265,7 +265,7 @@ hr
word-wrap: break-word;
.columnListElement {
float: left;
- margin-right: 75px;
+ margin-right: 50px;
}
.toggleAll {
diff --git a/console/src/components/Services/Data/TablePermissions/Actions.js b/console/src/components/Services/Data/TablePermissions/Actions.js
index eaad9d18aee26..404e65ffaf9ff 100644
--- a/console/src/components/Services/Data/TablePermissions/Actions.js
+++ b/console/src/components/Services/Data/TablePermissions/Actions.js
@@ -465,10 +465,11 @@ const applySamePermissionsBulk = tableSchema => {
// find out if selected role has an existing permission of the same query type.
// if so add a drop permission and then create the new permission.
- const currentRolePermission = currentPermissions.filter(el => {
+ const currentRolePermission = currentPermissions.find(el => {
return el.role_name === role;
});
- if (currentRolePermission[0].permissions[currentQueryType]) {
+
+ if (currentRolePermission && currentRolePermission.permissions[currentQueryType]) {
// existing permission is there. so drop and recreate.
const deleteQuery = {
type: 'drop_' + currentQueryType + '_permission',
@@ -482,7 +483,7 @@ const applySamePermissionsBulk = tableSchema => {
args: {
table: { name: table, schema: currentSchema },
role: role,
- permission: currentRolePermission[0].permissions[currentQueryType],
+ permission: currentRolePermission.permissions[currentQueryType],
},
};
permissionsUpQueries.push(deleteQuery);
diff --git a/console/src/components/Services/Data/TablePermissions/Permissions.js b/console/src/components/Services/Data/TablePermissions/Permissions.js
index 025e9f282d7c1..b5fe24caa7c68 100644
--- a/console/src/components/Services/Data/TablePermissions/Permissions.js
+++ b/console/src/components/Services/Data/TablePermissions/Permissions.js
@@ -243,33 +243,23 @@ class Permissions extends Component {
const { showAggregation, showInsertPrefix, showUpdatePresets } = this.state;
const styles = require('../TableModify/Modify.scss');
- let qTypes;
- if (tableType === 'table') {
- qTypes = ['insert', 'select', 'update', 'delete'];
- } else if (tableType === 'view') {
- qTypes = [];
- // Add insert/update permission if it is insertable/updatable as returned by pg
- if (
- this.state.viewInfo &&
- 'is_insertable_into' in this.state.viewInfo &&
- this.state.viewInfo.is_insertable_into === 'YES'
- ) {
- qTypes.push('insert');
- }
-
- qTypes.push('select');
+ const getAllRoles = (allTableSchemas) => {
+ const _allRoles = [];
+
+ allTableSchemas.forEach(tableSchema => {
+ if (tableSchema.permissions) {
+ tableSchema.permissions.forEach(p => {
+ if (!_allRoles.includes(p.role_name)) {
+ _allRoles.push(p.role_name);
+ }
+ });
+ }
+ });
- if (
- this.state.viewInfo &&
- 'is_updatable' in this.state.viewInfo &&
- this.state.viewInfo.is_updatable === 'YES'
- ) {
- qTypes.push('update');
- qTypes.push('delete');
- }
- }
+ _allRoles.sort();
- const tSchema = allSchemas.find(t => t.table_name === tableName);
+ return _allRoles;
+ };
const getAlertHtml = (
_ongoingRequest,
@@ -377,35 +367,31 @@ class Permissions extends Component {
if (isNewPerm && permsState.newRole !== '') {
dispatch(permOpenEdit(tableSchema, permsState.newRole, queryType));
} else if (role !== '') {
- dispatch(
- permOpenEdit(
- tableSchema,
- role,
- queryType,
- semverCheck('insertPermRestrictColumns', this.props.serverVersion)
- )
- );
+ const allowInsertPermColumns = semverCheck('insertPermRestrictColumns', this.props.serverVersion);
+
+ dispatch(permOpenEdit(tableSchema, role, queryType, allowInsertPermColumns));
} else {
- window.alert('Please enter a role name');
+ document.getElementById('newRoleInput').focus();
}
};
const dispatchCloseEdit = () => {
dispatch(permCloseEdit());
};
+
const dispatchRoleNameChange = e => {
dispatch(permSetRoleName(e.target.value));
};
+
const dispatchBulkSelect = e => {
const isChecked = e.target.checked;
const selectedRole = e.target.getAttribute('data-role');
dispatch(permSetBulkSelect(isChecked, selectedRole));
};
+
const dispatchDeletePermission = () => {
const isConfirm = window.confirm(
- 'Are you sure you want to delete the permission for role ' +
- role +
- '?'
+ 'Are you sure you want to delete the permission for role ' + role + '?'
);
if (isConfirm) {
dispatch(permRemoveRole(tableSchema, role));
@@ -444,6 +430,7 @@ class Permissions extends Component {
_permissionsRowHtml.push(
{
const _permissionsRowsHtml = [];
- // admin role by default
- _permissionsRowsHtml.push(
-
- {getPermissionsTableRow(
- tableSchema,
- 'admin',
- queryTypes,
- permissionsSymbols,
- permsState
- )}
-
- );
- tableSchema.permissions.forEach((perm, i) => {
+ // add admin to roles
+ const _roleList = ['admin'].concat(roleList);
+
+ _roleList.forEach((role, i) => {
_permissionsRowsHtml.push(
{getPermissionsTableRow(
tableSchema,
- perm.role_name,
+ role,
queryTypes,
permissionsSymbols,
permsState
@@ -531,6 +514,8 @@ class Permissions extends Component {
);
});
+
+ // new role row
_permissionsRowsHtml.push(
{getPermissionsTableRow(
@@ -608,7 +593,7 @@ class Permissions extends Component {
);
};
- const getPermissionsTable = (tableSchema, queryTypes, permsState) => {
+ const getPermissionsTable = (tableSchema, queryTypes, permsState, roleList) => {
const permissionsSymbols = {
fullAccess: ,
noAccess: ,
@@ -625,7 +610,8 @@ class Permissions extends Component {
tableSchema,
queryTypes,
permissionsSymbols,
- permsState
+ permsState,
+ roleList
)}
@@ -1541,9 +1527,7 @@ class Permissions extends Component {
);
};
- const getBulkApplySection = (tableSchema, permsState) => {
- const currentPermissions = tableSchema.permissions;
-
+ const getBulkApplySection = (tableSchema, permsState, roleList) => {
const applySameSelected = e => {
const isChecked = e.target.checked;
const selectedRole = e.target.getAttribute('data-role');
@@ -1556,52 +1540,46 @@ class Permissions extends Component {
}
};
- const roleList = [];
- currentPermissions.map(perm => {
- if (!roleList.includes(perm.role_name)) {
- roleList.push(perm.role_name);
- }
- });
-
const rolePermissions = tableSchema.permissions.find(
p => p.role_name === permsState.role
);
- const currQueryPermissions = rolePermissions
- ? rolePermissions.permissions[permsState.query]
- : undefined;
+ const currQueryPermissions = rolePermissions ? rolePermissions.permissions[permsState.query] : null;
- // get list of unique names
const roleListHtml = [];
- roleList.map(role => {
- if (role !== permsState.role && currQueryPermissions) {
- roleListHtml.push(
-
-
- {role}
-
- );
- }
- });
+ if (currQueryPermissions) {
+ roleList.forEach(role => {
+ if (role !== permsState.role) {
+ roleListHtml.push(
+
+
+
+ {role}
+
+
+ );
+ }
+ });
+ }
let applyBulkPermissions = null;
if (roleListHtml.length) {
applyBulkPermissions = (
-
Apply same {permsState.query} permissions to other roles
+
Apply same {permsState.query} permissions to other roles:
{roleListHtml}
(
+ const getEditPermissions = (tableSchema, queryTypes, permsState, roleList) => (
Role: {permsState.role}
@@ -1701,16 +1679,16 @@ class Permissions extends Component {
{showInsertPrefix && getInsertSetPermission(tableSchema, permsState)}
{showUpdatePresets && getUpdateSetSection(tableSchema, permsState)}
{getButtonsSection(tableSchema, permsState)}
- {getBulkApplySection(tableSchema, permsState)}
+ {getBulkApplySection(tableSchema, permsState, roleList)}
);
- const getEditSection = (tableSchema, queryTypes, permsState) => {
+ const getEditSection = (tableSchema, queryTypes, permsState, roleList) => {
let _editSection = '';
if (permsState.role && permsState.query) {
- _editSection = getEditPermissions(tableSchema, queryTypes, permsState);
+ _editSection = getEditPermissions(tableSchema, queryTypes, permsState, roleList);
}
return _editSection;
@@ -1727,7 +1705,8 @@ class Permissions extends Component {
dispatch(permRemoveMultipleRoles(tableSchema));
}
};
- const _bulkSection = (
+
+ return (
Apply Bulk Actions
@@ -1752,7 +1731,6 @@ class Permissions extends Component {
);
- return _bulkSection;
};
/*
@@ -1796,6 +1774,38 @@ class Permissions extends Component {
return _header;
};
+ /********************/
+
+ let qTypes;
+ if (tableType === 'table') {
+ qTypes = ['insert', 'select', 'update', 'delete'];
+ } else if (tableType === 'view') {
+ qTypes = [];
+ // Add insert/update permission if it is insertable/updatable as returned by pg
+ if (
+ this.state.viewInfo &&
+ 'is_insertable_into' in this.state.viewInfo &&
+ this.state.viewInfo.is_insertable_into === 'YES'
+ ) {
+ qTypes.push('insert');
+ }
+
+ qTypes.push('select');
+
+ if (
+ this.state.viewInfo &&
+ 'is_updatable' in this.state.viewInfo &&
+ this.state.viewInfo.is_updatable === 'YES'
+ ) {
+ qTypes.push('update');
+ qTypes.push('delete');
+ }
+ }
+
+ const tSchema = allSchemas.find(t => t.table_name === tableName);
+
+ const allRolesList = getAllRoles(allSchemas);
+
return (
{getHeader(tSchema)}
@@ -1803,9 +1813,9 @@ class Permissions extends Component {
Permissions
- {getPermissionsTable(tSchema, qTypes, permissionsState)}
+ {getPermissionsTable(tSchema, qTypes, permissionsState, allRolesList)}
{getBulkSection(tSchema, qTypes, permissionsState)}
- {getEditSection(tSchema, qTypes, permissionsState)}
+ {getEditSection(tSchema, qTypes, permissionsState, allRolesList)}
From 1b74a5b77622e1dd24b42ee8bd0b6563cd44527f Mon Sep 17 00:00:00 2001
From: rikinsk
Date: Sun, 17 Feb 2019 15:27:39 +0530
Subject: [PATCH 18/18] revert package-lock.json changes
---
console/package-lock.json | 55 ++++++++++++---------------------------
1 file changed, 17 insertions(+), 38 deletions(-)
diff --git a/console/package-lock.json b/console/package-lock.json
index 7c34d65c6af4c..8608c573dd2a7 100644
--- a/console/package-lock.json
+++ b/console/package-lock.json
@@ -5448,7 +5448,7 @@
"dependencies": {
"combined-stream": {
"version": "1.0.6",
- "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"requires": {
"delayed-stream": "~1.0.0"
@@ -5541,8 +5541,7 @@
},
"ansi-regex": {
"version": "2.1.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"aproba": {
"version": "1.2.0",
@@ -5560,13 +5559,11 @@
},
"balanced-match": {
"version": "1.0.0",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
- "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -5579,18 +5576,15 @@
},
"code-point-at": {
"version": "1.1.0",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"concat-map": {
"version": "0.0.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"console-control-strings": {
"version": "1.1.0",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"core-util-is": {
"version": "1.0.2",
@@ -5693,8 +5687,7 @@
},
"inherits": {
"version": "2.0.3",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"ini": {
"version": "1.3.5",
@@ -5704,7 +5697,6 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
- "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -5717,20 +5709,17 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
- "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
- "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -5747,7 +5736,6 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
- "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -5820,8 +5808,7 @@
},
"number-is-nan": {
"version": "1.0.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"object-assign": {
"version": "4.1.1",
@@ -5831,7 +5818,6 @@
"once": {
"version": "1.4.0",
"bundled": true,
- "optional": true,
"requires": {
"wrappy": "1"
}
@@ -5907,8 +5893,7 @@
},
"safe-buffer": {
"version": "5.1.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -5938,7 +5923,6 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
- "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -5956,7 +5940,6 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
- "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -5995,13 +5978,11 @@
},
"wrappy": {
"version": "1.0.2",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"yallist": {
"version": "3.0.2",
- "bundled": true,
- "optional": true
+ "bundled": true
}
}
},
@@ -8848,7 +8829,7 @@
},
"node-fetch": {
"version": "2.1.2",
- "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
"integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
},
"node-gyp": {
@@ -9278,7 +9259,6 @@
"version": "0.1.4",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"kind-of": "^3.0.2",
"longest": "^1.0.1",
@@ -10282,8 +10262,7 @@
"longest": {
"version": "1.0.1",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"lru-cache": {
"version": "4.1.3",
@@ -11493,7 +11472,7 @@
},
"onetime": {
"version": "1.1.0",
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
"dev": true
},
@@ -11590,7 +11569,7 @@
},
"p-is-promise": {
"version": "1.1.0",
- "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
"integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
"dev": true
},
@@ -16759,7 +16738,7 @@
},
"whatwg-fetch": {
"version": "2.0.4",
- "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
"integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
},
"whet.extend": {