Skip to content

Commit 8f62e5b

Browse files
authored
Merge pull request #8297 from romayalon/romy-parse-json-and-encrypt-config-fs
NC | ConfigFS | Create prepare for schema functions and some manage_nsfs refactoring
2 parents 29d705f + 4157448 commit 8f62e5b

File tree

10 files changed

+385
-356
lines changed

10 files changed

+385
-356
lines changed

src/cmd/manage_nsfs.js

Lines changed: 161 additions & 178 deletions
Large diffs are not rendered by default.

src/manage_nsfs/manage_nsfs_cli_utils.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,30 @@ function check_root_account_owns_user(root_account, account) {
134134
}
135135

136136

137+
/**
138+
* is_name_update returns true if a new_name flag was provided and it's not equal to
139+
* the current name
140+
* @param {Object} data
141+
* @returns {Boolean}
142+
*/
143+
function is_name_update(data) {
144+
const cur_name = data.name;
145+
const new_name = data.new_name;
146+
return new_name && cur_name && new_name !== cur_name;
147+
}
148+
149+
/**
150+
* is_access_key_update returns true if a new_access_key flag was provided and it's not equal to
151+
* the current access_key at index 0
152+
* @param {Object} data
153+
* @returns {Boolean}
154+
*/
155+
function is_access_key_update(data) {
156+
const cur_access_key = has_access_keys(data.access_keys) ? data.access_keys[0].access_key.unwrap() : undefined;
157+
const new_access_key = data.new_access_key;
158+
return new_access_key && cur_access_key && new_access_key !== cur_access_key;
159+
}
160+
137161
// EXPORTS
138162
exports.throw_cli_error = throw_cli_error;
139163
exports.write_stdout_response = write_stdout_response;
@@ -144,3 +168,5 @@ exports.has_access_keys = has_access_keys;
144168
exports.generate_id = generate_id;
145169
exports.set_debug_level = set_debug_level;
146170
exports.check_root_account_owns_user = check_root_account_owns_user;
171+
exports.is_name_update = is_name_update;
172+
exports.is_access_key_update = is_access_key_update;

