azure-cli
Version:
Microsoft Azure Cross Platform Command Line tool
205 lines (176 loc) • 7.21 kB
JavaScript
/*** Generated by streamline 0.10.17 (callbacks) - DO NOT EDIT ***//**
* Copyright (c) Microsoft. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
;
var __ = require('underscore');
var utils = require('../../../util/utils');
var utilsCore = require('../../../util/utilsCore');
var permissionsUtils = require('./permissionsUtils');
var util = require('util');
var fs = require('fs');
var rbacConstants = require('./rbacConstants');
var $ = utils.getLocaleString;
function validateRole(role) {
if (__.isEmpty(role.name)) {
throw new Error($('RoleDefinition Name is invalid'));
}
if (__.isEmpty(role.description)) {
throw new Error($('RoleDefinition Description is invalid'));
}
if (__.isEmpty(role.assignableScopes)) {
throw new Error($('RoleDefinition AssignableScopes is invalid'));
}
role.assignableScopes.forEach(function(assignableScope) {
if (__.isEmpty(assignableScope)) {
throw new Error($('RoleDefinition AssignableScope value is null or empty'));
}
});
if (__.isEmpty(role.actions)) {
throw new Error($('RoleDefinition Actions is invalid'));
}
}
function toCamelCase(obj) {
var key, destKey, value;
var camelCasedObj = {};
if (obj && typeof obj === 'object')
for (key in obj) {
if (obj.hasOwnProperty(key)) {
destKey = (key.charAt(0).toLowerCase() + key.substring(1)).toString();
value = obj[key];
camelCasedObj[destKey] = value;
}
}
return camelCasedObj;
}
exports.showRoleDefinition = function (role, log, hideDetails) {
log.data($('Name :'), role.Name);
if (!hideDetails) {
log.data($('Id :'), role.Id);
log.data($('Description :'), role.Description);
log.data($('AssignableScopes :'), role.AssignableScopes);
}
log.data($('Actions :'), role.Actions);
log.data($('NotActions :'), role.NotActions);
log.data($('IsCustom :'), role.IsCustom);
log.data('');
};
exports.NormalizeRoleDefinitionObject = function (role) {
if (role) {
var normalizedRole = {};
var permissionDetails = permissionsUtils.getPermissionDetails(role.properties.permissions);
normalizedRole.Name = role.properties.roleName;
normalizedRole.Actions = permissionDetails.actions;
normalizedRole.NotActions = permissionDetails.notActions;
normalizedRole.Id = role.id;
normalizedRole.AssignableScopes = role.properties.assignableScopes;
normalizedRole.Description = role.properties.description;
normalizedRole.IsCustom = utilsCore.ignoreCaseEquals(role.properties.type, rbacConstants.CUSTOM_ROLE_TYPE) ? 'true' : 'false';
return normalizedRole;
}
};
exports.getRoleDefinitionName = function (roleDefintionResourceID) {
// to extract out the <guid> from definition id like '/subscriptions/358f3860-9dbe-4ace-b0c0-3d4f2d861014/providers/.../<guid>'
return roleDefintionResourceID.substring(roleDefintionResourceID.lastIndexOf('/') + 1);
};
exports.getSubscriptionScope = function (subscriptionId) {
// to generate subscription scope.
return util.format(rbacConstants.SubscriptionPrefixFormat, subscriptionId);
};
exports.validateScope = function (scope) {
var lowerCaseScope = scope.toLowerCase();
if (lowerCaseScope !== '/') {
if (lowerCaseScope.length === 0 || !(lowerCaseScope.startsWith('/subscriptions') || lowerCaseScope.startsWith('/providers'))) {
throw new Error($('Scope \'' + scope + '\' should begin with \'/subscriptions\' or \'/providers\'.'));
}
var parts = lowerCaseScope.substr(1).split('/'); // skip the leading '/'
if (parts.indexOf('') !== -1){
throw new Error($('Scope \'' + scope + '\' should not have any empty part.'));
}
if (parts.length % 2) {
throw new Error($('Scope \'' + scope + '\' should have even number of parts.'));
}
if (parts[0] === 'subscriptions') {
if (parts.length >= 4 && parts[2] !== 'resourcegroups'){
throw new Error($('Scope \'' + scope + '\' should begin with \'/subscriptions/<subid>/resourceGroups\'.'));
}
if (parts.length >= 6) {
if (parts[4] !== 'providers') {
throw new Error($('Scope \'' + scope + '\' should begin with \'/subscriptions/<subid>/resourceGroups/<groupname>/providers\'.'));
}
if (parts.length < 8) {
throw new Error($('Scope \'' + scope + '\' should have at least one pair of resource type and resource name. e.g. \'/subscriptions/<subid>/resourceGroups/<groupname>/providers/<providername>/<resourcetype>/<resourcename>\'.'));
}
}
}
}
};
exports.getRoleToCreateOrUpdate = function(inputfile, roledefinition) {
var roleToCreateOrUpdate;
if (inputfile) {
var exists = fs.existsSync(inputfile);
if (exists) {
var filecontent = fs.readFileSync(inputfile);
try {
roleToCreateOrUpdate = JSON.parse(filecontent);
} catch (e) {
throw new Error($('Deserializing the input role definition failed'));
}
} else {
// exists = false
throw new Error(util.format($('File %s does not exist'), inputfile));
}
} else {
// no inputfile, JSON string provided
try {
roleToCreateOrUpdate = JSON.parse(roledefinition);
} catch (e) {
throw new Error($('Deserializing the input role definition failed'));
}
}
return toCamelCase(roleToCreateOrUpdate);
};
exports.validateAndConstructCreateParameters = function (cli, inputrole) {
var newRoleDefinitionNameGuid = utils.uuidGen();
return constructRoleDefinitionCreateOrUpdateParameters(cli, inputrole, newRoleDefinitionNameGuid);
};
exports.validateAndConstructUpdateParameters = function (cli, inputrole) {
return constructRoleDefinitionCreateOrUpdateParameters(cli, inputrole, inputrole.id);
};
function constructRoleDefinitionCreateOrUpdateParameters(cli, inputrole, roleIdGuid) {
// Attempts to convert property names to camelCase by lower-casing the first letter of the property
// i.e. If user specifies "AssignableScopes" or "assignableScopes" as property-name this will work,
// but not if "assignablescopes" is specified
var newRole = toCamelCase(inputrole);
cli.output.info($('Validating role definition'));
validateRole(newRole);
var roleProperties = {
assignableScopes: newRole.assignableScopes,
description: newRole.description,
permissions: [
{
actions: newRole.actions,
notActions: newRole.notActions
}
],
roleName: newRole.name,
type: rbacConstants.CUSTOM_ROLE_TYPE
};
var parameters = {
roleDefinition: {
name: roleIdGuid,
properties: roleProperties
}
};
return parameters;
}