{
  "version": 3,
  "sources": ["../ui/app/mn_admin/mn_user_roles_service.js"],
  "sourcesContent": ["/*\nCopyright 2020-Present Couchbase, Inc.\n\nUse of this software is governed by the Business Source License included in\nthe file licenses/BSL-Couchbase.txt.  As of the Change Date specified in that\nfile, in accordance with the Business Source License, use of this software will\nbe governed by the Apache License, Version 2.0, included in the file\nlicenses/APL2.txt.\n*/\n\nimport angular from \"angular\";\n\nimport mnPoolDefault from \"../components/mn_pool_default.js\";\nimport mnStoreService from \"../components/mn_store_service.js\";\nimport mnStatisticsNewService from \"./mn_statistics_service.js\";\nimport mnStatsDesc from \"./mn_statistics_description.js\";\n\nexport default \"mnUserRolesService\";\n\nangular\n  .module(\"mnUserRolesService\", [mnPoolDefault, mnStoreService, mnStatisticsNewService])\n  .factory(\"mnUserRolesService\", [\"$q\", \"$http\", \"mnPoolDefault\", \"mnStoreService\", \"mnStatisticsNewService\", mnUserRolesFactory]);\n\nfunction mnUserRolesFactory($q, $http, mnPoolDefault, mnStoreService, mnStatisticsNewService) {\n  var mnUserRolesService = {\n    getState: getState,\n    addUser: addUser,\n    deleteUser: deleteUser,\n    getRoles: getRoles,\n    getUsers: getUsers,\n    getUser: getUser,\n    lookupLDAPUser: lookupLDAPUser,\n\n    addGroup: addGroup,\n    deleteRolesGroup: deleteRolesGroup,\n    getRolesGroups: getRolesGroups,\n    getRolesGroup: getRolesGroup,\n    putRolesGroup: putRolesGroup,\n    getRolesGroupsState: getRolesGroupsState,\n\n    ldapConnectivityValidate: ldapConnectivityValidate,\n    ldapAuthenticationValidate: ldapAuthenticationValidate,\n    ldapGroupsQueryValidate: ldapGroupsQueryValidate,\n\n    postLdapSettings: postLdapSettings,\n    getLdapSettings: getLdapSettings,\n    getSamlSettings: getSamlSettings,\n    clearLdapCache: clearLdapCache,\n\n    getUserProfile: getUserProfile,\n    putUserProfile: putUserProfile,\n\n    saveDashboard: saveDashboard,\n    resetDashboard: resetDashboard,\n    getSaslauthdAuth: getSaslauthdAuth,\n    packRolesToSend: packRolesToSend,\n    getRoleParams: getRoleParams,\n    packRoleParams: packRoleParams\n  };\n\n  var clientTLSCert = \"Client Cert should be supplied\";\n  var queryDnError = \"LDAP DN should be supplied\";\n  var usersAttrsError = \"The field can't be empty\";\n\n  return mnUserRolesService;\n\n  function getSaslauthdAuth() {\n    return $http({\n      method: \"GET\",\n      url: \"/settings/saslauthdAuth\"\n    }).then(function (resp) {\n      return resp.data;\n    }, function () {\n      return;\n    });\n  }\n\n  function clearLdapCache() {\n    return $http({\n      method: \"POST\",\n      url: \"/settings/invalidateLDAPCache\"\n    });\n  }\n\n  function getLdapSettings() {\n    return $http({\n      method: \"GET\",\n      url: \"/settings/ldap\"\n    });\n  }\n\n  function getSamlSettings() {\n    return $http({\n      method: \"GET\",\n      url: \"/settings/saml\"\n    });\n  }\n\n  function validateLDAPQuery(data) {\n    return !!(data.userDNMapping && typeof data.userDNMapping === 'string' && data.userDNMapping.includes(\"query\"));\n  }\n\n  function validateGroupQuery(data) {\n    return !!(data.groupsQuery);\n  }\n\n  function validateGroupUserAttrs(formData) {\n    return formData.queryForGroups === \"users_attrs\" &&\n      !formData.group.groupsQuery.attributes;\n  }\n\n  function validateAuthType(errors, data, formData) {\n    if ((formData.authType == \"creds\") && !data.bindDN) {\n      errors.bindDN = queryDnError;\n    }\n    if ((formData.authType == \"cert\") && !data.clientTLSCert) {\n      errors.clientTLSCert = clientTLSCert;\n    }\n  }\n\n  function ldapConnectivityValidate(data, formData) {\n    var errors = {};\n    validateAuthType(errors, data, formData);\n    if (Object.keys(errors).length) {\n      return $q.reject(errors);\n    } else {\n      return $http.post(\"/settings/ldap/validate/connectivity\", data);\n    }\n  }\n\n  function ldapAuthenticationValidate(data, formData) {\n    var errors = {};\n    if (validateLDAPQuery(data)) {\n      validateAuthType(errors, data, formData);\n    }\n    if (Object.keys(errors).length) {\n      return $q.reject(errors);\n    } else {\n      return $http.post(\"/settings/ldap/validate/authentication\", data);\n    }\n  }\n\n  function ldapGroupsQueryValidate(data, formData) {\n    var errors = {};\n    if (validateGroupQuery(data)) {\n      validateAuthType(errors, data, formData);\n    }\n    if (validateGroupUserAttrs(formData)) {\n      errors.groupsQuery = usersAttrsError;\n    }\n    if (!data.groupsQueryUser) {\n      errors.groupsQueryUser = \"The filed is mandatory\";\n    }\n    if (Object.keys(errors).length) {\n      return $q.reject(errors);\n    } else {\n      return $http.post(\"/settings/ldap/validate/groupsQuery\", data);\n    }\n  }\n\n  function getRoleParams(rolesByRole, role) {\n    if (!rolesByRole || !rolesByRole[role.role]) {\n      return;\n    }\n    return rolesByRole[role.role].params.map(param => role[param] || \"*\").join(\":\");\n  }\n\n  function packRoleParams(params) {\n    let i;\n    let rv = [];\n    for (i = 0; i < params.length; i++) {\n      let val = params[i];\n      if (val == \"*\") {\n        if (i == 0) {\n          rv.push(\"*\");\n        }\n        break;\n      } else {\n        rv.push(val);\n      }\n    }\n    return rv.join(\":\");\n  }\n\n  function packRolesToSend(selectedRoles, selectedRolesConfigs) {\n    return Object\n      .keys(selectedRoles)\n      .filter(role => selectedRoles[role])\n      .concat(Object\n              .keys(selectedRolesConfigs)\n              .reduce((acc, role) =>\n                      acc.concat((selectedRolesConfigs[role] || [])\n                                 .map(config =>\n                                      (role + \"[\" + packRoleParams(config.split(\":\")) + \"]\"))), []));\n  }\n\n\n  function postLdapSettings(data, formData) {\n    var errors = {};\n    var isGroups = data.authorizationEnabled;\n    var isUser = data.authenticationEnabled;\n    if ((!isUser && !isGroups) || (validateLDAPQuery(data) && isUser) ||\n        (validateGroupQuery(data) && isGroups)) {\n      validateAuthType(errors, data, formData);\n    }\n    if (isGroups && validateGroupUserAttrs(formData)) {\n      errors.groupsQuery = usersAttrsError;\n    }\n    if (formData.connect.encryption !== \"None\" &&\n        formData.connect.serverCertValidation == \"pasteCert\" &&\n        !formData.connect.cacert) {\n      errors.cacert = \"The certificate should be provided\"\n    }\n    if (Object.keys(errors).length) {\n      return $q.reject(errors);\n    } else {\n      return $http({\n        method: \"POST\",\n        url: \"/settings/ldap\",\n        data: data\n      });\n    }\n  }\n\n  function saveDashboard() {\n    return getProfile().then(function (resp) {\n      var profile = resp.data;\n      profile.scenarios = mnStoreService.store(\"scenarios\").share();\n      profile.groups = mnStoreService.store(\"groups\").share();\n      profile.charts = mnStoreService.store(\"charts\").share();\n      return putUserProfile(profile);\n    });\n  }\n\n  function resetDashboard() {\n    return getProfile().then(function (resp) {\n      var profile = resp.data;\n      mnStoreService.store(\"charts\").clear();\n      mnStoreService.store(\"groups\").clear();\n      mnStoreService.store(\"scenarios\").clear();\n\n      mnStatisticsNewService.doAddPresetScenario();\n\n      profile.scenarios = mnStoreService.store(\"scenarios\").share();\n      profile.groups = mnStoreService.store(\"groups\").share();\n      profile.charts = mnStoreService.store(\"charts\").share();\n\n\n      if (mnPoolDefault.export.compat.atLeast70) {\n        upgradeChartsNamesTo70(profile);\n      }\n\n      return putUserProfile(profile);\n    });\n  }\n\n  function putUserProfile(data) {\n    return $http.put(\"/settings/rbac/profiles/@self\", JSON.stringify(data));\n  }\n\n  function getProfile() {\n    return $http.get(\"/settings/rbac/profiles/@self\").then(null, function (resp) {\n      switch (resp.status) {\n      case 404:\n        resp.data = {};\n        return resp;\n      default:\n        return $q.reject();\n      }\n    });\n  }\n\n  function upgradeChartsNamesTo76(profile) {\n    profile.charts = profile.charts.map(chart => {\n      chart.stats = Object.keys(chart.stats)\n          .reduce((acc, stat71) => {\n            acc[mnStatsDesc.upgrade71to76(stat71)] = true;\n            return acc;\n          }, {});\n      return chart;\n    });\n  }\n\n  function upgradeChartsNamesTo71(profile) {\n    profile.charts = profile.charts.map(chart => {\n      chart.stats = Object.keys(chart.stats)\n        .reduce((acc, stat70) => {\n          acc[mnStatsDesc.upgrade70to71(stat70)] = true;\n          return acc;\n        }, {});\n      return chart;\n    });\n  }\n\n  function upgradeChartsNamesTo70(profile) {\n    profile.charts = profile.charts.map(chart => {\n      chart.stats = Object.keys(chart.stats)\n        .reduce((acc, stat65) => {\n          acc[mnStatsDesc.mapping65(stat65)] = true;\n          return acc;\n        }, {});\n      return chart;\n    });\n  }\n\n  function remove65PresetScenarios(profile) {\n    profile.scenarios = profile.scenarios.filter(v => !v.preset);\n    profile.groups = profile.groups.filter(v => !v.preset);\n    profile.charts = profile.charts.filter(v => !v.preset);\n  }\n\n  function concatPresetAndUsersScenarios(profile) {\n    profile.scenarios = profile.scenarios.concat(mnStoreService.store(\"scenarios\").share());\n    profile.groups = profile.groups.concat(mnStoreService.store(\"groups\").share());\n    profile.charts = profile.charts.concat(mnStoreService.store(\"charts\").share());\n  }\n\n  function createPresetScenarios() {\n    mnStoreService.createStore(\"scenarios\", {keyPath: \"id\"});\n    mnStoreService.createStore(\"groups\", {keyPath: \"id\"});\n    mnStoreService.createStore(\"charts\", {keyPath: \"id\"});\n    mnStatisticsNewService.doAddPresetScenario();\n  }\n\n  function getUserProfile() {\n    return $q.all([\n      getProfile(),\n      mnPoolDefault.get()\n    ]).then(function (resp) {\n      var profile = resp[0].data;\n      var poolDefault = resp[1];\n      if (profile.version) {\n        if (poolDefault.compat.atLeast70 && (profile.version < poolDefault.versions[\"70\"])) {\n          //remove old preset scenarios\n          remove65PresetScenarios(profile);\n          //generate new preset scenarios\n          createPresetScenarios();\n          //concat new preset scenarios and users custom scenarios\n          concatPresetAndUsersScenarios(profile);\n          //upgrade user/preset stat names to 70\n          upgradeChartsNamesTo70(profile);\n          return putUserProfile({\n            version: poolDefault.versions[\"70\"],\n            scenarios: profile.scenarios,\n            groups: profile.groups,\n            charts: profile.charts\n          }).then(getUserProfile);\n        }\n        if (poolDefault.compat.atLeast71 && (profile.version < poolDefault.versions[\"71\"])) {\n          upgradeChartsNamesTo71(profile);\n          return putUserProfile({\n            version: poolDefault.versions[\"71\"],\n            scenarios: profile.scenarios,\n            groups: profile.groups,\n            charts: profile.charts\n          }).then(getUserProfile);\n        }\n        if (poolDefault.compat.atLeast76 && (profile.version < poolDefault.versions[\"76\"])) {\n          upgradeChartsNamesTo76(profile);\n          return putUserProfile({\n            version: poolDefault.versions[\"76\"],\n            scenarios: profile.scenarios,\n            groups: profile.groups,\n            charts: profile.charts\n          }).then(getUserProfile);\n        }\n        mnStoreService.createStore(\"scenarios\", {keyPath: \"id\", fill: profile.scenarios});\n        mnStoreService.createStore(\"groups\", {keyPath: \"id\", fill: profile.groups});\n        mnStoreService.createStore(\"charts\", {keyPath: \"id\", fill: profile.charts});\n        return profile;\n      } else {\n        //inititlize user profile\n        createPresetScenarios();\n\n        return putUserProfile({\n          version: poolDefault.versions[\"65\"],\n          scenarios: mnStoreService.store(\"scenarios\").share(),\n          groups: mnStoreService.store(\"groups\").share(),\n          charts: mnStoreService.store(\"charts\").share()\n        }).then(getUserProfile);\n      }\n    });\n  }\n\n\n  function getRoles() {\n    return $http({\n      method: \"GET\",\n      url: \"/_uiroles\"\n    }).then(function (resp) {\n      let rv = resp.data;\n      rv.rolesByRole = rv.folders.reduce((acc, group) => {\n        group.roles.forEach(role => acc[role.role] = role);\n        return acc;\n      }, {});\n      return rv;\n    });\n  }\n\n  function getUser(user, params) {\n    return $http({\n      method: \"GET\",\n      url: getUserUrl(user),\n      params: params\n    });\n  }\n\n  function lookupLDAPUser(user) {\n    return $http({\n      method: \"GET\",\n      url: getLookupLDAPUserUrl(user)\n    })\n  }\n\n  function getUsers(params) {\n    var config = {\n      method: \"GET\",\n      url: \"/settings/rbac/users\"\n    };\n\n    config.params = {};\n    if (params && params.permission) {\n      config.params.permission = params.permission;\n    }\n    if (params && params.pageSize) {\n      if (params.substr) {\n        config.params.substr = params.substr;\n      }\n      config.params.pageSize = params.pageSize;\n      config.params.startFromDomain = params.startFromDomain;\n      config.params.startFrom = params.startFrom;\n      config.params.order = params.order;\n      config.params.sortBy = params.sortBy;\n    }\n\n    return $http(config);\n  }\n\n  function deleteUser(user) {\n    return $http({\n      method: \"DELETE\",\n      url: getUserUrl(user)\n    });\n  }\n\n  function deleteRolesGroup(group) {\n    return $http({\n      method: \"DELETE\",\n      url: \"/settings/rbac/groups/\" + encodeURIComponent(group.id),\n    });\n  }\n\n  function getUserUrl(user) {\n    var base = \"/settings/rbac/users/\";\n    return base + encodeURIComponent(user.domain) + \"/\"  + encodeURIComponent(user.id);\n  }\n\n  function getLookupLDAPUserUrl(user) {\n    return \"/settings/rbac/lookupLDAPUser/\" + encodeURIComponent(user.id);\n  }\n\n  function packData(user, roles, groups, isEditingMode, resetPassword) {\n    var data = {\n      roles: roles.indexOf(\"admin\") > -1 ? \"admin\" : roles.join(','),\n      name: user.name\n    };\n\n    if (mnPoolDefault.export.isEnterprise) {\n      data.groups = groups.join(',');\n    }\n\n    if ((!isEditingMode && user.domain == \"local\") || resetPassword) {\n      data.password = user.password;\n    }\n\n    return data;\n  }\n\n  function doAddUser(data, user) {\n    return $http({\n      method: \"PUT\",\n      data: data,\n      url: getUserUrl(user)\n    });\n  }\n\n  function addGroup(group, roles, isEditingMode) {\n    if (!group || !group.id) {\n      return $q.reject({name: \"name is required\"});\n    }\n    if (isEditingMode) {\n      return putRolesGroup(group, roles);\n    } else {\n      return getRolesGroup(group).then(function () {\n        return $q.reject({name: \"group already exists\"});\n      }, function () {\n        return putRolesGroup(group, roles);\n      });\n    }\n  }\n\n  function getRolesGroups(params) {\n    var config = {\n      method: \"GET\",\n      url: \"/settings/rbac/groups\",\n      params: {}\n    };\n\n    if (params && params.pageSize) {\n      if (params.substr) {\n        config.params.substr = params.substr;\n      }\n      config.params.pageSize = params.pageSize;\n      config.params.startFrom = params.startFrom;\n      config.params.order = params.order;\n      config.params.sortBy = params.sortBy;\n    }\n\n    return $http(config);\n  }\n\n  function getRolesGroup(group) {\n    return $http({\n      method: \"GET\",\n      url: \"/settings/rbac/groups/\" + encodeURIComponent(group.id)\n    });\n  }\n\n  function putRolesGroup(group, roles) {\n    let data = {\n      roles: roles.indexOf(\"admin\") > -1 ? \"admin\" : roles.join(','),\n      description: group.description\n    };\n    if (group.ldap_group_ref) {\n      data.ldap_group_ref = group.ldap_group_ref;\n    }\n    var config = {\n      method: \"PUT\",\n      url: \"/settings/rbac/groups/\" + encodeURIComponent(group.id),\n      data: data\n    };\n\n    return $http(config);\n  }\n\n  function getRolesGroupsState(params) {\n    return getRolesGroups(params).then(function (resp) {\n      var i;\n      for (i in resp.data.links) {\n        resp.data.links[i] = resp.data.links[i].split(\"?\")[1]\n          .split(\"&\")\n          .reduce(function(prev, curr) {\n            var p = curr.split(\"=\");\n            prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);\n            return prev;\n          }, {});\n      }\n      return resp.data;\n\n    });\n  }\n\n  function addUser(user, roles, groups, isEditingMode, resetPassword) {\n    if (!user || !user.id) {\n      return $q.reject({username: \"username is required\"});\n    }\n    if (isEditingMode) {\n      return doAddUser(packData(user, roles, groups, isEditingMode, resetPassword), user);\n    } else {\n      return getUser(user).then(function () {\n        return $q.reject({username: \"username already exists\"});\n      }, function () {\n        return doAddUser(packData(user, roles, groups, isEditingMode), user);\n      });\n    }\n  }\n\n  function getState(params) {\n    return getUsers(params).then(function (resp) {\n      var i;\n      for (i in resp.data.links) {\n        resp.data.links[i] = resp.data.links[i].split(\"?\")[1]\n          .split(\"&\")\n          .reduce(function(prev, curr) {\n            var p = curr.split(\"=\");\n            prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);\n            return prev;\n          }, {});\n      }\n      if (!resp.data.users) {//in oreder to support compatibility mode\n        return {\n          users: resp.data\n        };\n      } else {\n        return resp.data;\n      }\n    });\n  }\n}\n"],
  "mappings": "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",
  "names": []
}