From 157f2a706281f831128afb79fa87c646bc78f8d2 Mon Sep 17 00:00:00 2001 From: sorbaugh Date: Wed, 13 Sep 2023 10:43:45 +0200 Subject: [PATCH 1/6] Add new user filter to search. Add regex to prevent filter collision in user-list page Usage: 1. Type a string in the search bar 2. Add in:users to display only users in the search result --- .../composer/composer/autoload_classmap.php | 1 + .../composer/composer/autoload_static.php | 1 + apps/settings/lib/AppInfo/Application.php | 3 + apps/settings/lib/Search/UserSearch.php | 137 ++++++++++++++++++ apps/settings/src/store/users.js | 9 ++ 5 files changed, 151 insertions(+) create mode 100644 apps/settings/lib/Search/UserSearch.php diff --git a/apps/settings/composer/composer/autoload_classmap.php b/apps/settings/composer/composer/autoload_classmap.php index 674b92b7cac36..a1e0b7632ca5f 100644 --- a/apps/settings/composer/composer/autoload_classmap.php +++ b/apps/settings/composer/composer/autoload_classmap.php @@ -42,6 +42,7 @@ 'OCA\\Settings\\Middleware\\SubadminMiddleware' => $baseDir . '/../lib/Middleware/SubadminMiddleware.php', 'OCA\\Settings\\Search\\AppSearch' => $baseDir . '/../lib/Search/AppSearch.php', 'OCA\\Settings\\Search\\SectionSearch' => $baseDir . '/../lib/Search/SectionSearch.php', + 'OCA\\Settings\\Search\\UserSearch' => $baseDir . '/../lib/Search/UserSearch.php', 'OCA\\Settings\\Sections\\Admin\\Additional' => $baseDir . '/../lib/Sections/Admin/Additional.php', 'OCA\\Settings\\Sections\\Admin\\ArtificialIntelligence' => $baseDir . '/../lib/Sections/Admin/ArtificialIntelligence.php', 'OCA\\Settings\\Sections\\Admin\\Delegation' => $baseDir . '/../lib/Sections/Admin/Delegation.php', diff --git a/apps/settings/composer/composer/autoload_static.php b/apps/settings/composer/composer/autoload_static.php index d78aa56c60642..1eef91c5d91cf 100644 --- a/apps/settings/composer/composer/autoload_static.php +++ b/apps/settings/composer/composer/autoload_static.php @@ -57,6 +57,7 @@ class ComposerStaticInitSettings 'OCA\\Settings\\Middleware\\SubadminMiddleware' => __DIR__ . '/..' . '/../lib/Middleware/SubadminMiddleware.php', 'OCA\\Settings\\Search\\AppSearch' => __DIR__ . '/..' . '/../lib/Search/AppSearch.php', 'OCA\\Settings\\Search\\SectionSearch' => __DIR__ . '/..' . '/../lib/Search/SectionSearch.php', + 'OCA\\Settings\\Search\\UserSearch' => __DIR__ . '/..' . '/../lib/Search/UserSearch.php', 'OCA\\Settings\\Sections\\Admin\\Additional' => __DIR__ . '/..' . '/../lib/Sections/Admin/Additional.php', 'OCA\\Settings\\Sections\\Admin\\ArtificialIntelligence' => __DIR__ . '/..' . '/../lib/Sections/Admin/ArtificialIntelligence.php', 'OCA\\Settings\\Sections\\Admin\\Delegation' => __DIR__ . '/..' . '/../lib/Sections/Admin/Delegation.php', diff --git a/apps/settings/lib/AppInfo/Application.php b/apps/settings/lib/AppInfo/Application.php index 8d99f7f4f8687..c69826f7842a5 100644 --- a/apps/settings/lib/AppInfo/Application.php +++ b/apps/settings/lib/AppInfo/Application.php @@ -15,6 +15,7 @@ * @author Robin Appelman * @author Roeland Jago Douma * @author zulan + * @author Stephan Orbaugh * * @license AGPL-3.0 * @@ -46,6 +47,7 @@ use OCA\Settings\Middleware\SubadminMiddleware; use OCA\Settings\Search\AppSearch; use OCA\Settings\Search\SectionSearch; +use OCA\Settings\Search\UserSearch; use OCA\Settings\UserMigration\AccountMigrator; use OCA\Settings\WellKnown\ChangePasswordHandler; use OCA\Settings\WellKnown\SecurityTxtHandler; @@ -78,6 +80,7 @@ public function register(IRegistrationContext $context): void { $context->registerMiddleware(SubadminMiddleware::class); $context->registerSearchProvider(SectionSearch::class); $context->registerSearchProvider(AppSearch::class); + $context->registerSearchProvider(UserSearch::class); // Register listeners $context->registerEventListener(AppPasswordCreatedEvent::class, AppPasswordCreatedActivityListener::class); diff --git a/apps/settings/lib/Search/UserSearch.php b/apps/settings/lib/Search/UserSearch.php new file mode 100644 index 0000000000000..181d8554772f0 --- /dev/null +++ b/apps/settings/lib/Search/UserSearch.php @@ -0,0 +1,137 @@ + + * + * @author Stephan Orbaugh + * + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace OCA\Settings\Search; + +use OCP\Accounts\IAccountManager; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCS\OCSNotFoundException; +use OCP\IGroupManager; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserManager; +use OCP\Search\IProvider; +use OCP\Search\ISearchQuery; +use OCP\Search\SearchResult; +use OCP\Search\SearchResultEntry; +use OCP\Settings\IIconSection; +use OCP\Settings\IManager; + +class UserSearch implements IProvider { + + /** @var IManager */ + protected $settingsManager; + + /** @var IGroupManager */ + protected $groupManager; + + /** @var IURLGenerator */ + protected $urlGenerator; + + /** @var IL10N */ + protected $l; + + /** @var IUserManager */ + protected $userManager; + + /** @var IAccountManager */ + protected $accountManager; + + public function __construct(IManager $settingsManager, + IGroupManager $groupManager, + IURLGenerator $urlGenerator, + IUserManager $userManager, + IAccountManager $accountManager, + IL10N $l) { + $this->settingsManager = $settingsManager; + $this->groupManager = $groupManager; + $this->urlGenerator = $urlGenerator; + $this->userManager = $userManager; + $this->accountManager = $accountManager; + $this->l = $l; + } + + /** + * @inheritDoc + */ + public function getId(): string { + return 'users'; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->l->t('Users'); + } + + /** + * @inheritDoc + */ + public function getOrder(string $route, array $routeParameters): int { + return 300; + } + + /** + * @inheritDoc + */ + public function search(IUser $user, ISearchQuery $query): SearchResult { + + $users = $this->userManager->search($query->getTerm(), $query->getLimit(), 0); + + if (!$this->groupManager->isAdmin($user->getUID())) { + return SearchResult::complete( + $this->l->t('Users'), + [] + ); + } + + foreach ($users as $user) { + $targetUserObject = $this->userManager->get($user->getUid()); + + if ($targetUserObject === null) { + throw new OCSNotFoundException('User does not exist'); + } + + $userAccount = $this->accountManager->getAccount($targetUserObject); + $avatar = $userAccount->getProperty(IAccountManager::PROPERTY_AVATAR)->getScope(); + + $result[] = new SearchResultEntry( + '', + $targetUserObject->getDisplayName(), + $user->getUid(), + $this->urlGenerator->linkToRouteAbsolute('settings.Users.usersList'), + 'icon-user-dark' + ); + } + + return SearchResult::complete( + $this->l->t('Users'), + $result + ); + } +} diff --git a/apps/settings/src/store/users.js b/apps/settings/src/store/users.js index f780ecd88f56f..96e66044a0cae 100644 --- a/apps/settings/src/store/users.js +++ b/apps/settings/src/store/users.js @@ -8,6 +8,7 @@ * @author Julius Härtl * @author Roeland Jago Douma * @author Vincent Petry + * @author Stephan Orbaugh * * @license AGPL-3.0-or-later * @@ -310,6 +311,14 @@ const actions = { } searchRequestCancelSource = CancelToken.source() search = typeof search === 'string' ? search : '' + + /** + * Adding filters in the search bar such as in:files, in:users, etc. + * collides with this particular search, so we need to remove them + * here and leave only the original search query + */ + search = search.replace(/in:[^\s]+/g, '').trim() + group = typeof group === 'string' ? group : '' if (group !== '') { return api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), { From d657ded9bfb48240c4c1f91cf7d648f57da07eb2 Mon Sep 17 00:00:00 2001 From: sorbaugh Date: Wed, 13 Sep 2023 14:24:32 +0200 Subject: [PATCH 2/6] Keep Search Provider but remove actual search and display on the searchlist dialog. Will revisit in future search result list in future issue. Usage: 1. Type a string in the search bar 2. Add in:users filter to avoid unnecessary searches in other apps --- apps/settings/lib/Search/UserSearch.php | 30 +------------------------ 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/apps/settings/lib/Search/UserSearch.php b/apps/settings/lib/Search/UserSearch.php index 181d8554772f0..8ae2eeafaa8a5 100644 --- a/apps/settings/lib/Search/UserSearch.php +++ b/apps/settings/lib/Search/UserSearch.php @@ -101,37 +101,9 @@ public function getOrder(string $route, array $routeParameters): int { */ public function search(IUser $user, ISearchQuery $query): SearchResult { - $users = $this->userManager->search($query->getTerm(), $query->getLimit(), 0); - - if (!$this->groupManager->isAdmin($user->getUID())) { - return SearchResult::complete( - $this->l->t('Users'), - [] - ); - } - - foreach ($users as $user) { - $targetUserObject = $this->userManager->get($user->getUid()); - - if ($targetUserObject === null) { - throw new OCSNotFoundException('User does not exist'); - } - - $userAccount = $this->accountManager->getAccount($targetUserObject); - $avatar = $userAccount->getProperty(IAccountManager::PROPERTY_AVATAR)->getScope(); - - $result[] = new SearchResultEntry( - '', - $targetUserObject->getDisplayName(), - $user->getUid(), - $this->urlGenerator->linkToRouteAbsolute('settings.Users.usersList'), - 'icon-user-dark' - ); - } - return SearchResult::complete( $this->l->t('Users'), - $result + [] ); } } From 7709acb519e7b0a87553b6b638a3e162607235ea Mon Sep 17 00:00:00 2001 From: sorbaugh Date: Wed, 13 Sep 2023 14:24:32 +0200 Subject: [PATCH 3/6] Remove unneeded includes. Usage: 1. Type a string in the search bar 2. Add in:users filter to avoid unnecessary searches in other apps --- apps/settings/lib/Search/UserSearch.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/settings/lib/Search/UserSearch.php b/apps/settings/lib/Search/UserSearch.php index 8ae2eeafaa8a5..ad34befe9f3b7 100644 --- a/apps/settings/lib/Search/UserSearch.php +++ b/apps/settings/lib/Search/UserSearch.php @@ -27,8 +27,6 @@ namespace OCA\Settings\Search; use OCP\Accounts\IAccountManager; -use OCP\AppFramework\Http\DataResponse; -use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\IGroupManager; use OCP\IL10N; use OCP\IURLGenerator; @@ -37,8 +35,6 @@ use OCP\Search\IProvider; use OCP\Search\ISearchQuery; use OCP\Search\SearchResult; -use OCP\Search\SearchResultEntry; -use OCP\Settings\IIconSection; use OCP\Settings\IManager; class UserSearch implements IProvider { From 9a2966e73e5bf84adae61a18a59ca69bdb55a861 Mon Sep 17 00:00:00 2001 From: sorbaugh Date: Wed, 11 Oct 2023 12:23:14 +0200 Subject: [PATCH 4/6] remove unused properties Signed-off-by: sorbaugh --- apps/settings/lib/Search/UserSearch.php | 30 +------------------------ 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/apps/settings/lib/Search/UserSearch.php b/apps/settings/lib/Search/UserSearch.php index ad34befe9f3b7..1b96d761916ee 100644 --- a/apps/settings/lib/Search/UserSearch.php +++ b/apps/settings/lib/Search/UserSearch.php @@ -26,48 +26,20 @@ */ namespace OCA\Settings\Search; -use OCP\Accounts\IAccountManager; -use OCP\IGroupManager; use OCP\IL10N; -use OCP\IURLGenerator; use OCP\IUser; -use OCP\IUserManager; use OCP\Search\IProvider; use OCP\Search\ISearchQuery; use OCP\Search\SearchResult; -use OCP\Settings\IManager; class UserSearch implements IProvider { - /** @var IManager */ - protected $settingsManager; - - /** @var IGroupManager */ - protected $groupManager; - - /** @var IURLGenerator */ - protected $urlGenerator; /** @var IL10N */ protected $l; - /** @var IUserManager */ - protected $userManager; - - /** @var IAccountManager */ - protected $accountManager; - - public function __construct(IManager $settingsManager, - IGroupManager $groupManager, - IURLGenerator $urlGenerator, - IUserManager $userManager, - IAccountManager $accountManager, + public function __construct( IL10N $l) { - $this->settingsManager = $settingsManager; - $this->groupManager = $groupManager; - $this->urlGenerator = $urlGenerator; - $this->userManager = $userManager; - $this->accountManager = $accountManager; $this->l = $l; } From a27399b0baa2e617dce87ac895b7ff040ebaea36 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 11 Oct 2023 21:17:49 +0200 Subject: [PATCH 5/6] fix(meta): copyright note --- apps/settings/lib/Search/UserSearch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/settings/lib/Search/UserSearch.php b/apps/settings/lib/Search/UserSearch.php index 1b96d761916ee..24dd56c283c57 100644 --- a/apps/settings/lib/Search/UserSearch.php +++ b/apps/settings/lib/Search/UserSearch.php @@ -3,7 +3,7 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling + * @copyright Copyright (c) 2023 Stephan Orbaugh * * @author Stephan Orbaugh * From a83ef1226ed8980724ffaef01d28657b05372ea2 Mon Sep 17 00:00:00 2001 From: nextcloud-command Date: Thu, 12 Oct 2023 10:45:27 +0000 Subject: [PATCH 6/6] chore(assets): Recompile assets Signed-off-by: nextcloud-command --- dist/settings-vue-settings-apps-users-management.js | 4 ++-- ...settings-vue-settings-apps-users-management.js.LICENSE.txt | 1 + dist/settings-vue-settings-apps-users-management.js.map | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dist/settings-vue-settings-apps-users-management.js b/dist/settings-vue-settings-apps-users-management.js index 6fd55d7d5d847..1f99c5857200b 100644 --- a/dist/settings-vue-settings-apps-users-management.js +++ b/dist/settings-vue-settings-apps-users-management.js @@ -1,3 +1,3 @@ /*! For license information please see settings-vue-settings-apps-users-management.js.LICENSE.txt */ -(()=>{"use strict";var e,r,s,a={92652:(e,t,r)=>{r.d(t,{J:()=>a});var s=r(31352);const a=Object.freeze({enabled:(0,s.Iu)("settings","Active apps"),disabled:(0,s.Iu)("settings","Disabled apps"),updates:(0,s.Iu)("settings","Updates"),"app-bundles":(0,s.Iu)("settings","App bundles"),featured:(0,s.Iu)("settings","Featured apps"),supported:(0,s.Iu)("settings","Supported apps")})},9685:(e,r,s)=>{var a=s(20144),o=s(2324),i=s(83678);const d={name:"App",beforeMount(){null!==document.getElementById("serverData")&&this.$store.commit("setServerData",JSON.parse(document.getElementById("serverData").dataset.server))}},c=(0,s(51900).Z)(d,(function(){return(0,this._self._c)("router-view")}),[],!1,null,null,null).exports;var u=s(78345),p=s(79753),l=s(92652),m=s(20629),g=s(4820),h=s(10128);s(65509);const f=function(e){return e.replace(/\/$/,"")},A=()=>(0,h.confirmPassword)(),I=(e,t)=>g.default.get(f(e),t),y=(e,t)=>g.default.post(f(e),t),b=(e,t)=>g.default.put(f(e),t),U=(e,t)=>g.default.delete(f(e),{params:t}),v=(0,s(17499).IY)().setApp("settings").detectUser().build();var L=s(25108);const C=function(e,t){return 1===t?e.sort(((e,t)=>e.usercount-e.disablede.name.localeCompare(t.name)))},P={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},E={appendUsers(e,t){const r=e.users.concat(Object.keys(t).map((e=>t[e])));e.usersOffset+=e.usersLimit,e.users=r},setPasswordPolicyMinLength(e,t){e.minPasswordLength=""!==t?t:0},initGroups(e,t){let{groups:r,orderBy:s,userCount:a}=t;e.groups=r.map((e=>Object.assign({},P,e))),e.orderBy=s,e.userCount=a,e.groups=C(e.groups,e.orderBy)},addGroup(e,t){let{gid:r,displayName:s}=t;try{if(void 0!==e.groups.find((e=>e.id===r)))return;const t=Object.assign({},P,{id:r,name:s});e.groups.push(t),e.groups=C(e.groups,e.orderBy)}catch(e){L.error("Can't create group",e)}},renameGroup(e,t){let{gid:r,displayName:s}=t;const a=e.groups.findIndex((e=>e.id===r));if(a>=0){const t=e.groups[a];t.name=s,e.groups.splice(a,1,t),e.groups=C(e.groups,e.orderBy)}},removeGroup(e,t){const r=e.groups.findIndex((e=>e.id===t));r>=0&&e.groups.splice(r,1)},addUserGroup(e,t){let{userid:r,gid:s}=t;const a=e.groups.find((e=>e.id===s)),o=e.users.find((e=>e.id===r));a&&o.enabled&&e.userCount>0&&a.usercount++,o.groups.push(s),e.groups=C(e.groups,e.orderBy)},removeUserGroup(e,t){let{userid:r,gid:s}=t;const a=e.groups.find((e=>e.id===s)),o=e.users.find((e=>e.id===r));a&&o.enabled&&e.userCount>0&&a.usercount--;const i=o.groups;i.splice(i.indexOf(s),1),e.groups=C(e.groups,e.orderBy)},addUserSubAdmin(e,t){let{userid:r,gid:s}=t;e.users.find((e=>e.id===r)).subadmin.push(s)},removeUserSubAdmin(e,t){let{userid:r,gid:s}=t;const a=e.users.find((e=>e.id===r)).subadmin;a.splice(a.indexOf(s),1)},deleteUser(e,t){const r=e.users.findIndex((e=>e.id===t));this.commit("updateUserCounts",{user:e.users[r],actionType:"remove"}),e.users.splice(r,1)},addUserData(e,t){const r=t.data.ocs.data;e.users.push(r),this.commit("updateUserCounts",{user:r,actionType:"create"})},enableDisableUser(e,t){let{userid:r,enabled:s}=t;const a=e.users.find((e=>e.id===r));a.enabled=s,this.commit("updateUserCounts",{user:a,actionType:s?"enable":"disable"})},updateUserCounts(e,t){let{user:r,actionType:s}=t;if(0===e.userCount)return;const a=e.groups.find((e=>"disabled"===e.id));switch(s){case"enable":case"disable":a.usercount+=r.enabled?-1:1,e.userCount+=r.enabled?1:-1,r.groups.forEach((t=>{e.groups.find((e=>e.id===t)).disabled+=r.enabled?-1:1}));break;case"create":e.userCount++,r.groups.forEach((t=>{e.groups.find((e=>e.id===t)).usercount++}));break;case"remove":r.enabled?(e.userCount--,r.groups.forEach((t=>{const r=e.groups.find((e=>e.id===t));r?r.usercount--:L.warn("User group "+t+" does not exist during user removal")}))):(a.usercount--,r.groups.forEach((t=>{e.groups.find((e=>e.id===t)).disabled--})));break;default:v.error("Unknown action type in updateUserCounts: '".concat(s,"'"))}},setUserData(e,t){let{userid:r,key:s,value:a}=t;if("quota"===s){const t=OC.Util.computerFileSize(a);e.users.find((e=>e.id===r))[s][s]=null!==t?t:a}else e.users.find((e=>e.id===r))[s]=a},resetUsers(e){e.users=[],e.usersOffset=0}},w=g.default.CancelToken;let O=null;const _={state:{users:[],groups:[],orderBy:1,minPasswordLength:0,usersOffset:0,usersLimit:25,userCount:0},mutations:E,getters:{getUsers:e=>e.users,getGroups:e=>e.groups,getSubadminGroups:e=>e.groups.filter((e=>"admin"!==e.id&&"disabled"!==e.id)),getPasswordPolicyMinLength:e=>e.minPasswordLength,getUsersOffset:e=>e.usersOffset,getUsersLimit:e=>e.usersLimit,getUserCount:e=>e.userCount},actions:{searchUsers(e,t){let{offset:r,limit:s,search:a}=t;return a="string"==typeof a?a:"",I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:s,search:a})).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getUser:(e,t)=>I((0,p.generateOcsUrl)("cloud/users/".concat(t))).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)})),getUsers(e,t){let{offset:r,limit:s,search:a,group:o}=t;return O&&O.cancel("Operation canceled by another search request."),O=w.source(),a="string"==typeof a?a:"",o="string"==typeof o?o:"",""!==o?I((0,p.generateOcsUrl)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(o),offset:r,limit:s,search:a}),{cancelToken:O.token}).then((t=>{const r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)})):I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:s,search:a}),{cancelToken:O.token}).then((t=>{const r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getGroups(e,t){let{offset:r,limit:s,search:a}=t;a="string"==typeof a?a:"";const o=-1===s?"":"&limit=".concat(s);return I((0,p.generateOcsUrl)("cloud/groups?offset={offset}&search={search}",{offset:r,search:a})+o).then((t=>Object.keys(t.data.ocs.data.groups).length>0&&(t.data.ocs.data.groups.forEach((function(t){e.commit("addGroup",{gid:t,displayName:t})})),!0))).catch((t=>e.commit("API_FAILURE",t)))},getUsersFromList(e,t){let{offset:r,limit:s,search:a}=t;return a="string"==typeof a?a:"",I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:s,search:a})).then((t=>Object.keys(t.data.ocs.data.users).length>0&&(e.commit("appendUsers",t.data.ocs.data.users),!0))).catch((t=>e.commit("API_FAILURE",t)))},getUsersFromGroup(e,t){let{groupid:r,offset:s,limit:a}=t;return I((0,p.generateOcsUrl)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(r),offset:s,limit:a})).then((t=>e.commit("getUsersFromList",t.data.ocs.data.users))).catch((t=>e.commit("API_FAILURE",t)))},getPasswordPolicyMinLength:e=>!(!OC.getCapabilities().password_policy||!OC.getCapabilities().password_policy.minLength)&&(e.commit("setPasswordPolicyMinLength",OC.getCapabilities().password_policy.minLength),OC.getCapabilities().password_policy.minLength),addGroup:(e,t)=>A().then((r=>y((0,p.generateOcsUrl)("cloud/groups"),{groupid:t}).then((r=>(e.commit("addGroup",{gid:t,displayName:t}),{gid:t,displayName:t}))).catch((e=>{throw e})))).catch((r=>{throw e.commit("API_FAILURE",{gid:t,error:r}),r})),renameGroup(e,t){let{groupid:r,displayName:s}=t;return A().then((t=>b((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(r)}),{key:"displayname",value:s}).then((t=>(e.commit("renameGroup",{gid:r,displayName:s}),{groupid:r,displayName:s}))).catch((e=>{throw e})))).catch((t=>{throw e.commit("API_FAILURE",{groupid:r,error:t}),t}))},removeGroup:(e,t)=>A().then((r=>U((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(t)})).then((r=>e.commit("removeGroup",t))).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{gid:t,error:r}))),addUserGroup(e,t){let{userid:r,gid:s}=t;return A().then((t=>y((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:s}).then((t=>e.commit("addUserGroup",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},removeUserGroup(e,t){let{userid:r,gid:s}=t;return A().then((t=>U((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:s}).then((t=>e.commit("removeUserGroup",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>{throw e.commit("API_FAILURE",{userid:r,error:t}),t}))},addUserSubAdmin(e,t){let{userid:r,gid:s}=t;return A().then((t=>y((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:s}).then((t=>e.commit("addUserSubAdmin",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},removeUserSubAdmin(e,t){let{userid:r,gid:s}=t;return A().then((t=>U((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:s}).then((t=>e.commit("removeUserSubAdmin",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},wipeUserDevices:(e,t)=>A().then((e=>y((0,p.generateOcsUrl)("cloud/users/{userid}/wipe",{userid:t})).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r}))),deleteUser:(e,t)=>A().then((r=>U((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((r=>e.commit("deleteUser",t))).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r}))),addUser(e,t){let{commit:r,dispatch:s}=e,{userid:a,password:o,displayName:i,email:n,groups:d,subadmin:c,quota:u,language:l,manager:m}=t;return A().then((e=>y((0,p.generateOcsUrl)("cloud/users"),{userid:a,password:o,displayName:i,email:n,groups:d,subadmin:c,quota:u,language:l,manager:m}).then((e=>s("addUserData",a||e.data.ocs.data.id))).catch((e=>{throw e})))).catch((e=>{throw r("API_FAILURE",{userid:a,error:e}),e}))},addUserData:(e,t)=>A().then((r=>I((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((t=>e.commit("addUserData",t))).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r}))),enableDisableUser(e,t){let{userid:r,enabled:s=!0}=t;const a=s?"enable":"disable";return A().then((t=>b((0,p.generateOcsUrl)("cloud/users/{userid}/{userStatus}",{userid:r,userStatus:a})).then((t=>e.commit("enableDisableUser",{userid:r,enabled:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},setUserData(e,t){let{userid:r,key:s,value:a}=t;const o=["email","displayname","manager"];return-1!==["email","language","quota","displayname","password","manager"].indexOf(s)&&"string"==typeof a&&(-1===o.indexOf(s)&&a.length>0||-1!==o.indexOf(s))?A().then((t=>b((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:r}),{key:s,value:a}).then((t=>e.commit("setUserData",{userid:r,key:s,value:a}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t}))):Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:(e,t)=>A().then((e=>y((0,p.generateOcsUrl)("cloud/users/{userid}/welcome",{userid:t})).then((e=>!0)).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r})))}};var R=s(64024),D=(s(32316),s(25108));const F={APPS_API_FAILURE(e,r){(0,R.x2)(t("settings","An error occurred during the request. Unable to proceed.")+"
"+r.error.response.data.data.message,{isHTML:!0}),D.error(e,r)},initCategories(e,t){let{categories:r,updateCount:s}=t;e.categories=r,e.updateCount=s},updateCategories(e,t){e.gettingCategoriesPromise=t},setUpdateCount(e,t){e.updateCount=t},addCategory(e,t){e.categories.push(t)},appendCategories(e,t){e.categories=t},setAllApps(e,t){e.apps=t},setError(e,t){let{appId:r,error:s}=t;Array.isArray(r)||(r=[r]),r.forEach((t=>{e.apps.find((e=>e.id===t)).error=s}))},clearError(e,t){let{appId:r,error:s}=t;e.apps.find((e=>e.id===r)).error=null},enableApp(e,t){let{appId:r,groups:s}=t;const a=e.apps.find((e=>e.id===r));a.active=!0,a.groups=s},disableApp(e,t){const r=e.apps.find((e=>e.id===t));r.active=!1,r.groups=[],r.removable&&(r.canUnInstall=!0)},uninstallApp(e,t){e.apps.find((e=>e.id===t)).active=!1,e.apps.find((e=>e.id===t)).groups=[],e.apps.find((e=>e.id===t)).needsDownload=!0,e.apps.find((e=>e.id===t)).installed=!1,e.apps.find((e=>e.id===t)).canUnInstall=!1,e.apps.find((e=>e.id===t)).canInstall=!0},updateApp(e,t){const r=e.apps.find((e=>e.id===t)),s=r.update;r.update=null,r.version=s,e.updateCount--},resetApps(e){e.apps=[]},reset(e){e.apps=[],e.categories=[],e.updateCount=0},startLoading(e,t){Array.isArray(t)?t.forEach((t=>{a.default.set(e.loading,t,!0)})):a.default.set(e.loading,t,!0)},stopLoading(e,t){Array.isArray(t)?t.forEach((t=>{a.default.set(e.loading,t,!1)})):a.default.set(e.loading,t,!1)}},k={enableApp(e,r){let s,{appId:a,groups:o}=r;return s=Array.isArray(a)?a:[a],A().then((r=>(e.commit("startLoading",s),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/enable"),{appIds:s,groups:o}).then((r=>(e.commit("stopLoading",s),e.commit("stopLoading","install"),s.forEach((t=>{e.commit("enableApp",{appId:t,groups:o})})),I((0,p.generateUrl)("apps/files")).then((()=>{r.data.update_required&&((0,R.WY)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:()=>window.location.reload(),close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((()=>{Array.isArray(a)||e.commit("setError",{appId:s,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")})}))))).catch((t=>{e.commit("stopLoading",s),e.commit("stopLoading","install"),e.commit("setError",{appId:s,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:a,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:a,error:t})))},forceEnableApp(e,t){let r,{appId:s,groups:a}=t;return r=Array.isArray(s)?s:[s],A().then((()=>(e.commit("startLoading",r),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/force"),{appId:s}).then((e=>{location.reload()})).catch((t=>{e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:s,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:s,error:t})))},disableApp(e,t){let r,{appId:s}=t;return r=Array.isArray(s)?s:[s],A().then((t=>(e.commit("startLoading",r),y((0,p.generateUrl)("settings/apps/disable"),{appIds:r}).then((t=>(e.commit("stopLoading",r),r.forEach((t=>{e.commit("disableApp",t)})),!0))).catch((t=>{e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:s,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:s,error:t})))},uninstallApp(e,t){let{appId:r}=t;return A().then((t=>(e.commit("startLoading",r),I((0,p.generateUrl)("settings/apps/uninstall/".concat(r))).then((t=>(e.commit("stopLoading",r),e.commit("uninstallApp",r),!0))).catch((t=>{e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:r,error:t})))},updateApp(e,t){let{appId:r}=t;return A().then((t=>(e.commit("startLoading",r),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/update/".concat(r))).then((t=>(e.commit("stopLoading","install"),e.commit("stopLoading",r),e.commit("updateApp",r),!0))).catch((t=>{e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:r,error:t})))},getAllApps:e=>(e.commit("startLoading","list"),I((0,p.generateUrl)("settings/apps/list")).then((t=>(e.commit("setAllApps",t.data.apps),e.commit("stopLoading","list"),!0))).catch((t=>e.commit("API_FAILURE",t)))),async getCategories(e){let{shouldRefetchCategories:t=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t||!e.state.gettingCategoriesPromise){e.commit("startLoading","categories");try{const t=I((0,p.generateUrl)("settings/apps/categories"));e.commit("updateCategories",t);const r=await t;return r.data.length>0?(e.commit("appendCategories",r.data),e.commit("stopLoading","categories"),!0):(e.commit("stopLoading","categories"),!1)}catch(t){e.commit("API_FAILURE",t)}}return e.state.gettingCategoriesPromise}},M={state:{apps:[],categories:[],updateCount:0,loading:{},loadingList:!1,gettingCategoriesPromise:null},mutations:F,getters:{loading:e=>function(t){return e.loading[t]},getCategories:e=>e.categories,getAllApps:e=>e.apps,getUpdateCount:e=>e.updateCount,getCategoryById:e=>t=>e.categories.find((e=>e.id===t))},actions:k},x={state:{serverData:{}},mutations:{setServerData(e,t){e.serverData=t}},getters:{getServerData:e=>e.serverData},actions:{}},j={state:{},mutations:{},getters:{},actions:{setAppConfig(e,t){let{app:r,key:s,value:a}=t;return A().then((e=>y((0,p.generateOcsUrl)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:r,key:s}),{value:a}).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{app:r,key:s,value:a,error:t})))}}};var N=s(25108);a.default.use(m.ZP);const S={API_FAILURE(e,r){try{const e=r.error.response.data.ocs.meta.message;(0,R.x2)(t("settings","An error occurred during the request. Unable to proceed.")+"
"+e,{isHTML:!0})}catch(e){(0,R.x2)(t("settings","An error occurred during the request. Unable to proceed."))}N.error(e,r)}},T=new m.yh({modules:{users:_,apps:M,settings:x,oc:j},strict:!1,mutations:S});s(79954);const G=()=>Promise.all([s.e(7874),s.e(8351)]).then(s.bind(s,48753)),B=()=>Promise.all([s.e(7874),s.e(7418)]).then(s.bind(s,39789));a.default.use(u.ZP);const Z=document.title,z=new u.ZP({mode:"history",base:(0,p.generateUrl)(""),linkActiveClass:"active",routes:[{path:"/:index(index.php/)?settings/users",component:G,props:!0,name:"users",meta:{title:()=>t("settings","Active users")},children:[{path:":selectedGroup",name:"group",meta:{title:e=>"admin"===e.params.selectedGroup?t("settings","Admins"):"disabled"===e.params.selectedGroup?t("settings","Disabled users"):decodeURIComponent(e.params.selectedGroup)},component:G}]},{path:"/:index(index.php/)?settings/apps",component:B,props:!0,name:"apps",meta:{title:()=>t("settings","Your apps")},children:[{path:":category",name:"apps-category",meta:{title:async e=>{if("apps"===e.name)return t("settings","Your apps");if(l.J[e.params.category])return l.J[e.params.category];await T.dispatch("getCategories");const r=T.getters.getCategoryById(e.params.category);return r.displayName?r.displayName:void 0}},component:B,children:[{path:":id",name:"apps-details",component:B}]}]}]});z.afterEach((async e=>{var t,r;const s=await(null===(t=(r=e.meta).title)||void 0===t?void 0:t.call(r,e));s?(document.title="".concat(s," - ").concat(Z),function(e){const t=document.getElementById("page-heading-level-1");t&&(t.textContent=e)}(s)):document.title=Z}));const H=z;a.default.use(o.default,{defaultHtml:!1}),(0,i.Z)(T,H),s.nc=btoa(OC.requestToken),a.default.prototype.t=t,a.default.prototype.n=n,a.default.prototype.OC=OC,a.default.prototype.OCA=OCA,a.default.prototype.oc_userconfig=oc_userconfig,new a.default({router:H,store:T,render:e=>e(c)}).$mount("#content")},81490:e=>{e.exports="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+CiAgPHBhdGggZD0iTTE0IDEyLjNMMTIuMyAxNCA4IDkuNyAzLjcgMTQgMiAxMi4zIDYuMyA4IDIgMy43IDMuNyAyIDggNi4zIDEyLjMgMiAxNCAzLjcgOS43IDh6Ii8+Cjwvc3ZnPgo="},90888:e=>{e.exports="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+CiAgPHBhdGggZD0iTTE0IDEyLjNMMTIuMyAxNCA4IDkuNyAzLjcgMTQgMiAxMi4zIDYuMyA4IDIgMy43IDMuNyAyIDggNi4zIDEyLjMgMiAxNCAzLjcgOS43IDh6IiBzdHlsZT0iZmlsbC1vcGFjaXR5OjE7ZmlsbDojZmZmZmZmIi8+Cjwvc3ZnPgo="}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={id:e,loaded:!1,exports:{}};return a[e].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=a,e=[],i.O=(t,r,s,a)=>{if(!r){var o=1/0;for(u=0;u=a)&&Object.keys(i.O).every((e=>i.O[e](r[d])))?r.splice(d--,1):(n=!1,a0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[r,s,a]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>(({7418:"settings-apps-view",8351:"settings-users"}[e]||e)+"-"+e+".js?v="+{6799:"00434e4baa0d8e7b79f1",7418:"4ade86747cf564489847",8351:"8b7284eb096e5c63052f"}[e]),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},s="nextcloud:",i.l=(e,t,a,o)=>{if(r[e])r[e].push(t);else{var n,d;if(void 0!==a)for(var c=document.getElementsByTagName("script"),u=0;u{n.onerror=n.onload=null,clearTimeout(m);var a=r[e];if(delete r[e],n.parentNode&&n.parentNode.removeChild(n),a&&a.forEach((e=>e(s))),t)return t(s)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:n}),12e4);n.onerror=l.bind(null,n.onerror),n.onload=l.bind(null,n.onload),d&&document.head.appendChild(n)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),i.j=8562,(()=>{var e;i.g.importScripts&&(e=i.g.location+"");var t=i.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=e})(),(()=>{i.b=document.baseURI||self.location.href;var e={8562:0};i.f.j=(t,r)=>{var s=i.o(e,t)?e[t]:void 0;if(0!==s)if(s)r.push(s[2]);else{var a=new Promise(((r,a)=>s=e[t]=[r,a]));r.push(s[2]=a);var o=i.p+i.u(t),n=new Error;i.l(o,(r=>{if(i.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var a=r&&("load"===r.type?"missing":r.type),o=r&&r.target&&r.target.src;n.message="Loading chunk "+t+" failed.\n("+a+": "+o+")",n.name="ChunkLoadError",n.type=a,n.request=o,s[1](n)}}),"chunk-"+t,t)}},i.O.j=t=>0===e[t];var t=(t,r)=>{var s,a,o=r[0],n=r[1],d=r[2],c=0;if(o.some((t=>0!==e[t]))){for(s in n)i.o(n,s)&&(i.m[s]=n[s]);if(d)var u=d(i)}for(t&&t(r);ci(9685)));d=i.O(d)})(); -//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=dcc51f8a0ed4ef4a234d \ No newline at end of file +(()=>{"use strict";var e,r,s,a={92652:(e,t,r)=>{r.d(t,{J:()=>a});var s=r(31352);const a=Object.freeze({enabled:(0,s.Iu)("settings","Active apps"),disabled:(0,s.Iu)("settings","Disabled apps"),updates:(0,s.Iu)("settings","Updates"),"app-bundles":(0,s.Iu)("settings","App bundles"),featured:(0,s.Iu)("settings","Featured apps"),supported:(0,s.Iu)("settings","Supported apps")})},9685:(e,r,s)=>{var a=s(20144),o=s(2324),i=s(83678);const d={name:"App",beforeMount(){null!==document.getElementById("serverData")&&this.$store.commit("setServerData",JSON.parse(document.getElementById("serverData").dataset.server))}},c=(0,s(51900).Z)(d,(function(){return(0,this._self._c)("router-view")}),[],!1,null,null,null).exports;var u=s(78345),p=s(79753),l=s(92652),m=s(20629),g=s(4820),h=s(10128);s(65509);const f=function(e){return e.replace(/\/$/,"")},A=()=>(0,h.confirmPassword)(),I=(e,t)=>g.default.get(f(e),t),y=(e,t)=>g.default.post(f(e),t),b=(e,t)=>g.default.put(f(e),t),U=(e,t)=>g.default.delete(f(e),{params:t}),v=(0,s(17499).IY)().setApp("settings").detectUser().build();var L=s(25108);const C=function(e,t){return 1===t?e.sort(((e,t)=>e.usercount-e.disablede.name.localeCompare(t.name)))},P={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},E={appendUsers(e,t){const r=e.users.concat(Object.keys(t).map((e=>t[e])));e.usersOffset+=e.usersLimit,e.users=r},setPasswordPolicyMinLength(e,t){e.minPasswordLength=""!==t?t:0},initGroups(e,t){let{groups:r,orderBy:s,userCount:a}=t;e.groups=r.map((e=>Object.assign({},P,e))),e.orderBy=s,e.userCount=a,e.groups=C(e.groups,e.orderBy)},addGroup(e,t){let{gid:r,displayName:s}=t;try{if(void 0!==e.groups.find((e=>e.id===r)))return;const t=Object.assign({},P,{id:r,name:s});e.groups.push(t),e.groups=C(e.groups,e.orderBy)}catch(e){L.error("Can't create group",e)}},renameGroup(e,t){let{gid:r,displayName:s}=t;const a=e.groups.findIndex((e=>e.id===r));if(a>=0){const t=e.groups[a];t.name=s,e.groups.splice(a,1,t),e.groups=C(e.groups,e.orderBy)}},removeGroup(e,t){const r=e.groups.findIndex((e=>e.id===t));r>=0&&e.groups.splice(r,1)},addUserGroup(e,t){let{userid:r,gid:s}=t;const a=e.groups.find((e=>e.id===s)),o=e.users.find((e=>e.id===r));a&&o.enabled&&e.userCount>0&&a.usercount++,o.groups.push(s),e.groups=C(e.groups,e.orderBy)},removeUserGroup(e,t){let{userid:r,gid:s}=t;const a=e.groups.find((e=>e.id===s)),o=e.users.find((e=>e.id===r));a&&o.enabled&&e.userCount>0&&a.usercount--;const i=o.groups;i.splice(i.indexOf(s),1),e.groups=C(e.groups,e.orderBy)},addUserSubAdmin(e,t){let{userid:r,gid:s}=t;e.users.find((e=>e.id===r)).subadmin.push(s)},removeUserSubAdmin(e,t){let{userid:r,gid:s}=t;const a=e.users.find((e=>e.id===r)).subadmin;a.splice(a.indexOf(s),1)},deleteUser(e,t){const r=e.users.findIndex((e=>e.id===t));this.commit("updateUserCounts",{user:e.users[r],actionType:"remove"}),e.users.splice(r,1)},addUserData(e,t){const r=t.data.ocs.data;e.users.push(r),this.commit("updateUserCounts",{user:r,actionType:"create"})},enableDisableUser(e,t){let{userid:r,enabled:s}=t;const a=e.users.find((e=>e.id===r));a.enabled=s,this.commit("updateUserCounts",{user:a,actionType:s?"enable":"disable"})},updateUserCounts(e,t){let{user:r,actionType:s}=t;if(0===e.userCount)return;const a=e.groups.find((e=>"disabled"===e.id));switch(s){case"enable":case"disable":a.usercount+=r.enabled?-1:1,e.userCount+=r.enabled?1:-1,r.groups.forEach((t=>{e.groups.find((e=>e.id===t)).disabled+=r.enabled?-1:1}));break;case"create":e.userCount++,r.groups.forEach((t=>{e.groups.find((e=>e.id===t)).usercount++}));break;case"remove":r.enabled?(e.userCount--,r.groups.forEach((t=>{const r=e.groups.find((e=>e.id===t));r?r.usercount--:L.warn("User group "+t+" does not exist during user removal")}))):(a.usercount--,r.groups.forEach((t=>{e.groups.find((e=>e.id===t)).disabled--})));break;default:v.error("Unknown action type in updateUserCounts: '".concat(s,"'"))}},setUserData(e,t){let{userid:r,key:s,value:a}=t;if("quota"===s){const t=OC.Util.computerFileSize(a);e.users.find((e=>e.id===r))[s][s]=null!==t?t:a}else e.users.find((e=>e.id===r))[s]=a},resetUsers(e){e.users=[],e.usersOffset=0}},w=g.default.CancelToken;let O=null;const _={state:{users:[],groups:[],orderBy:1,minPasswordLength:0,usersOffset:0,usersLimit:25,userCount:0},mutations:E,getters:{getUsers:e=>e.users,getGroups:e=>e.groups,getSubadminGroups:e=>e.groups.filter((e=>"admin"!==e.id&&"disabled"!==e.id)),getPasswordPolicyMinLength:e=>e.minPasswordLength,getUsersOffset:e=>e.usersOffset,getUsersLimit:e=>e.usersLimit,getUserCount:e=>e.userCount},actions:{searchUsers(e,t){let{offset:r,limit:s,search:a}=t;return a="string"==typeof a?a:"",I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:s,search:a})).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getUser:(e,t)=>I((0,p.generateOcsUrl)("cloud/users/".concat(t))).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)})),getUsers(e,t){let{offset:r,limit:s,search:a,group:o}=t;return O&&O.cancel("Operation canceled by another search request."),O=w.source(),a="string"==typeof a?a:"",a=a.replace(/in:[^\s]+/g,"").trim(),o="string"==typeof o?o:"",""!==o?I((0,p.generateOcsUrl)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(o),offset:r,limit:s,search:a}),{cancelToken:O.token}).then((t=>{const r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)})):I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:s,search:a}),{cancelToken:O.token}).then((t=>{const r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((t=>{g.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getGroups(e,t){let{offset:r,limit:s,search:a}=t;a="string"==typeof a?a:"";const o=-1===s?"":"&limit=".concat(s);return I((0,p.generateOcsUrl)("cloud/groups?offset={offset}&search={search}",{offset:r,search:a})+o).then((t=>Object.keys(t.data.ocs.data.groups).length>0&&(t.data.ocs.data.groups.forEach((function(t){e.commit("addGroup",{gid:t,displayName:t})})),!0))).catch((t=>e.commit("API_FAILURE",t)))},getUsersFromList(e,t){let{offset:r,limit:s,search:a}=t;return a="string"==typeof a?a:"",I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:s,search:a})).then((t=>Object.keys(t.data.ocs.data.users).length>0&&(e.commit("appendUsers",t.data.ocs.data.users),!0))).catch((t=>e.commit("API_FAILURE",t)))},getUsersFromGroup(e,t){let{groupid:r,offset:s,limit:a}=t;return I((0,p.generateOcsUrl)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(r),offset:s,limit:a})).then((t=>e.commit("getUsersFromList",t.data.ocs.data.users))).catch((t=>e.commit("API_FAILURE",t)))},getPasswordPolicyMinLength:e=>!(!OC.getCapabilities().password_policy||!OC.getCapabilities().password_policy.minLength)&&(e.commit("setPasswordPolicyMinLength",OC.getCapabilities().password_policy.minLength),OC.getCapabilities().password_policy.minLength),addGroup:(e,t)=>A().then((r=>y((0,p.generateOcsUrl)("cloud/groups"),{groupid:t}).then((r=>(e.commit("addGroup",{gid:t,displayName:t}),{gid:t,displayName:t}))).catch((e=>{throw e})))).catch((r=>{throw e.commit("API_FAILURE",{gid:t,error:r}),r})),renameGroup(e,t){let{groupid:r,displayName:s}=t;return A().then((t=>b((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(r)}),{key:"displayname",value:s}).then((t=>(e.commit("renameGroup",{gid:r,displayName:s}),{groupid:r,displayName:s}))).catch((e=>{throw e})))).catch((t=>{throw e.commit("API_FAILURE",{groupid:r,error:t}),t}))},removeGroup:(e,t)=>A().then((r=>U((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(t)})).then((r=>e.commit("removeGroup",t))).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{gid:t,error:r}))),addUserGroup(e,t){let{userid:r,gid:s}=t;return A().then((t=>y((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:s}).then((t=>e.commit("addUserGroup",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},removeUserGroup(e,t){let{userid:r,gid:s}=t;return A().then((t=>U((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:s}).then((t=>e.commit("removeUserGroup",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>{throw e.commit("API_FAILURE",{userid:r,error:t}),t}))},addUserSubAdmin(e,t){let{userid:r,gid:s}=t;return A().then((t=>y((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:s}).then((t=>e.commit("addUserSubAdmin",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},removeUserSubAdmin(e,t){let{userid:r,gid:s}=t;return A().then((t=>U((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:s}).then((t=>e.commit("removeUserSubAdmin",{userid:r,gid:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},wipeUserDevices:(e,t)=>A().then((e=>y((0,p.generateOcsUrl)("cloud/users/{userid}/wipe",{userid:t})).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r}))),deleteUser:(e,t)=>A().then((r=>U((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((r=>e.commit("deleteUser",t))).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r}))),addUser(e,t){let{commit:r,dispatch:s}=e,{userid:a,password:o,displayName:i,email:n,groups:d,subadmin:c,quota:u,language:l,manager:m}=t;return A().then((e=>y((0,p.generateOcsUrl)("cloud/users"),{userid:a,password:o,displayName:i,email:n,groups:d,subadmin:c,quota:u,language:l,manager:m}).then((e=>s("addUserData",a||e.data.ocs.data.id))).catch((e=>{throw e})))).catch((e=>{throw r("API_FAILURE",{userid:a,error:e}),e}))},addUserData:(e,t)=>A().then((r=>I((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((t=>e.commit("addUserData",t))).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r}))),enableDisableUser(e,t){let{userid:r,enabled:s=!0}=t;const a=s?"enable":"disable";return A().then((t=>b((0,p.generateOcsUrl)("cloud/users/{userid}/{userStatus}",{userid:r,userStatus:a})).then((t=>e.commit("enableDisableUser",{userid:r,enabled:s}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t})))},setUserData(e,t){let{userid:r,key:s,value:a}=t;const o=["email","displayname","manager"];return-1!==["email","language","quota","displayname","password","manager"].indexOf(s)&&"string"==typeof a&&(-1===o.indexOf(s)&&a.length>0||-1!==o.indexOf(s))?A().then((t=>b((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:r}),{key:s,value:a}).then((t=>e.commit("setUserData",{userid:r,key:s,value:a}))).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{userid:r,error:t}))):Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:(e,t)=>A().then((e=>y((0,p.generateOcsUrl)("cloud/users/{userid}/welcome",{userid:t})).then((e=>!0)).catch((e=>{throw e})))).catch((r=>e.commit("API_FAILURE",{userid:t,error:r})))}};var R=s(64024),D=(s(32316),s(25108));const F={APPS_API_FAILURE(e,r){(0,R.x2)(t("settings","An error occurred during the request. Unable to proceed.")+"
"+r.error.response.data.data.message,{isHTML:!0}),D.error(e,r)},initCategories(e,t){let{categories:r,updateCount:s}=t;e.categories=r,e.updateCount=s},updateCategories(e,t){e.gettingCategoriesPromise=t},setUpdateCount(e,t){e.updateCount=t},addCategory(e,t){e.categories.push(t)},appendCategories(e,t){e.categories=t},setAllApps(e,t){e.apps=t},setError(e,t){let{appId:r,error:s}=t;Array.isArray(r)||(r=[r]),r.forEach((t=>{e.apps.find((e=>e.id===t)).error=s}))},clearError(e,t){let{appId:r,error:s}=t;e.apps.find((e=>e.id===r)).error=null},enableApp(e,t){let{appId:r,groups:s}=t;const a=e.apps.find((e=>e.id===r));a.active=!0,a.groups=s},disableApp(e,t){const r=e.apps.find((e=>e.id===t));r.active=!1,r.groups=[],r.removable&&(r.canUnInstall=!0)},uninstallApp(e,t){e.apps.find((e=>e.id===t)).active=!1,e.apps.find((e=>e.id===t)).groups=[],e.apps.find((e=>e.id===t)).needsDownload=!0,e.apps.find((e=>e.id===t)).installed=!1,e.apps.find((e=>e.id===t)).canUnInstall=!1,e.apps.find((e=>e.id===t)).canInstall=!0},updateApp(e,t){const r=e.apps.find((e=>e.id===t)),s=r.update;r.update=null,r.version=s,e.updateCount--},resetApps(e){e.apps=[]},reset(e){e.apps=[],e.categories=[],e.updateCount=0},startLoading(e,t){Array.isArray(t)?t.forEach((t=>{a.default.set(e.loading,t,!0)})):a.default.set(e.loading,t,!0)},stopLoading(e,t){Array.isArray(t)?t.forEach((t=>{a.default.set(e.loading,t,!1)})):a.default.set(e.loading,t,!1)}},k={enableApp(e,r){let s,{appId:a,groups:o}=r;return s=Array.isArray(a)?a:[a],A().then((r=>(e.commit("startLoading",s),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/enable"),{appIds:s,groups:o}).then((r=>(e.commit("stopLoading",s),e.commit("stopLoading","install"),s.forEach((t=>{e.commit("enableApp",{appId:t,groups:o})})),I((0,p.generateUrl)("apps/files")).then((()=>{r.data.update_required&&((0,R.WY)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:()=>window.location.reload(),close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((()=>{Array.isArray(a)||e.commit("setError",{appId:s,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")})}))))).catch((t=>{e.commit("stopLoading",s),e.commit("stopLoading","install"),e.commit("setError",{appId:s,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:a,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:a,error:t})))},forceEnableApp(e,t){let r,{appId:s,groups:a}=t;return r=Array.isArray(s)?s:[s],A().then((()=>(e.commit("startLoading",r),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/force"),{appId:s}).then((e=>{location.reload()})).catch((t=>{e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:s,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:s,error:t})))},disableApp(e,t){let r,{appId:s}=t;return r=Array.isArray(s)?s:[s],A().then((t=>(e.commit("startLoading",r),y((0,p.generateUrl)("settings/apps/disable"),{appIds:r}).then((t=>(e.commit("stopLoading",r),r.forEach((t=>{e.commit("disableApp",t)})),!0))).catch((t=>{e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:s,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:s,error:t})))},uninstallApp(e,t){let{appId:r}=t;return A().then((t=>(e.commit("startLoading",r),I((0,p.generateUrl)("settings/apps/uninstall/".concat(r))).then((t=>(e.commit("stopLoading",r),e.commit("uninstallApp",r),!0))).catch((t=>{e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:r,error:t})))},updateApp(e,t){let{appId:r}=t;return A().then((t=>(e.commit("startLoading",r),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/update/".concat(r))).then((t=>(e.commit("stopLoading","install"),e.commit("stopLoading",r),e.commit("updateApp",r),!0))).catch((t=>{e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:r,error:t})))},getAllApps:e=>(e.commit("startLoading","list"),I((0,p.generateUrl)("settings/apps/list")).then((t=>(e.commit("setAllApps",t.data.apps),e.commit("stopLoading","list"),!0))).catch((t=>e.commit("API_FAILURE",t)))),async getCategories(e){let{shouldRefetchCategories:t=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t||!e.state.gettingCategoriesPromise){e.commit("startLoading","categories");try{const t=I((0,p.generateUrl)("settings/apps/categories"));e.commit("updateCategories",t);const r=await t;return r.data.length>0?(e.commit("appendCategories",r.data),e.commit("stopLoading","categories"),!0):(e.commit("stopLoading","categories"),!1)}catch(t){e.commit("API_FAILURE",t)}}return e.state.gettingCategoriesPromise}},M={state:{apps:[],categories:[],updateCount:0,loading:{},loadingList:!1,gettingCategoriesPromise:null},mutations:F,getters:{loading:e=>function(t){return e.loading[t]},getCategories:e=>e.categories,getAllApps:e=>e.apps,getUpdateCount:e=>e.updateCount,getCategoryById:e=>t=>e.categories.find((e=>e.id===t))},actions:k},x={state:{serverData:{}},mutations:{setServerData(e,t){e.serverData=t}},getters:{getServerData:e=>e.serverData},actions:{}},j={state:{},mutations:{},getters:{},actions:{setAppConfig(e,t){let{app:r,key:s,value:a}=t;return A().then((e=>y((0,p.generateOcsUrl)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:r,key:s}),{value:a}).catch((e=>{throw e})))).catch((t=>e.commit("API_FAILURE",{app:r,key:s,value:a,error:t})))}}};var N=s(25108);a.default.use(m.ZP);const S={API_FAILURE(e,r){try{const e=r.error.response.data.ocs.meta.message;(0,R.x2)(t("settings","An error occurred during the request. Unable to proceed.")+"
"+e,{isHTML:!0})}catch(e){(0,R.x2)(t("settings","An error occurred during the request. Unable to proceed."))}N.error(e,r)}},T=new m.yh({modules:{users:_,apps:M,settings:x,oc:j},strict:!1,mutations:S});s(79954);const G=()=>Promise.all([s.e(7874),s.e(8351)]).then(s.bind(s,48753)),B=()=>Promise.all([s.e(7874),s.e(7418)]).then(s.bind(s,39789));a.default.use(u.ZP);const Z=document.title,z=new u.ZP({mode:"history",base:(0,p.generateUrl)(""),linkActiveClass:"active",routes:[{path:"/:index(index.php/)?settings/users",component:G,props:!0,name:"users",meta:{title:()=>t("settings","Active users")},children:[{path:":selectedGroup",name:"group",meta:{title:e=>"admin"===e.params.selectedGroup?t("settings","Admins"):"disabled"===e.params.selectedGroup?t("settings","Disabled users"):decodeURIComponent(e.params.selectedGroup)},component:G}]},{path:"/:index(index.php/)?settings/apps",component:B,props:!0,name:"apps",meta:{title:()=>t("settings","Your apps")},children:[{path:":category",name:"apps-category",meta:{title:async e=>{if("apps"===e.name)return t("settings","Your apps");if(l.J[e.params.category])return l.J[e.params.category];await T.dispatch("getCategories");const r=T.getters.getCategoryById(e.params.category);return r.displayName?r.displayName:void 0}},component:B,children:[{path:":id",name:"apps-details",component:B}]}]}]});z.afterEach((async e=>{var t,r;const s=await(null===(t=(r=e.meta).title)||void 0===t?void 0:t.call(r,e));s?(document.title="".concat(s," - ").concat(Z),function(e){const t=document.getElementById("page-heading-level-1");t&&(t.textContent=e)}(s)):document.title=Z}));const H=z;a.default.use(o.default,{defaultHtml:!1}),(0,i.Z)(T,H),s.nc=btoa(OC.requestToken),a.default.prototype.t=t,a.default.prototype.n=n,a.default.prototype.OC=OC,a.default.prototype.OCA=OCA,a.default.prototype.oc_userconfig=oc_userconfig,new a.default({router:H,store:T,render:e=>e(c)}).$mount("#content")},81490:e=>{e.exports="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+CiAgPHBhdGggZD0iTTE0IDEyLjNMMTIuMyAxNCA4IDkuNyAzLjcgMTQgMiAxMi4zIDYuMyA4IDIgMy43IDMuNyAyIDggNi4zIDEyLjMgMiAxNCAzLjcgOS43IDh6Ii8+Cjwvc3ZnPgo="},90888:e=>{e.exports="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+CiAgPHBhdGggZD0iTTE0IDEyLjNMMTIuMyAxNCA4IDkuNyAzLjcgMTQgMiAxMi4zIDYuMyA4IDIgMy43IDMuNyAyIDggNi4zIDEyLjMgMiAxNCAzLjcgOS43IDh6IiBzdHlsZT0iZmlsbC1vcGFjaXR5OjE7ZmlsbDojZmZmZmZmIi8+Cjwvc3ZnPgo="}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={id:e,loaded:!1,exports:{}};return a[e].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=a,e=[],i.O=(t,r,s,a)=>{if(!r){var o=1/0;for(u=0;u=a)&&Object.keys(i.O).every((e=>i.O[e](r[d])))?r.splice(d--,1):(n=!1,a0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[r,s,a]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>(({7418:"settings-apps-view",8351:"settings-users"}[e]||e)+"-"+e+".js?v="+{6799:"00434e4baa0d8e7b79f1",7418:"4ade86747cf564489847",8351:"8b7284eb096e5c63052f"}[e]),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},s="nextcloud:",i.l=(e,t,a,o)=>{if(r[e])r[e].push(t);else{var n,d;if(void 0!==a)for(var c=document.getElementsByTagName("script"),u=0;u{n.onerror=n.onload=null,clearTimeout(m);var a=r[e];if(delete r[e],n.parentNode&&n.parentNode.removeChild(n),a&&a.forEach((e=>e(s))),t)return t(s)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:n}),12e4);n.onerror=l.bind(null,n.onerror),n.onload=l.bind(null,n.onload),d&&document.head.appendChild(n)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),i.j=8562,(()=>{var e;i.g.importScripts&&(e=i.g.location+"");var t=i.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=e})(),(()=>{i.b=document.baseURI||self.location.href;var e={8562:0};i.f.j=(t,r)=>{var s=i.o(e,t)?e[t]:void 0;if(0!==s)if(s)r.push(s[2]);else{var a=new Promise(((r,a)=>s=e[t]=[r,a]));r.push(s[2]=a);var o=i.p+i.u(t),n=new Error;i.l(o,(r=>{if(i.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var a=r&&("load"===r.type?"missing":r.type),o=r&&r.target&&r.target.src;n.message="Loading chunk "+t+" failed.\n("+a+": "+o+")",n.name="ChunkLoadError",n.type=a,n.request=o,s[1](n)}}),"chunk-"+t,t)}},i.O.j=t=>0===e[t];var t=(t,r)=>{var s,a,o=r[0],n=r[1],d=r[2],c=0;if(o.some((t=>0!==e[t]))){for(s in n)i.o(n,s)&&(i.m[s]=n[s]);if(d)var u=d(i)}for(t&&t(r);ci(9685)));d=i.O(d)})(); +//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=91459c4251d0fc89b4e4 \ No newline at end of file diff --git a/dist/settings-vue-settings-apps-users-management.js.LICENSE.txt b/dist/settings-vue-settings-apps-users-management.js.LICENSE.txt index 0d659945d004f..37ccc6d9348de 100644 --- a/dist/settings-vue-settings-apps-users-management.js.LICENSE.txt +++ b/dist/settings-vue-settings-apps-users-management.js.LICENSE.txt @@ -30,6 +30,7 @@ * @author Julius Härtl * @author Roeland Jago Douma * @author Vincent Petry + * @author Stephan Orbaugh * * @license AGPL-3.0-or-later * diff --git a/dist/settings-vue-settings-apps-users-management.js.map b/dist/settings-vue-settings-apps-users-management.js.map index 4bbbd51823d2c..500e8f3a29d5f 100644 --- a/dist/settings-vue-settings-apps-users-management.js.map +++ b/dist/settings-vue-settings-apps-users-management.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=dcc51f8a0ed4ef4a234d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/constants/AppsConstants.js","webpack:///nextcloud/apps/settings/src/App.vue","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/App.vue?536c","webpack://nextcloud/./apps/settings/src/App.vue?4d15","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/settings.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/core/src/OCP/accessibility.js","webpack:///nextcloud/apps/settings/src/router.js","webpack:///nextcloud/apps/settings/src/main-apps-users-management.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/**\n * @copyright 2022, Julia Kirschenheuter \n *\n * @author Julia Kirschenheuter \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport { translate as t } from '@nextcloud/l10n'\n\n/** Enum of verification constants, according to Apps */\nexport const APPS_SECTION_ENUM = Object.freeze({\n\tenabled: t('settings', 'Active apps'),\n\tdisabled: t('settings', 'Disabled apps'),\n\tupdates: t('settings', 'Updates'),\n\t'app-bundles': t('settings', 'App bundles'),\n\tfeatured: t('settings', 'Featured apps'),\n\tsupported: t('settings', 'Supported apps'), // From subscription\n})\n","\n\n\n\n\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50420604&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('router-view')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author Christoph Wurst \n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n * @author Sujith Haridasan \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * @copyright 2020 Christoph Wurst \n *\n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author Arthur Schiwon \n * @author Christoph Wurst \n * @author Daniel Calviño Sánchez \n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n * @author Vincent Petry \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport api from './api.js'\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport logger from '../logger.js'\n\nconst orderGroups = function(groups, orderBy) {\n\t/* const SORT_USERCOUNT = 1;\n\t * const SORT_GROUPNAME = 2;\n\t * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n\t */\n\tif (orderBy === 1) {\n\t\treturn groups.sort((a, b) => a.usercount - a.disabled < b.usercount - b.disabled)\n\t} else {\n\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n}\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: 1,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tuserCount: 0,\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\t// convert obj to array\n\t\tconst users = state.users.concat(Object.keys(usersObj).map(userid => usersObj[userid]))\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.push(group)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.push(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\t// 0 is a special value\n\t\tif (state.userCount === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tif (!group) {\n\t\t\t\t\t\tconsole.warn('User group ' + userGroup + ' does not exist during user removal')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interrupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = OC.Util.computerFileSize(value)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled')\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * search users\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @return {Promise}\n\t */\n\tsearchUsers(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search })).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get user details\n\t *\n\t * @param {object} context store context\n\t * @param {string} userId user id\n\t * @return {Promise}\n\t */\n\tgetUser(context, userId) {\n\t\treturn api.get(generateOcsUrl(`cloud/users/${userId}`)).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', OC.getCapabilities().password_policy.minLength)\n\t\t\treturn OC.getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\twipeUserDevices(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @param {string} options.manager User manager\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language, manager }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language, manager })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tsetUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname', 'manager']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password', 'manager'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn api.requireAdmin().then((response) => {\n\t\t\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\t\t.then((response) => context.commit('setUserData', { userid, key, value }))\n\t\t\t\t\t\t.catch((error) => { throw error })\n\t\t\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 Julius Härtl \n *\n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport api from './api.js'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport '@nextcloud/dialogs/dist/index.css'\n\nconst state = {\n\tapps: [],\n\tcategories: [],\n\tupdateCount: 0,\n\tloading: {},\n\tloadingList: false,\n\tgettingCategoriesPromise: null,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '
' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tupdateCategories(state, categoriesPromise) {\n\t\tstate.gettingCategoriesPromise = categoriesPromise\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n\tgetCategoryById: (state) => (selectedCategoryId) => {\n\t\treturn state.categories.find((category) => category.id === selectedCategoryId)\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// TODO: find a cleaner solution\n\t\t\t\t\tlocation.reload()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tasync getCategories(context, { shouldRefetchCategories = false } = {}) {\n\t\tif (shouldRefetchCategories || !context.state.gettingCategoriesPromise) {\n\t\t\tcontext.commit('startLoading', 'categories')\n\t\t\ttry {\n\t\t\t\tconst categoriesPromise = api.get(generateUrl('settings/apps/categories'))\n\t\t\t\tcontext.commit('updateCategories', categoriesPromise)\n\t\t\t\tconst categoriesPromiseResponse = await categoriesPromise\n\t\t\t\tif (categoriesPromiseResponse.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', categoriesPromiseResponse.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\treturn false\n\t\t\t} catch (error) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t}\n\t\treturn context.state.gettingCategoriesPromise\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nconst state = {\n\tserverData: {},\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport api from './api.js'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Julius Härtl \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users.js'\nimport apps from './apps.js'\nimport settings from './settings.js'\nimport oc from './oc.js'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '
' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nexport default new Store({\n\tmodules: {\n\t\tusers,\n\t\tapps,\n\t\tsettings,\n\t\toc,\n\t},\n\tstrict: debug,\n\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2022 Joas Schilling \n *\n * @author Joas Schilling \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\n/**\n * Set the page heading\n *\n * @param {string} heading page title from the history api\n * @since 27.0.0\n */\nexport function setPageHeading(heading) {\n\tconst headingEl = document.getElementById('page-heading-level-1')\n\tif (headingEl) {\n\t\theadingEl.textContent = heading\n\t}\n}\nexport default {\n\t/**\n\t * @return {boolean} Whether the user opted-out of shortcuts so that they should not be registered\n\t */\n\tdisableKeyboardShortcuts() {\n\t\treturn loadState('theming', 'shortcutsDisabled', false)\n\t},\n\tsetPageHeading,\n}\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\nimport { APPS_SECTION_ENUM } from './constants/AppsConstants.js'\nimport store from './store/index.js'\nimport { setPageHeading } from '../../../core/src/OCP/accessibility.js'\n\n// Dynamic loading\nconst Users = () => import(/* webpackChunkName: 'settings-users' */'./views/Users.vue')\nconst Apps = () => import(/* webpackChunkName: 'settings-apps-view' */'./views/Apps.vue')\n\nVue.use(Router)\n\n/*\n * This is the list of routes where the vuejs app will\n * take over php to provide data\n * You need to forward the php routing (routes.php) to\n * the settings-vue template, where the vue-router will\n * ensure the proper route.\n * ⚠️ Routes needs to match the php routes.\n */\nconst baseTitle = document.title\nconst router = new Router({\n\tmode: 'history',\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl(''),\n\tlinkActiveClass: 'active',\n\troutes: [\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/users',\n\t\t\tcomponent: Users,\n\t\t\tprops: true,\n\t\t\tname: 'users',\n\t\t\tmeta: {\n\t\t\t\ttitle: () => {\n\t\t\t\t\treturn t('settings', 'Active users')\n\t\t\t\t},\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':selectedGroup',\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttitle: (to) => {\n\t\t\t\t\t\t\tif (to.params.selectedGroup === 'admin') {\n\t\t\t\t\t\t\t\treturn t('settings', 'Admins')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (to.params.selectedGroup === 'disabled') {\n\t\t\t\t\t\t\t\treturn t('settings', 'Disabled users')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn decodeURIComponent(to.params.selectedGroup)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tcomponent: Users,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/apps',\n\t\t\tcomponent: Apps,\n\t\t\tprops: true,\n\t\t\tname: 'apps',\n\t\t\tmeta: {\n\t\t\t\ttitle: () => {\n\t\t\t\t\treturn t('settings', 'Your apps')\n\t\t\t\t},\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':category',\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttitle: async (to) => {\n\t\t\t\t\t\t\tif (to.name === 'apps') {\n\t\t\t\t\t\t\t\treturn t('settings', 'Your apps')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (APPS_SECTION_ENUM[to.params.category]) {\n\t\t\t\t\t\t\t\treturn APPS_SECTION_ENUM[to.params.category]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait store.dispatch('getCategories')\n\t\t\t\t\t\t\tconst category = store.getters.getCategoryById(to.params.category)\n\t\t\t\t\t\t\tif (category.displayName) {\n\t\t\t\t\t\t\t\treturn category.displayName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: ':id',\n\t\t\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n})\n\nrouter.afterEach(async (to) => {\n\tconst metaTitle = await to.meta.title?.(to)\n\tif (metaTitle) {\n\t\tdocument.title = `${metaTitle} - ${baseTitle}`\n\t\tsetPageHeading(metaTitle)\n\t} else {\n\t\tdocument.title = baseTitle\n\t}\n})\n\nexport default router\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author rakekniven \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport { sync } from 'vuex-router-sync'\n\nimport App from './App.vue'\nimport router from './router.js'\nimport store from './store/index.js'\n\nVue.use(VTooltip, { defaultHtml: false })\n\nsync(store, router)\n\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// bind to window\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n// eslint-disable-next-line camelcase\nVue.prototype.oc_userconfig = oc_userconfig\n\nconst app = new Vue({\n\trouter,\n\tstore,\n\trender: h => h(App),\n}).$mount('#content')\n\nexport { app, router, store }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"7418\":\"settings-apps-view\",\"8351\":\"settings-users\"}[chunkId] || chunkId) + \"-\" + chunkId + \".js?v=\" + {\"6799\":\"00434e4baa0d8e7b79f1\",\"7418\":\"4ade86747cf564489847\",\"8351\":\"8b7284eb096e5c63052f\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 8562;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8562: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(9685)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","APPS_SECTION_ENUM","Object","freeze","enabled","t","disabled","updates","featured","supported","name","beforeMount","document","getElementById","$store","commit","JSON","parse","dataset","server","_c","this","_self","sanitize","url","replace","requireAdmin","confirmPassword","get","options","axios","post","data","put","delete","params","getLoggerBuilder","setApp","detectUser","build","orderGroups","groups","orderBy","sort","a","b","usercount","localeCompare","defaults","id","canAdd","canRemove","mutations","appendUsers","state","usersObj","users","concat","keys","map","userid","usersOffset","usersLimit","setPasswordPolicyMinLength","length","minPasswordLength","initGroups","_ref","userCount","group","assign","addGroup","_ref2","gid","displayName","find","push","e","console","error","renameGroup","_ref3","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","_ref4","user","removeUserGroup","_ref5","indexOf","addUserSubAdmin","_ref6","subadmin","removeUserSubAdmin","_ref7","deleteUser","userIndex","actionType","addUserData","response","ocs","enableDisableUser","_ref8","updateUserCounts","_ref9","disabledGroup","forEach","userGroup","warn","logger","setUserData","_ref10","key","value","humanValue","OC","Util","computerFileSize","resetUsers","CancelToken","searchRequestCancelSource","getters","getUsers","getGroups","getSubadminGroups","filter","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getUserCount","actions","searchUsers","context","_ref11","offset","limit","search","api","generateOcsUrl","catch","getUser","userId","_ref12","cancel","source","encodeURIComponent","cancelToken","token","then","usersCount","_ref13","limitParam","getUsersFromList","_ref14","getUsersFromGroup","_ref15","groupid","groupId","getCapabilities","password_policy","minLength","_ref16","_ref17","_ref18","_ref19","_ref20","wipeUserDevices","addUser","_ref21","_ref22","dispatch","password","email","quota","language","manager","_ref23","userStatus","_ref24","allowedEmpty","Promise","reject","Error","sendWelcomeMail","APPS_API_FAILURE","showError","message","isHTML","initCategories","categories","updateCount","updateCategories","categoriesPromise","gettingCategoriesPromise","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","apps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","canInstall","updateApp","version","update","resetApps","reset","startLoading","Vue","loading","stopLoading","generateUrl","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","getAllApps","async","shouldRefetchCategories","arguments","undefined","categoriesPromiseResponse","loadingList","getCategories","getUpdateCount","getCategoryById","selectedCategoryId","serverData","setServerData","getServerData","setAppConfig","Vuex","API_FAILURE","meta","Store","modules","settings","oc","strict","process","Users","Apps","Router","baseTitle","title","router","mode","base","linkActiveClass","routes","path","component","props","children","to","selectedGroup","decodeURIComponent","store","afterEach","_to$meta$title","_to$meta","metaTitle","call","heading","headingEl","textContent","setPageHeading","VTooltip","defaultHtml","sync","__webpack_nonce__","btoa","requestToken","n","OCA","oc_userconfig","render","h","App","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","getter","__esModule","d","definition","o","defineProperty","enumerable","f","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","p","baseURI","self","href","installedChunks","installedChunkData","promise","resolve","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=91459c4251d0fc89b4e4","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/constants/AppsConstants.js","webpack:///nextcloud/apps/settings/src/App.vue","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/App.vue?536c","webpack://nextcloud/./apps/settings/src/App.vue?4d15","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/settings.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/core/src/OCP/accessibility.js","webpack:///nextcloud/apps/settings/src/router.js","webpack:///nextcloud/apps/settings/src/main-apps-users-management.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/**\n * @copyright 2022, Julia Kirschenheuter \n *\n * @author Julia Kirschenheuter \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport { translate as t } from '@nextcloud/l10n'\n\n/** Enum of verification constants, according to Apps */\nexport const APPS_SECTION_ENUM = Object.freeze({\n\tenabled: t('settings', 'Active apps'),\n\tdisabled: t('settings', 'Disabled apps'),\n\tupdates: t('settings', 'Updates'),\n\t'app-bundles': t('settings', 'App bundles'),\n\tfeatured: t('settings', 'Featured apps'),\n\tsupported: t('settings', 'Supported apps'), // From subscription\n})\n","\n\n\n\n\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50420604&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('router-view')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author Christoph Wurst \n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n * @author Sujith Haridasan \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * @copyright 2020 Christoph Wurst \n *\n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author Arthur Schiwon \n * @author Christoph Wurst \n * @author Daniel Calviño Sánchez \n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n * @author Vincent Petry \n * @author Stephan Orbaugh \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport api from './api.js'\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport logger from '../logger.js'\n\nconst orderGroups = function(groups, orderBy) {\n\t/* const SORT_USERCOUNT = 1;\n\t * const SORT_GROUPNAME = 2;\n\t * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n\t */\n\tif (orderBy === 1) {\n\t\treturn groups.sort((a, b) => a.usercount - a.disabled < b.usercount - b.disabled)\n\t} else {\n\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n}\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: 1,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tuserCount: 0,\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\t// convert obj to array\n\t\tconst users = state.users.concat(Object.keys(usersObj).map(userid => usersObj[userid]))\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.push(group)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.push(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\t// 0 is a special value\n\t\tif (state.userCount === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tif (!group) {\n\t\t\t\t\t\tconsole.warn('User group ' + userGroup + ' does not exist during user removal')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interrupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = OC.Util.computerFileSize(value)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled')\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * search users\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @return {Promise}\n\t */\n\tsearchUsers(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search })).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get user details\n\t *\n\t * @param {object} context store context\n\t * @param {string} userId user id\n\t * @return {Promise}\n\t */\n\tgetUser(context, userId) {\n\t\treturn api.get(generateOcsUrl(`cloud/users/${userId}`)).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\t/**\n\t\t * Adding filters in the search bar such as in:files, in:users, etc.\n\t\t * collides with this particular search, so we need to remove them\n\t\t * here and leave only the original search query\n\t\t */\n\t\tsearch = search.replace(/in:[^\\s]+/g, '').trim()\n\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', OC.getCapabilities().password_policy.minLength)\n\t\t\treturn OC.getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\twipeUserDevices(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @param {string} options.manager User manager\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language, manager }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language, manager })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tsetUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname', 'manager']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password', 'manager'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn api.requireAdmin().then((response) => {\n\t\t\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\t\t.then((response) => context.commit('setUserData', { userid, key, value }))\n\t\t\t\t\t\t.catch((error) => { throw error })\n\t\t\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 Julius Härtl \n *\n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport api from './api.js'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport '@nextcloud/dialogs/dist/index.css'\n\nconst state = {\n\tapps: [],\n\tcategories: [],\n\tupdateCount: 0,\n\tloading: {},\n\tloadingList: false,\n\tgettingCategoriesPromise: null,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '
' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tupdateCategories(state, categoriesPromise) {\n\t\tstate.gettingCategoriesPromise = categoriesPromise\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n\tgetCategoryById: (state) => (selectedCategoryId) => {\n\t\treturn state.categories.find((category) => category.id === selectedCategoryId)\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// TODO: find a cleaner solution\n\t\t\t\t\tlocation.reload()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tasync getCategories(context, { shouldRefetchCategories = false } = {}) {\n\t\tif (shouldRefetchCategories || !context.state.gettingCategoriesPromise) {\n\t\t\tcontext.commit('startLoading', 'categories')\n\t\t\ttry {\n\t\t\t\tconst categoriesPromise = api.get(generateUrl('settings/apps/categories'))\n\t\t\t\tcontext.commit('updateCategories', categoriesPromise)\n\t\t\t\tconst categoriesPromiseResponse = await categoriesPromise\n\t\t\t\tif (categoriesPromiseResponse.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', categoriesPromiseResponse.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\treturn false\n\t\t\t} catch (error) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t}\n\t\treturn context.state.gettingCategoriesPromise\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nconst state = {\n\tserverData: {},\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport api from './api.js'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Julius Härtl \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users.js'\nimport apps from './apps.js'\nimport settings from './settings.js'\nimport oc from './oc.js'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '
' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nexport default new Store({\n\tmodules: {\n\t\tusers,\n\t\tapps,\n\t\tsettings,\n\t\toc,\n\t},\n\tstrict: debug,\n\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2022 Joas Schilling \n *\n * @author Joas Schilling \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\n/**\n * Set the page heading\n *\n * @param {string} heading page title from the history api\n * @since 27.0.0\n */\nexport function setPageHeading(heading) {\n\tconst headingEl = document.getElementById('page-heading-level-1')\n\tif (headingEl) {\n\t\theadingEl.textContent = heading\n\t}\n}\nexport default {\n\t/**\n\t * @return {boolean} Whether the user opted-out of shortcuts so that they should not be registered\n\t */\n\tdisableKeyboardShortcuts() {\n\t\treturn loadState('theming', 'shortcutsDisabled', false)\n\t},\n\tsetPageHeading,\n}\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Julius Härtl \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\nimport { APPS_SECTION_ENUM } from './constants/AppsConstants.js'\nimport store from './store/index.js'\nimport { setPageHeading } from '../../../core/src/OCP/accessibility.js'\n\n// Dynamic loading\nconst Users = () => import(/* webpackChunkName: 'settings-users' */'./views/Users.vue')\nconst Apps = () => import(/* webpackChunkName: 'settings-apps-view' */'./views/Apps.vue')\n\nVue.use(Router)\n\n/*\n * This is the list of routes where the vuejs app will\n * take over php to provide data\n * You need to forward the php routing (routes.php) to\n * the settings-vue template, where the vue-router will\n * ensure the proper route.\n * ⚠️ Routes needs to match the php routes.\n */\nconst baseTitle = document.title\nconst router = new Router({\n\tmode: 'history',\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl(''),\n\tlinkActiveClass: 'active',\n\troutes: [\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/users',\n\t\t\tcomponent: Users,\n\t\t\tprops: true,\n\t\t\tname: 'users',\n\t\t\tmeta: {\n\t\t\t\ttitle: () => {\n\t\t\t\t\treturn t('settings', 'Active users')\n\t\t\t\t},\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':selectedGroup',\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttitle: (to) => {\n\t\t\t\t\t\t\tif (to.params.selectedGroup === 'admin') {\n\t\t\t\t\t\t\t\treturn t('settings', 'Admins')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (to.params.selectedGroup === 'disabled') {\n\t\t\t\t\t\t\t\treturn t('settings', 'Disabled users')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn decodeURIComponent(to.params.selectedGroup)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tcomponent: Users,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/apps',\n\t\t\tcomponent: Apps,\n\t\t\tprops: true,\n\t\t\tname: 'apps',\n\t\t\tmeta: {\n\t\t\t\ttitle: () => {\n\t\t\t\t\treturn t('settings', 'Your apps')\n\t\t\t\t},\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':category',\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttitle: async (to) => {\n\t\t\t\t\t\t\tif (to.name === 'apps') {\n\t\t\t\t\t\t\t\treturn t('settings', 'Your apps')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (APPS_SECTION_ENUM[to.params.category]) {\n\t\t\t\t\t\t\t\treturn APPS_SECTION_ENUM[to.params.category]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait store.dispatch('getCategories')\n\t\t\t\t\t\t\tconst category = store.getters.getCategoryById(to.params.category)\n\t\t\t\t\t\t\tif (category.displayName) {\n\t\t\t\t\t\t\t\treturn category.displayName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: ':id',\n\t\t\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n})\n\nrouter.afterEach(async (to) => {\n\tconst metaTitle = await to.meta.title?.(to)\n\tif (metaTitle) {\n\t\tdocument.title = `${metaTitle} - ${baseTitle}`\n\t\tsetPageHeading(metaTitle)\n\t} else {\n\t\tdocument.title = baseTitle\n\t}\n})\n\nexport default router\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author rakekniven \n * @author Roeland Jago Douma \n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport { sync } from 'vuex-router-sync'\n\nimport App from './App.vue'\nimport router from './router.js'\nimport store from './store/index.js'\n\nVue.use(VTooltip, { defaultHtml: false })\n\nsync(store, router)\n\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// bind to window\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n// eslint-disable-next-line camelcase\nVue.prototype.oc_userconfig = oc_userconfig\n\nconst app = new Vue({\n\trouter,\n\tstore,\n\trender: h => h(App),\n}).$mount('#content')\n\nexport { app, router, store }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"7418\":\"settings-apps-view\",\"8351\":\"settings-users\"}[chunkId] || chunkId) + \"-\" + chunkId + \".js?v=\" + {\"6799\":\"00434e4baa0d8e7b79f1\",\"7418\":\"4ade86747cf564489847\",\"8351\":\"8b7284eb096e5c63052f\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 8562;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8562: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(9685)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","APPS_SECTION_ENUM","Object","freeze","enabled","t","disabled","updates","featured","supported","name","beforeMount","document","getElementById","$store","commit","JSON","parse","dataset","server","_c","this","_self","sanitize","url","replace","requireAdmin","confirmPassword","get","options","axios","post","data","put","delete","params","getLoggerBuilder","setApp","detectUser","build","orderGroups","groups","orderBy","sort","a","b","usercount","localeCompare","defaults","id","canAdd","canRemove","mutations","appendUsers","state","usersObj","users","concat","keys","map","userid","usersOffset","usersLimit","setPasswordPolicyMinLength","length","minPasswordLength","initGroups","_ref","userCount","group","assign","addGroup","_ref2","gid","displayName","find","push","e","console","error","renameGroup","_ref3","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","_ref4","user","removeUserGroup","_ref5","indexOf","addUserSubAdmin","_ref6","subadmin","removeUserSubAdmin","_ref7","deleteUser","userIndex","actionType","addUserData","response","ocs","enableDisableUser","_ref8","updateUserCounts","_ref9","disabledGroup","forEach","userGroup","warn","logger","setUserData","_ref10","key","value","humanValue","OC","Util","computerFileSize","resetUsers","CancelToken","searchRequestCancelSource","getters","getUsers","getGroups","getSubadminGroups","filter","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getUserCount","actions","searchUsers","context","_ref11","offset","limit","search","api","generateOcsUrl","catch","getUser","userId","_ref12","cancel","source","trim","encodeURIComponent","cancelToken","token","then","usersCount","_ref13","limitParam","getUsersFromList","_ref14","getUsersFromGroup","_ref15","groupid","groupId","getCapabilities","password_policy","minLength","_ref16","_ref17","_ref18","_ref19","_ref20","wipeUserDevices","addUser","_ref21","_ref22","dispatch","password","email","quota","language","manager","_ref23","userStatus","_ref24","allowedEmpty","Promise","reject","Error","sendWelcomeMail","APPS_API_FAILURE","showError","message","isHTML","initCategories","categories","updateCount","updateCategories","categoriesPromise","gettingCategoriesPromise","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","apps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","canInstall","updateApp","version","update","resetApps","reset","startLoading","Vue","loading","stopLoading","generateUrl","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","getAllApps","async","shouldRefetchCategories","arguments","undefined","categoriesPromiseResponse","loadingList","getCategories","getUpdateCount","getCategoryById","selectedCategoryId","serverData","setServerData","getServerData","setAppConfig","Vuex","API_FAILURE","meta","Store","modules","settings","oc","strict","process","Users","Apps","Router","baseTitle","title","router","mode","base","linkActiveClass","routes","path","component","props","children","to","selectedGroup","decodeURIComponent","store","afterEach","_to$meta$title","_to$meta","metaTitle","call","heading","headingEl","textContent","setPageHeading","VTooltip","defaultHtml","sync","__webpack_nonce__","btoa","requestToken","n","OCA","oc_userconfig","render","h","App","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","getter","__esModule","d","definition","o","defineProperty","enumerable","f","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","p","baseURI","self","href","installedChunks","installedChunkData","promise","resolve","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file