src/manage_nsfs/manage_nsfs_validations.js

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ const string_utils = require('../util/string_utils');
99
const native_fs_utils = require('../util/native_fs_utils');
1010
const ManageCLIError = require('../manage_nsfs/manage_nsfs_cli_errors').ManageCLIError;
1111
const bucket_policy_utils = require('../endpoint/s3/s3_bucket_policy_utils');
12-
const { throw_cli_error, get_options_from_file, get_boolean_or_string_value,
13-
check_root_account_owns_user, get_bucket_owner_account} = require('../manage_nsfs/manage_nsfs_cli_utils');
12+
const { throw_cli_error, get_bucket_owner_account, get_options_from_file, get_boolean_or_string_value,
13+
check_root_account_owns_user, is_name_update, is_access_key_update } = require('../manage_nsfs/manage_nsfs_cli_utils');
1414
const { TYPES, ACTIONS, VALID_OPTIONS, OPTION_TYPE, FROM_FILE, BOOLEAN_STRING_VALUES, BOOLEAN_STRING_OPTIONS,
1515
GLACIER_ACTIONS, LIST_UNSETABLE_OPTIONS, ANONYMOUS, DIAGNOSE_ACTIONS } = require('../manage_nsfs/manage_nsfs_constants');
1616
const iam_utils = require('../endpoint/iam/iam_utils');
@@ -300,12 +300,43 @@ function validate_account_name(type, action, input_options_with_data) {
300300
* @param {object} input_options
301301
*/
302302
function validate_bucket_identifier(action, input_options) {
303-
if (action === ACTIONS.STATUS || action === ACTIONS.ADD || action === ACTIONS.UPDATE || action === ACTIONS.DELETE) {
303+
if (action === ACTIONS.STATUS || action === ACTIONS.ADD || action === ACTIONS.UPDATE || action === ACTIONS.DELETE) {
304304
if (input_options.name === undefined) throw_cli_error(ManageCLIError.MissingBucketNameFlag);
305305
}
306306
// in list there is no identifier
307307
}
308308

309+
/**
310+
* check_new_name_exists will validate that a new account/bucket name does not exist
311+
* @param {import('../sdk/config_fs').ConfigFS} config_fs
312+
* @param {string} action
313+
* @param {object} data
314+
*/
315+
async function check_new_name_exists(type, config_fs, action, data) {
316+
const new_name = action === ACTIONS.ADD ? data.name : data.new_name;
317+
if (action === ACTIONS.UPDATE && !is_name_update(data)) return;
318+
if (type === TYPES.BUCKET) {
319+
const exists = await config_fs.is_bucket_exists(new_name);
320+
if (exists) throw_cli_error(ManageCLIError.BucketAlreadyExists, new_name, { bucket: new_name });
321+
} else if (type === TYPES.ACCOUNT) {
322+
const exists = await config_fs.is_account_exists_by_name(new_name);
323+
if (exists) throw_cli_error(ManageCLIError.AccountNameAlreadyExists, new_name, { account: new_name });
324+
}
325+
}
326+
327+
/**
328+
* check_new_access_key_exists will validate that a new access_key does not exist
329+
* @param {import('../sdk/config_fs').ConfigFS} config_fs
330+
* @param {string} action
331+
* @param {object} data
332+
*/
333+
async function check_new_access_key_exists(config_fs, action, data) {
334+
const new_access_key = action === ACTIONS.ADD ? data.access_keys?.[0]?.access_key : data.new_access_key;
335+
if (action === ACTIONS.UPDATE && !is_access_key_update(data)) return;
336+
const exists = await config_fs.is_account_exists_by_access_key(new_access_key);
337+
if (exists) throw_cli_error(ManageCLIError.AccountAccessKeyAlreadyExists, new_access_key, { account: new_access_key });
338+
}
339+
309340
/**
310341
* validate_bucket_args will validate the cli args of the bucket command
311342
* @param {import('../sdk/config_fs').ConfigFS} config_fs
@@ -322,6 +353,7 @@ async function validate_bucket_args(config_fs, data, action) {
322353
if (data.fs_backend !== undefined && !['GPFS', 'CEPH_FS', 'NFSv4'].includes(data.fs_backend)) {
323354
throw_cli_error(ManageCLIError.InvalidFSBackend);
324355
}
356+
await check_new_name_exists(TYPES.BUCKET, config_fs, action, data);
325357
// in case we have the fs_backend it changes the fs_context that we use for the path
326358
const fs_context_fs_backend = native_fs_utils.get_process_fs_context(data.fs_backend);
327359
const exists = await native_fs_utils.is_path_exists(fs_context_fs_backend, data.path);
@@ -396,6 +428,10 @@ function validate_account_identifier(action, input_options) {
396428
*/
397429
async function validate_account_args(config_fs, data, action, is_flag_iam_operate_on_root_account_update_action) {
398430
if (action === ACTIONS.ADD || action === ACTIONS.UPDATE) {
431+
432+
await check_new_name_exists(TYPES.ACCOUNT, config_fs, action, data);
433+
await check_new_access_key_exists(config_fs, action, data);
434+
399435
if (data.nsfs_account_config.gid && data.nsfs_account_config.uid === undefined) {
400436
throw_cli_error(ManageCLIError.MissingAccountNSFSConfigUID, data.nsfs_account_config);
401437
}

src/sdk/accountspace_fs.js

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const native_fs_utils = require('../util/native_fs_utils');
1010
const { create_arn, get_action_message_title, check_iam_path_was_set } = require('../endpoint/iam/iam_utils');
1111
const { IAM_ACTIONS, MAX_NUMBER_OF_ACCESS_KEYS, IAM_DEFAULT_PATH,
1212
ACCESS_KEY_STATUS_ENUM, IDENTITY_ENUM } = require('../endpoint/iam/iam_constants');
13-
const nsfs_schema_utils = require('../manage_nsfs/nsfs_schema_utils');
1413
const IamError = require('../endpoint/iam/iam_errors').IamError;
1514
const cloud_utils = require('../util/cloud_utils');
1615
const SensitiveString = require('../util/sensitive_string');
@@ -150,10 +149,7 @@ class AccountSpaceFS {
150149
is_username_update);
151150
await this._update_account_config_new_username(action, params, requested_account);
152151
} else {
153-
const requested_account_encrypted = await nc_mkm.encrypt_access_keys(requested_account);
154-
const account_string = JSON.stringify(requested_account_encrypted);
155-
nsfs_schema_utils.validate_account_schema(JSON.parse(account_string));
156-
await this.config_fs.update_account_config_file(JSON.parse(account_string));
152+
await this.config_fs.update_account_config_file(requested_account);
157153
}
158154
this._clean_account_cache(requested_account);
159155
return {
@@ -265,11 +261,8 @@ class AccountSpaceFS {
265261
deactivated: false,
266262
};
267263
requested_account.access_keys.push(created_access_key_obj);
268-
const requested_account_encrypted = await nc_mkm.encrypt_access_keys(requested_account);
269-
const account_to_create_access_keys_string = JSON.stringify(requested_account_encrypted);
270-
nsfs_schema_utils.validate_account_schema(JSON.parse(account_to_create_access_keys_string));
271264
await this.config_fs.update_account_config_file(
272-
JSON.parse(account_to_create_access_keys_string),
265+
requested_account,
273266
{ new_access_keys_to_link: [created_access_key_obj] }
274267
);
275268
return {
@@ -355,10 +348,7 @@ class AccountSpaceFS {
355348
return;
356349
}
357350
access_key_obj.deactivated = this._check_access_key_is_deactivated(params.status);
358-
const requested_account_encrypted = await nc_mkm.encrypt_access_keys(requested_account);
359-
const account_string = JSON.stringify(requested_account_encrypted);
360-
nsfs_schema_utils.validate_account_schema(JSON.parse(account_string));
361-
await this.config_fs.update_account_config_file(JSON.parse(account_string));
351+
await this.config_fs.update_account_config_file(requested_account);
362352
this._clean_account_cache(requested_account);
363353
} catch (err) {
364354
dbg.error(`AccountSpaceFS.${action} error`, err);
@@ -398,11 +388,8 @@ class AccountSpaceFS {
398388
}
399389
requested_account.access_keys = requested_account.access_keys.filter(access_key_obj =>
400390
access_key_obj.access_key !== access_key_id);
401-
const requested_account_encrypted = await nc_mkm.encrypt_access_keys(requested_account);
402-
const account_string = JSON.stringify(requested_account_encrypted);
403-
nsfs_schema_utils.validate_account_schema(JSON.parse(account_string));
404391
await this.config_fs.update_account_config_file(
405-
JSON.parse(account_string),
392+
requested_account,
406393
{ access_keys_to_delete: [{ access_key: access_key_id }] }
407394
);
408395
this._clean_account_cache(requested_account);
@@ -628,9 +615,7 @@ class AccountSpaceFS {
628615
const master_key_id = await nc_mkm.get_active_master_key_id();
629616
const created_account = this._new_user_defaults(requesting_account, params, master_key_id);
630617
dbg.log1(`AccountSpaceFS.${action} new_account`, created_account);
631-
const new_account_string = JSON.stringify(created_account);
632-
nsfs_schema_utils.validate_account_schema(JSON.parse(new_account_string));
633-
await this.config_fs.create_account_config_file(JSON.parse(new_account_string));
618+
await this.config_fs.create_account_config_file(created_account);
634619
return created_account;
635620
}
636621

@@ -665,8 +650,6 @@ class AccountSpaceFS {
665650
this._check_if_user_does_not_have_access_keys_before_deletion(action, account_to_delete);
666651
}
667652

668-
// TODO - when we have the structure of config we can check easily which buckets are owned by the root account
669-
// currently, partial copy from verify_account_not_owns_bucket
670653
async _check_if_root_account_does_not_have_buckets_before_deletion(action, account_to_delete) {
671654
const resource_name = 'buckets';
672655
const bucket_names = await this.config_fs.list_buckets();
@@ -710,10 +693,7 @@ class AccountSpaceFS {
710693
requested_account.name = params.new_username;
711694
requested_account.email = params.new_username; // internally saved
712695
// handle account config creation
713-
const requested_account_encrypted = await nc_mkm.encrypt_access_keys(requested_account);
714-
const account_string = JSON.stringify(requested_account_encrypted);
715-
nsfs_schema_utils.validate_account_schema(JSON.parse(account_string));
716-
await this.config_fs.update_account_config_file(JSON.parse(account_string), { old_name: params.username });
696+
await this.config_fs.update_account_config_file(requested_account, { old_name: params.username });
717697
}
718698

719699
_check_root_account_or_user(requesting_account, username) {

0 commit comments

Comments
 (0)