diff options
author | Vanessa Pertsch <vanessa.pertsch@posteo.de> | 2022-02-24 16:11:02 +0300 |
---|---|---|
committer | Vanessa Pertsch <vanessa.pertsch@posteo.de> | 2022-02-24 18:59:57 +0300 |
commit | af5479467eca1fc281d65bfddb348f52df3dd880 (patch) | |
tree | 27ecfecbe39bd272dd14996f2866778d89938d83 /dist | |
parent | 6da8a6d62adde9b1ed011a7a18d43984cf5a27a8 (diff) |
use new button component
Signed-off-by: Vanessa Pertsch <vanessa.pertsch@posteo.com>
Signed-off-by: Vanessa Pertsch <vanessa.pertsch@posteo.de>
Diffstat (limited to 'dist')
-rw-r--r-- | dist/settings-vue-settings-admin-security.js | 4 | ||||
-rw-r--r-- | dist/settings-vue-settings-admin-security.js.map | 2 |
2 files changed, 3 insertions, 3 deletions
diff --git a/dist/settings-vue-settings-admin-security.js b/dist/settings-vue-settings-admin-security.js index adc132c641d..11eacd276cf 100644 --- a/dist/settings-vue-settings-admin-security.js +++ b/dist/settings-vue-settings-admin-security.js @@ -1,3 +1,3 @@ /*! For license information please see settings-vue-settings-admin-security.js.LICENSE.txt */ -!function(){"use strict";var e,n={24470:function(e,n,o){var s=o(16453),r=o(20144),i=o(4820),a=o(7811),c=o.n(a),u=o(96486),l=o.n(u),d=o(79753),f={name:"AdminTwoFactor",components:{Multiselect:c()},data:function(){return{loading:!1,dirty:!1,groups:[],loadingGroups:!1}},computed:{enforced:{get:function(){return this.$store.state.enforced},set:function(t){this.dirty=!0,this.$store.commit("setEnforced",t)}},enforcedGroups:{get:function(){return this.$store.state.enforcedGroups},set:function(t){this.dirty=!0,this.$store.commit("setEnforcedGroups",t)}},excludedGroups:{get:function(){return this.$store.state.excludedGroups},set:function(t){this.dirty=!0,this.$store.commit("setExcludedGroups",t)}}},mounted:function(){this.groups=l().sortedUniq(l().uniq(this.enforcedGroups.concat(this.excludedGroups))),this.searchGroup("")},methods:{searchGroup:l().debounce((function(t){var e=this;this.loadingGroups=!0,i.default.get((0,d.generateOcsUrl)("cloud/groups?offset=0&search={query}&limit=20",{query:t})).then((function(t){return t.data.ocs})).then((function(t){return t.data.groups})).then((function(t){e.groups=l().sortedUniq(l().uniq(e.groups.concat(t)))})).catch((function(t){return console.error("could not search groups",t)})).then((function(){e.loadingGroups=!1}))}),500),saveChanges:function(){var t=this;this.loading=!0;var e={enforced:this.enforced,enforcedGroups:this.enforcedGroups,excludedGroups:this.excludedGroups};i.default.put((0,d.generateUrl)("/settings/api/admin/twofactorauth"),e).then((function(t){return t.data})).then((function(e){t.state=e,t.dirty=!1})).catch((function(t){console.error("could not save changes",t)})).then((function(){t.loading=!1}))}}},p=o(93379),h=o.n(p),g=o(7795),m=o.n(g),v=o(90569),b=o.n(v),w=o(3565),y=o.n(w),x=o(19216),G=o.n(x),A=o(44589),_=o.n(A),C=o(37331),E={};E.styleTagTransform=_(),E.setAttributes=y(),E.insert=b().bind(null,"head"),E.domAPI=m(),E.insertStyleElement=G(),h()(C.Z,E),C.Z&&C.Z.locals&&C.Z.locals;var k=(0,o(51900).Z)(f,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("p",{staticClass:"settings-hint"},[t._v("\n\t\t"+t._s(t.t("settings","Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system."))+"\n\t")]),t._v(" "),t.loading?n("p",[n("span",{staticClass:"icon-loading-small two-factor-loading"}),t._v(" "),n("span",[t._v(t._s(t.t("settings","Enforce two-factor authentication")))])]):n("p",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.enforced,expression:"enforced"}],staticClass:"checkbox",attrs:{id:"two-factor-enforced",type:"checkbox"},domProps:{checked:Array.isArray(t.enforced)?t._i(t.enforced,null)>-1:t.enforced},on:{change:function(e){var n=t.enforced,o=e.target,s=!!o.checked;if(Array.isArray(n)){var r=t._i(n,null);o.checked?r<0&&(t.enforced=n.concat([null])):r>-1&&(t.enforced=n.slice(0,r).concat(n.slice(r+1)))}else t.enforced=s}}}),t._v(" "),n("label",{attrs:{for:"two-factor-enforced"}},[t._v(t._s(t.t("settings","Enforce two-factor authentication")))])]),t._v(" "),t.enforced?[n("h3",[t._v(t._s(t.t("settings","Limit to groups")))]),t._v("\n\t\t"+t._s(t.t("settings","Enforcement of two-factor authentication can be set for certain groups only."))+"\n\t\t"),n("p",[t._v("\n\t\t\t"+t._s(t.t("settings","Two-factor authentication is enforced for all members of the following groups."))+"\n\t\t")]),t._v(" "),n("p",[n("Multiselect",{attrs:{options:t.groups,placeholder:t.t("settings","Enforced groups"),disabled:t.loading,multiple:!0,searchable:!0,loading:t.loadingGroups,"show-no-options":!1,"close-on-select":!1},on:{"search-change":t.searchGroup},model:{value:t.enforcedGroups,callback:function(e){t.enforcedGroups=e},expression:"enforcedGroups"}})],1),t._v(" "),n("p",[t._v("\n\t\t\t"+t._s(t.t("settings","Two-factor authentication is not enforced for members of the following groups."))+"\n\t\t")]),t._v(" "),n("p",[n("Multiselect",{attrs:{options:t.groups,placeholder:t.t("settings","Excluded groups"),disabled:t.loading,multiple:!0,searchable:!0,loading:t.loadingGroups,"show-no-options":!1,"close-on-select":!1},on:{"search-change":t.searchGroup},model:{value:t.excludedGroups,callback:function(e){t.excludedGroups=e},expression:"excludedGroups"}})],1),t._v(" "),n("p",[n("em",[t._v("\n\t\t\t\t"+t._s(t.t("settings","When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced."))+"\n\t\t\t")])])]:t._e(),t._v(" "),n("p",[t.dirty?n("button",{staticClass:"button primary",attrs:{disabled:t.loading},on:{click:t.saveChanges}},[t._v("\n\t\t\t"+t._s(t.t("settings","Save changes"))+"\n\t\t")]):t._e()])],2)}),[],!1,null,null,null).exports,O=o(20629);r.default.use(O.ZP);var T={setEnforced:function(t,e){r.default.set(t,"enforced",e)},setEnforcedGroups:function(t,e){r.default.set(t,"enforcedGroups",e)},setExcludedGroups:function(t,e){r.default.set(t,"excludedGroups",e)}},q=new O.yh({strict:!1,state:{enforced:!1,enforcedGroups:[],excludedGroups:[]},mutations:T});o.nc=btoa(OC.requestToken),r.default.prototype.t=t,window.OC=window.OC||{},window.OC.Settings=window.OC.Settings||{},q.replaceState((0,s.loadState)("settings","mandatory2FAState")),new(r.default.extend(k))({store:q}).$mount("#two-factor-auth-settings")},37331:function(t,e,n){var o=n(87537),s=n.n(o),r=n(23645),i=n.n(r)()(s());i.push([t.id,"\n.two-factor-loading {\n\tdisplay: inline-block;\n\tvertical-align: sub;\n\tmargin-left: -2px;\n\tmargin-right: 1px;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AdminTwoFactor.vue"],names:[],mappings:";AA+JA;CACA,qBAAA;CACA,mBAAA;CACA,iBAAA;CACA,iBAAA;AACA",sourcesContent:["<template>\n\t<div>\n\t\t<p class=\"settings-hint\">\n\t\t\t{{ t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.') }}\n\t\t</p>\n\t\t<p v-if=\"loading\">\n\t\t\t<span class=\"icon-loading-small two-factor-loading\" />\n\t\t\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\n\t\t</p>\n\t\t<p v-else>\n\t\t\t<input id=\"two-factor-enforced\"\n\t\t\t\tv-model=\"enforced\"\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"checkbox\">\n\t\t\t<label for=\"two-factor-enforced\">{{ t('settings', 'Enforce two-factor authentication') }}</label>\n\t\t</p>\n\t\t<template v-if=\"enforced\">\n\t\t\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\n\t\t\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"enforcedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Enforced groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"excludedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Excluded groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<em>\n\t\t\t\t\t\x3c!-- this text is also found in the documentation. update it there as well if it ever changes --\x3e\n\t\t\t\t\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\n\t\t\t\t</em>\n\t\t\t</p>\n\t\t</template>\n\t\t<p>\n\t\t\t<button v-if=\"dirty\"\n\t\t\t\tclass=\"button primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"saveChanges\">\n\t\t\t\t{{ t('settings', 'Save changes') }}\n\t\t\t</button>\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\nimport _ from 'lodash'\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminTwoFactor',\n\tcomponents: {\n\t\tMultiselect,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tenforced: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforced\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforced', val)\n\t\t\t},\n\t\t},\n\t\tenforcedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforcedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforcedGroups', val)\n\t\t\t},\n\t\t},\n\t\texcludedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.excludedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setExcludedGroups', val)\n\t\t\t},\n\t\t},\n\t},\n\tmounted() {\n\t\t// Groups are loaded dynamically, but the assigned ones *should*\n\t\t// be valid groups, so let's add them as initial state\n\t\tthis.groups = _.sortedUniq(_.uniq(this.enforcedGroups.concat(this.excludedGroups)))\n\n\t\t// Populate the groups with a first set so the dropdown is not empty\n\t\t// when opening the page the first time\n\t\tthis.searchGroup('')\n\t},\n\tmethods: {\n\t\tsearchGroup: _.debounce(function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\n\t\t\t\t.then(res => res.data.ocs)\n\t\t\t\t.then(ocs => ocs.data.groups)\n\t\t\t\t.then(groups => { this.groups = _.sortedUniq(_.uniq(this.groups.concat(groups))) })\n\t\t\t\t.catch(err => console.error('could not search groups', err))\n\t\t\t\t.then(() => { this.loadingGroups = false })\n\t\t}, 500),\n\n\t\tsaveChanges() {\n\t\t\tthis.loading = true\n\n\t\t\tconst data = {\n\t\t\t\tenforced: this.enforced,\n\t\t\t\tenforcedGroups: this.enforcedGroups,\n\t\t\t\texcludedGroups: this.excludedGroups,\n\t\t\t}\n\t\t\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(state => {\n\t\t\t\t\tthis.state = state\n\t\t\t\t\tthis.dirty = false\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t\t})\n\t\t\t\t.then(() => { this.loading = false })\n\t\t},\n\t},\n}\n<\/script>\n\n<style>\n\t.two-factor-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: -2px;\n\t\tmargin-right: 1px;\n\t}\n</style>\n"],sourceRoot:""}]),e.Z=i}},o={};function s(t){var e=o[t];if(void 0!==e)return e.exports;var r=o[t]={id:t,loaded:!1,exports:{}};return n[t].call(r.exports,r,r.exports,s),r.loaded=!0,r.exports}s.m=n,s.amdD=function(){throw new Error("define cannot be used indirect")},s.amdO={},e=[],s.O=function(t,n,o,r){if(!n){var i=1/0;for(l=0;l<e.length;l++){n=e[l][0],o=e[l][1],r=e[l][2];for(var a=!0,c=0;c<n.length;c++)(!1&r||i>=r)&&Object.keys(s.O).every((function(t){return s.O[t](n[c])}))?n.splice(c--,1):(a=!1,r<i&&(i=r));if(a){e.splice(l--,1);var u=o();void 0!==u&&(t=u)}}return t}r=r||0;for(var l=e.length;l>0&&e[l-1][2]>r;l--)e[l]=e[l-1];e[l]=[n,o,r]},s.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return s.d(e,{a:e}),e},s.d=function(t,e){for(var n in e)s.o(e,n)&&!s.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},s.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},s.j=788,function(){s.b=document.baseURI||self.location.href;var t={788:0};s.O.j=function(e){return 0===t[e]};var e=function(e,n){var o,r,i=n[0],a=n[1],c=n[2],u=0;if(i.some((function(e){return 0!==t[e]}))){for(o in a)s.o(a,o)&&(s.m[o]=a[o]);if(c)var l=c(s)}for(e&&e(n);u<i.length;u++)r=i[u],s.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return s.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))}();var r=s.O(void 0,[874],(function(){return s(24470)}));r=s.O(r)}(); -//# sourceMappingURL=settings-vue-settings-admin-security.js.map?v=f6237cbf6db3a7831b8c
\ No newline at end of file +!function(){"use strict";var e,n={11318:function(e,n,o){var r=o(16453),s=o(20144),i=o(4820),a=o(7811),c=o.n(a),u=o(1412),l=o.n(u),d=o(96486),f=o.n(d),p=o(79753),h={name:"AdminTwoFactor",components:{Multiselect:c(),Button:l()},data:function(){return{loading:!1,dirty:!1,groups:[],loadingGroups:!1}},computed:{enforced:{get:function(){return this.$store.state.enforced},set:function(t){this.dirty=!0,this.$store.commit("setEnforced",t)}},enforcedGroups:{get:function(){return this.$store.state.enforcedGroups},set:function(t){this.dirty=!0,this.$store.commit("setEnforcedGroups",t)}},excludedGroups:{get:function(){return this.$store.state.excludedGroups},set:function(t){this.dirty=!0,this.$store.commit("setExcludedGroups",t)}}},mounted:function(){this.groups=f().sortedUniq(f().uniq(this.enforcedGroups.concat(this.excludedGroups))),this.searchGroup("")},methods:{searchGroup:f().debounce((function(t){var e=this;this.loadingGroups=!0,i.default.get((0,p.generateOcsUrl)("cloud/groups?offset=0&search={query}&limit=20",{query:t})).then((function(t){return t.data.ocs})).then((function(t){return t.data.groups})).then((function(t){e.groups=f().sortedUniq(f().uniq(e.groups.concat(t)))})).catch((function(t){return console.error("could not search groups",t)})).then((function(){e.loadingGroups=!1}))}),500),saveChanges:function(){var t=this;this.loading=!0;var e={enforced:this.enforced,enforcedGroups:this.enforcedGroups,excludedGroups:this.excludedGroups};i.default.put((0,p.generateUrl)("/settings/api/admin/twofactorauth"),e).then((function(t){return t.data})).then((function(e){t.state=e,t.dirty=!1})).catch((function(t){console.error("could not save changes",t)})).then((function(){t.loading=!1}))}}},g=o(93379),m=o.n(g),v=o(7795),b=o.n(v),w=o(90569),y=o.n(w),x=o(3565),G=o.n(x),A=o(19216),_=o.n(A),C=o(44589),k=o.n(C),E=o(37331),O={};O.styleTagTransform=k(),O.setAttributes=G(),O.insert=y().bind(null,"head"),O.domAPI=b(),O.insertStyleElement=_(),m()(E.Z,O),E.Z&&E.Z.locals&&E.Z.locals;var T=(0,o(51900).Z)(h,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("p",{staticClass:"settings-hint"},[t._v("\n\t\t"+t._s(t.t("settings","Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system."))+"\n\t")]),t._v(" "),t.loading?n("p",[n("span",{staticClass:"icon-loading-small two-factor-loading"}),t._v(" "),n("span",[t._v(t._s(t.t("settings","Enforce two-factor authentication")))])]):n("p",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.enforced,expression:"enforced"}],staticClass:"checkbox",attrs:{id:"two-factor-enforced",type:"checkbox"},domProps:{checked:Array.isArray(t.enforced)?t._i(t.enforced,null)>-1:t.enforced},on:{change:function(e){var n=t.enforced,o=e.target,r=!!o.checked;if(Array.isArray(n)){var s=t._i(n,null);o.checked?s<0&&(t.enforced=n.concat([null])):s>-1&&(t.enforced=n.slice(0,s).concat(n.slice(s+1)))}else t.enforced=r}}}),t._v(" "),n("label",{attrs:{for:"two-factor-enforced"}},[t._v(t._s(t.t("settings","Enforce two-factor authentication")))])]),t._v(" "),t.enforced?[n("h3",[t._v(t._s(t.t("settings","Limit to groups")))]),t._v("\n\t\t"+t._s(t.t("settings","Enforcement of two-factor authentication can be set for certain groups only."))+"\n\t\t"),n("p",[t._v("\n\t\t\t"+t._s(t.t("settings","Two-factor authentication is enforced for all members of the following groups."))+"\n\t\t")]),t._v(" "),n("p",[n("Multiselect",{attrs:{options:t.groups,placeholder:t.t("settings","Enforced groups"),disabled:t.loading,multiple:!0,searchable:!0,loading:t.loadingGroups,"show-no-options":!1,"close-on-select":!1},on:{"search-change":t.searchGroup},model:{value:t.enforcedGroups,callback:function(e){t.enforcedGroups=e},expression:"enforcedGroups"}})],1),t._v(" "),n("p",[t._v("\n\t\t\t"+t._s(t.t("settings","Two-factor authentication is not enforced for members of the following groups."))+"\n\t\t")]),t._v(" "),n("p",[n("Multiselect",{attrs:{options:t.groups,placeholder:t.t("settings","Excluded groups"),disabled:t.loading,multiple:!0,searchable:!0,loading:t.loadingGroups,"show-no-options":!1,"close-on-select":!1},on:{"search-change":t.searchGroup},model:{value:t.excludedGroups,callback:function(e){t.excludedGroups=e},expression:"excludedGroups"}})],1),t._v(" "),n("p",[n("em",[t._v("\n\t\t\t\t"+t._s(t.t("settings","When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced."))+"\n\t\t\t")])])]:t._e(),t._v(" "),n("p",[t.dirty?n("Button",{attrs:{type:"primary",disabled:t.loading},on:{click:t.saveChanges}},[t._v("\n\t\t\t"+t._s(t.t("settings","Save changes"))+"\n\t\t")]):t._e()],1)],2)}),[],!1,null,null,null).exports,q=o(20629);s.default.use(q.ZP);var $={setEnforced:function(t,e){s.default.set(t,"enforced",e)},setEnforcedGroups:function(t,e){s.default.set(t,"enforcedGroups",e)},setExcludedGroups:function(t,e){s.default.set(t,"excludedGroups",e)}},F=new q.yh({strict:!1,state:{enforced:!1,enforcedGroups:[],excludedGroups:[]},mutations:$});o.nc=btoa(OC.requestToken),s.default.prototype.t=t,window.OC=window.OC||{},window.OC.Settings=window.OC.Settings||{},F.replaceState((0,r.loadState)("settings","mandatory2FAState")),new(s.default.extend(T))({store:F}).$mount("#two-factor-auth-settings")},37331:function(t,e,n){var o=n(87537),r=n.n(o),s=n(23645),i=n.n(s)()(r());i.push([t.id,"\n.two-factor-loading {\n\tdisplay: inline-block;\n\tvertical-align: sub;\n\tmargin-left: -2px;\n\tmargin-right: 1px;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AdminTwoFactor.vue"],names:[],mappings:";AAkKA;CACA,qBAAA;CACA,mBAAA;CACA,iBAAA;CACA,iBAAA;AACA",sourcesContent:["<template>\n\t<div>\n\t\t<p class=\"settings-hint\">\n\t\t\t{{ t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.') }}\n\t\t</p>\n\t\t<p v-if=\"loading\">\n\t\t\t<span class=\"icon-loading-small two-factor-loading\" />\n\t\t\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\n\t\t</p>\n\t\t<p v-else>\n\t\t\t<input id=\"two-factor-enforced\"\n\t\t\t\tv-model=\"enforced\"\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"checkbox\">\n\t\t\t<label for=\"two-factor-enforced\">{{ t('settings', 'Enforce two-factor authentication') }}</label>\n\t\t</p>\n\t\t<template v-if=\"enforced\">\n\t\t\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\n\t\t\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"enforcedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Enforced groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"excludedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Excluded groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<em>\n\t\t\t\t\t\x3c!-- this text is also found in the documentation. update it there as well if it ever changes --\x3e\n\t\t\t\t\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\n\t\t\t\t</em>\n\t\t\t</p>\n\t\t</template>\n\t\t<p>\n\t\t\t<Button v-if=\"dirty\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"saveChanges\">\n\t\t\t\t{{ t('settings', 'Save changes') }}\n\t\t\t</Button>\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\nimport Button from '@nextcloud/vue/dist/Components/Button'\n\nimport _ from 'lodash'\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminTwoFactor',\n\tcomponents: {\n\t\tMultiselect,\n\t\tButton,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tenforced: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforced\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforced', val)\n\t\t\t},\n\t\t},\n\t\tenforcedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforcedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforcedGroups', val)\n\t\t\t},\n\t\t},\n\t\texcludedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.excludedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setExcludedGroups', val)\n\t\t\t},\n\t\t},\n\t},\n\tmounted() {\n\t\t// Groups are loaded dynamically, but the assigned ones *should*\n\t\t// be valid groups, so let's add them as initial state\n\t\tthis.groups = _.sortedUniq(_.uniq(this.enforcedGroups.concat(this.excludedGroups)))\n\n\t\t// Populate the groups with a first set so the dropdown is not empty\n\t\t// when opening the page the first time\n\t\tthis.searchGroup('')\n\t},\n\tmethods: {\n\t\tsearchGroup: _.debounce(function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\n\t\t\t\t.then(res => res.data.ocs)\n\t\t\t\t.then(ocs => ocs.data.groups)\n\t\t\t\t.then(groups => { this.groups = _.sortedUniq(_.uniq(this.groups.concat(groups))) })\n\t\t\t\t.catch(err => console.error('could not search groups', err))\n\t\t\t\t.then(() => { this.loadingGroups = false })\n\t\t}, 500),\n\n\t\tsaveChanges() {\n\t\t\tthis.loading = true\n\n\t\t\tconst data = {\n\t\t\t\tenforced: this.enforced,\n\t\t\t\tenforcedGroups: this.enforcedGroups,\n\t\t\t\texcludedGroups: this.excludedGroups,\n\t\t\t}\n\t\t\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(state => {\n\t\t\t\t\tthis.state = state\n\t\t\t\t\tthis.dirty = false\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t\t})\n\t\t\t\t.then(() => { this.loading = false })\n\t\t},\n\t},\n}\n<\/script>\n\n<style>\n\t.two-factor-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: -2px;\n\t\tmargin-right: 1px;\n\t}\n</style>\n"],sourceRoot:""}]),e.Z=i}},o={};function r(t){var e=o[t];if(void 0!==e)return e.exports;var s=o[t]={id:t,loaded:!1,exports:{}};return n[t].call(s.exports,s,s.exports,r),s.loaded=!0,s.exports}r.m=n,r.amdD=function(){throw new Error("define cannot be used indirect")},r.amdO={},e=[],r.O=function(t,n,o,s){if(!n){var i=1/0;for(l=0;l<e.length;l++){n=e[l][0],o=e[l][1],s=e[l][2];for(var a=!0,c=0;c<n.length;c++)(!1&s||i>=s)&&Object.keys(r.O).every((function(t){return r.O[t](n[c])}))?n.splice(c--,1):(a=!1,s<i&&(i=s));if(a){e.splice(l--,1);var u=o();void 0!==u&&(t=u)}}return t}s=s||0;for(var l=e.length;l>0&&e[l-1][2]>s;l--)e[l]=e[l-1];e[l]=[n,o,s]},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.d=function(t,e){for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},r.j=788,function(){r.b=document.baseURI||self.location.href;var t={788:0};r.O.j=function(e){return 0===t[e]};var e=function(e,n){var o,s,i=n[0],a=n[1],c=n[2],u=0;if(i.some((function(e){return 0!==t[e]}))){for(o in a)r.o(a,o)&&(r.m[o]=a[o]);if(c)var l=c(r)}for(e&&e(n);u<i.length;u++)s=i[u],r.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return r.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))}();var s=r.O(void 0,[874],(function(){return r(11318)}));s=r.O(s)}(); +//# sourceMappingURL=settings-vue-settings-admin-security.js.map?v=22a6d3522ab3288623dd
\ No newline at end of file diff --git a/dist/settings-vue-settings-admin-security.js.map b/dist/settings-vue-settings-admin-security.js.map index 33c52cf4dc6..657317c6769 100644 --- a/dist/settings-vue-settings-admin-security.js.map +++ b/dist/settings-vue-settings-admin-security.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-vue-settings-admin-security.js?v=f6237cbf6db3a7831b8c","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue","webpack://nextcloud/./apps/settings/src/components/AdminTwoFactor.vue?604d","webpack://nextcloud/./apps/settings/src/components/AdminTwoFactor.vue?66cc","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue?vue&type=template&id=8794bc7c&","webpack:///nextcloud/apps/settings/src/store/admin-security.js","webpack:///nextcloud/apps/settings/src/main-admin-security.js","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue?vue&type=style&index=0&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","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/jsonp chunk loading","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(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(function(key) { return __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};","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminTwoFactor.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!./AdminTwoFactor.vue?vue&type=script&lang=js&\"","<template>\n\t<div>\n\t\t<p class=\"settings-hint\">\n\t\t\t{{ t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.') }}\n\t\t</p>\n\t\t<p v-if=\"loading\">\n\t\t\t<span class=\"icon-loading-small two-factor-loading\" />\n\t\t\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\n\t\t</p>\n\t\t<p v-else>\n\t\t\t<input id=\"two-factor-enforced\"\n\t\t\t\tv-model=\"enforced\"\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"checkbox\">\n\t\t\t<label for=\"two-factor-enforced\">{{ t('settings', 'Enforce two-factor authentication') }}</label>\n\t\t</p>\n\t\t<template v-if=\"enforced\">\n\t\t\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\n\t\t\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"enforcedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Enforced groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"excludedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Excluded groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<em>\n\t\t\t\t\t<!-- this text is also found in the documentation. update it there as well if it ever changes -->\n\t\t\t\t\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\n\t\t\t\t</em>\n\t\t\t</p>\n\t\t</template>\n\t\t<p>\n\t\t\t<button v-if=\"dirty\"\n\t\t\t\tclass=\"button primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"saveChanges\">\n\t\t\t\t{{ t('settings', 'Save changes') }}\n\t\t\t</button>\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\nimport _ from 'lodash'\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminTwoFactor',\n\tcomponents: {\n\t\tMultiselect,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tenforced: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforced\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforced', val)\n\t\t\t},\n\t\t},\n\t\tenforcedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforcedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforcedGroups', val)\n\t\t\t},\n\t\t},\n\t\texcludedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.excludedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setExcludedGroups', val)\n\t\t\t},\n\t\t},\n\t},\n\tmounted() {\n\t\t// Groups are loaded dynamically, but the assigned ones *should*\n\t\t// be valid groups, so let's add them as initial state\n\t\tthis.groups = _.sortedUniq(_.uniq(this.enforcedGroups.concat(this.excludedGroups)))\n\n\t\t// Populate the groups with a first set so the dropdown is not empty\n\t\t// when opening the page the first time\n\t\tthis.searchGroup('')\n\t},\n\tmethods: {\n\t\tsearchGroup: _.debounce(function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\n\t\t\t\t.then(res => res.data.ocs)\n\t\t\t\t.then(ocs => ocs.data.groups)\n\t\t\t\t.then(groups => { this.groups = _.sortedUniq(_.uniq(this.groups.concat(groups))) })\n\t\t\t\t.catch(err => console.error('could not search groups', err))\n\t\t\t\t.then(() => { this.loadingGroups = false })\n\t\t}, 500),\n\n\t\tsaveChanges() {\n\t\t\tthis.loading = true\n\n\t\t\tconst data = {\n\t\t\t\tenforced: this.enforced,\n\t\t\t\tenforcedGroups: this.enforcedGroups,\n\t\t\t\texcludedGroups: this.excludedGroups,\n\t\t\t}\n\t\t\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(state => {\n\t\t\t\t\tthis.state = state\n\t\t\t\t\tthis.dirty = false\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t\t})\n\t\t\t\t.then(() => { this.loading = false })\n\t\t},\n\t},\n}\n</script>\n\n<style>\n\t.two-factor-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: -2px;\n\t\tmargin-right: 1px;\n\t}\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminTwoFactor.vue?vue&type=style&index=0&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminTwoFactor.vue?vue&type=style&index=0&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AdminTwoFactor.vue?vue&type=template&id=8794bc7c&\"\nimport script from \"./AdminTwoFactor.vue?vue&type=script&lang=js&\"\nexport * from \"./AdminTwoFactor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AdminTwoFactor.vue?vue&type=style&index=0&lang=css&\"\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 () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('p',{staticClass:\"settings-hint\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.'))+\"\\n\\t\")]),_vm._v(\" \"),(_vm.loading)?_c('p',[_c('span',{staticClass:\"icon-loading-small two-factor-loading\"}),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.t('settings', 'Enforce two-factor authentication')))])]):_c('p',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.enforced),expression:\"enforced\"}],staticClass:\"checkbox\",attrs:{\"id\":\"two-factor-enforced\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.enforced)?_vm._i(_vm.enforced,null)>-1:(_vm.enforced)},on:{\"change\":function($event){var $$a=_vm.enforced,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.enforced=$$a.concat([$$v]))}else{$$i>-1&&(_vm.enforced=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.enforced=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"two-factor-enforced\"}},[_vm._v(_vm._s(_vm.t('settings', 'Enforce two-factor authentication')))])]),_vm._v(\" \"),(_vm.enforced)?[_c('h3',[_vm._v(_vm._s(_vm.t('settings', 'Limit to groups')))]),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.'))+\"\\n\\t\\t\"),_c('p',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Two-factor authentication is enforced for all members of the following groups.'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('p',[_c('Multiselect',{attrs:{\"options\":_vm.groups,\"placeholder\":_vm.t('settings', 'Enforced groups'),\"disabled\":_vm.loading,\"multiple\":true,\"searchable\":true,\"loading\":_vm.loadingGroups,\"show-no-options\":false,\"close-on-select\":false},on:{\"search-change\":_vm.searchGroup},model:{value:(_vm.enforcedGroups),callback:function ($$v) {_vm.enforcedGroups=$$v},expression:\"enforcedGroups\"}})],1),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Two-factor authentication is not enforced for members of the following groups.'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('p',[_c('Multiselect',{attrs:{\"options\":_vm.groups,\"placeholder\":_vm.t('settings', 'Excluded groups'),\"disabled\":_vm.loading,\"multiple\":true,\"searchable\":true,\"loading\":_vm.loadingGroups,\"show-no-options\":false,\"close-on-select\":false},on:{\"search-change\":_vm.searchGroup},model:{value:(_vm.excludedGroups),callback:function ($$v) {_vm.excludedGroups=$$v},expression:\"excludedGroups\"}})],1),_vm._v(\" \"),_c('p',[_c('em',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.'))+\"\\n\\t\\t\\t\")])])]:_vm._e(),_vm._v(\" \"),_c('p',[(_vm.dirty)?_c('button',{staticClass:\"button primary\",attrs:{\"disabled\":_vm.loading},on:{\"click\":_vm.saveChanges}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Save changes'))+\"\\n\\t\\t\")]):_vm._e()])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2019 Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\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 <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\n\nVue.use(Vuex)\n\nconst state = {\n\tenforced: false,\n\tenforcedGroups: [],\n\texcludedGroups: [],\n}\n\nconst mutations = {\n\tsetEnforced(state, enabled) {\n\t\tVue.set(state, 'enforced', enabled)\n\t},\n\tsetEnforcedGroups(state, total) {\n\t\tVue.set(state, 'enforcedGroups', total)\n\t},\n\tsetExcludedGroups(state, used) {\n\t\tVue.set(state, 'excludedGroups', used)\n\t},\n}\n\nexport default new Store({\n\tstrict: process.env.NODE_ENV !== 'production',\n\tstate,\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\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 <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\nimport Vue from 'vue'\n\nimport AdminTwoFactor from './components/AdminTwoFactor.vue'\nimport store from './store/admin-security'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.prototype.t = t\n\n// Not used here but required for legacy templates\nwindow.OC = window.OC || {}\nwindow.OC.Settings = window.OC.Settings || {}\n\nstore.replaceState(\n\tloadState('settings', 'mandatory2FAState')\n)\n\nconst View = Vue.extend(AdminTwoFactor)\nnew View({\n\tstore,\n}).$mount('#two-factor-auth-settings')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.two-factor-loading {\\n\\tdisplay: inline-block;\\n\\tvertical-align: sub;\\n\\tmargin-left: -2px;\\n\\tmargin-right: 1px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AdminTwoFactor.vue\"],\"names\":[],\"mappings\":\";AA+JA;CACA,qBAAA;CACA,mBAAA;CACA,iBAAA;CACA,iBAAA;AACA\",\"sourcesContent\":[\"<template>\\n\\t<div>\\n\\t\\t<p class=\\\"settings-hint\\\">\\n\\t\\t\\t{{ t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.') }}\\n\\t\\t</p>\\n\\t\\t<p v-if=\\\"loading\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small two-factor-loading\\\" />\\n\\t\\t\\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\\n\\t\\t</p>\\n\\t\\t<p v-else>\\n\\t\\t\\t<input id=\\\"two-factor-enforced\\\"\\n\\t\\t\\t\\tv-model=\\\"enforced\\\"\\n\\t\\t\\t\\ttype=\\\"checkbox\\\"\\n\\t\\t\\t\\tclass=\\\"checkbox\\\">\\n\\t\\t\\t<label for=\\\"two-factor-enforced\\\">{{ t('settings', 'Enforce two-factor authentication') }}</label>\\n\\t\\t</p>\\n\\t\\t<template v-if=\\\"enforced\\\">\\n\\t\\t\\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\\n\\t\\t\\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t<Multiselect v-model=\\\"enforcedGroups\\\"\\n\\t\\t\\t\\t\\t:options=\\\"groups\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Enforced groups')\\\"\\n\\t\\t\\t\\t\\t:disabled=\\\"loading\\\"\\n\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t:searchable=\\\"true\\\"\\n\\t\\t\\t\\t\\t:loading=\\\"loadingGroups\\\"\\n\\t\\t\\t\\t\\t:show-no-options=\\\"false\\\"\\n\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t@search-change=\\\"searchGroup\\\" />\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t<Multiselect v-model=\\\"excludedGroups\\\"\\n\\t\\t\\t\\t\\t:options=\\\"groups\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Excluded groups')\\\"\\n\\t\\t\\t\\t\\t:disabled=\\\"loading\\\"\\n\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t:searchable=\\\"true\\\"\\n\\t\\t\\t\\t\\t:loading=\\\"loadingGroups\\\"\\n\\t\\t\\t\\t\\t:show-no-options=\\\"false\\\"\\n\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t@search-change=\\\"searchGroup\\\" />\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t<em>\\n\\t\\t\\t\\t\\t<!-- this text is also found in the documentation. update it there as well if it ever changes -->\\n\\t\\t\\t\\t\\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\\n\\t\\t\\t\\t</em>\\n\\t\\t\\t</p>\\n\\t\\t</template>\\n\\t\\t<p>\\n\\t\\t\\t<button v-if=\\\"dirty\\\"\\n\\t\\t\\t\\tclass=\\\"button primary\\\"\\n\\t\\t\\t\\t:disabled=\\\"loading\\\"\\n\\t\\t\\t\\t@click=\\\"saveChanges\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Save changes') }}\\n\\t\\t\\t</button>\\n\\t\\t</p>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport axios from '@nextcloud/axios'\\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\\nimport _ from 'lodash'\\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\\n\\nexport default {\\n\\tname: 'AdminTwoFactor',\\n\\tcomponents: {\\n\\t\\tMultiselect,\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tloading: false,\\n\\t\\t\\tdirty: false,\\n\\t\\t\\tgroups: [],\\n\\t\\t\\tloadingGroups: false,\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\tenforced: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.$store.state.enforced\\n\\t\\t\\t},\\n\\t\\t\\tset(val) {\\n\\t\\t\\t\\tthis.dirty = true\\n\\t\\t\\t\\tthis.$store.commit('setEnforced', val)\\n\\t\\t\\t},\\n\\t\\t},\\n\\t\\tenforcedGroups: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.$store.state.enforcedGroups\\n\\t\\t\\t},\\n\\t\\t\\tset(val) {\\n\\t\\t\\t\\tthis.dirty = true\\n\\t\\t\\t\\tthis.$store.commit('setEnforcedGroups', val)\\n\\t\\t\\t},\\n\\t\\t},\\n\\t\\texcludedGroups: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.$store.state.excludedGroups\\n\\t\\t\\t},\\n\\t\\t\\tset(val) {\\n\\t\\t\\t\\tthis.dirty = true\\n\\t\\t\\t\\tthis.$store.commit('setExcludedGroups', val)\\n\\t\\t\\t},\\n\\t\\t},\\n\\t},\\n\\tmounted() {\\n\\t\\t// Groups are loaded dynamically, but the assigned ones *should*\\n\\t\\t// be valid groups, so let's add them as initial state\\n\\t\\tthis.groups = _.sortedUniq(_.uniq(this.enforcedGroups.concat(this.excludedGroups)))\\n\\n\\t\\t// Populate the groups with a first set so the dropdown is not empty\\n\\t\\t// when opening the page the first time\\n\\t\\tthis.searchGroup('')\\n\\t},\\n\\tmethods: {\\n\\t\\tsearchGroup: _.debounce(function(query) {\\n\\t\\t\\tthis.loadingGroups = true\\n\\t\\t\\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\\n\\t\\t\\t\\t.then(res => res.data.ocs)\\n\\t\\t\\t\\t.then(ocs => ocs.data.groups)\\n\\t\\t\\t\\t.then(groups => { this.groups = _.sortedUniq(_.uniq(this.groups.concat(groups))) })\\n\\t\\t\\t\\t.catch(err => console.error('could not search groups', err))\\n\\t\\t\\t\\t.then(() => { this.loadingGroups = false })\\n\\t\\t}, 500),\\n\\n\\t\\tsaveChanges() {\\n\\t\\t\\tthis.loading = true\\n\\n\\t\\t\\tconst data = {\\n\\t\\t\\t\\tenforced: this.enforced,\\n\\t\\t\\t\\tenforcedGroups: this.enforcedGroups,\\n\\t\\t\\t\\texcludedGroups: this.excludedGroups,\\n\\t\\t\\t}\\n\\t\\t\\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\\n\\t\\t\\t\\t.then(resp => resp.data)\\n\\t\\t\\t\\t.then(state => {\\n\\t\\t\\t\\t\\tthis.state = state\\n\\t\\t\\t\\t\\tthis.dirty = false\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch(err => {\\n\\t\\t\\t\\t\\tconsole.error('could not save changes', err)\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.then(() => { this.loading = false })\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style>\\n\\t.two-factor-loading {\\n\\t\\tdisplay: inline-block;\\n\\t\\tvertical-align: sub;\\n\\t\\tmargin-left: -2px;\\n\\t\\tmargin-right: 1px;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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__.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 = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(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 = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 788;","__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\t788: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(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(function(id) { return 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));","// 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, [874], function() { return __webpack_require__(24470); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","staticClass","_v","_s","t","directives","name","rawName","value","expression","attrs","domProps","Array","isArray","enforced","_i","on","$event","$$a","$$el","target","$$c","checked","$$i","concat","slice","groups","loading","loadingGroups","searchGroup","model","callback","$$v","enforcedGroups","excludedGroups","_e","saveChanges","Vue","Vuex","mutations","setEnforced","state","enabled","setEnforcedGroups","total","setExcludedGroups","used","Store","strict","process","__webpack_nonce__","btoa","OC","requestToken","window","Settings","store","loadState","AdminTwoFactor","$mount","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-vue-settings-admin-security.js?v=22a6d3522ab3288623dd","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue","webpack://nextcloud/./apps/settings/src/components/AdminTwoFactor.vue?604d","webpack://nextcloud/./apps/settings/src/components/AdminTwoFactor.vue?66cc","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue?vue&type=template&id=6a2ef42d&","webpack:///nextcloud/apps/settings/src/store/admin-security.js","webpack:///nextcloud/apps/settings/src/main-admin-security.js","webpack:///nextcloud/apps/settings/src/components/AdminTwoFactor.vue?vue&type=style&index=0&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","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/jsonp chunk loading","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(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(function(key) { return __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};","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminTwoFactor.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!./AdminTwoFactor.vue?vue&type=script&lang=js&\"","<template>\n\t<div>\n\t\t<p class=\"settings-hint\">\n\t\t\t{{ t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.') }}\n\t\t</p>\n\t\t<p v-if=\"loading\">\n\t\t\t<span class=\"icon-loading-small two-factor-loading\" />\n\t\t\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\n\t\t</p>\n\t\t<p v-else>\n\t\t\t<input id=\"two-factor-enforced\"\n\t\t\t\tv-model=\"enforced\"\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"checkbox\">\n\t\t\t<label for=\"two-factor-enforced\">{{ t('settings', 'Enforce two-factor authentication') }}</label>\n\t\t</p>\n\t\t<template v-if=\"enforced\">\n\t\t\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\n\t\t\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"enforcedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Enforced groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Multiselect v-model=\"excludedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Excluded groups')\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:searchable=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search-change=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<em>\n\t\t\t\t\t<!-- this text is also found in the documentation. update it there as well if it ever changes -->\n\t\t\t\t\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\n\t\t\t\t</em>\n\t\t\t</p>\n\t\t</template>\n\t\t<p>\n\t\t\t<Button v-if=\"dirty\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"saveChanges\">\n\t\t\t\t{{ t('settings', 'Save changes') }}\n\t\t\t</Button>\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\nimport Button from '@nextcloud/vue/dist/Components/Button'\n\nimport _ from 'lodash'\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminTwoFactor',\n\tcomponents: {\n\t\tMultiselect,\n\t\tButton,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tenforced: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforced\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforced', val)\n\t\t\t},\n\t\t},\n\t\tenforcedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforcedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforcedGroups', val)\n\t\t\t},\n\t\t},\n\t\texcludedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.excludedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setExcludedGroups', val)\n\t\t\t},\n\t\t},\n\t},\n\tmounted() {\n\t\t// Groups are loaded dynamically, but the assigned ones *should*\n\t\t// be valid groups, so let's add them as initial state\n\t\tthis.groups = _.sortedUniq(_.uniq(this.enforcedGroups.concat(this.excludedGroups)))\n\n\t\t// Populate the groups with a first set so the dropdown is not empty\n\t\t// when opening the page the first time\n\t\tthis.searchGroup('')\n\t},\n\tmethods: {\n\t\tsearchGroup: _.debounce(function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\n\t\t\t\t.then(res => res.data.ocs)\n\t\t\t\t.then(ocs => ocs.data.groups)\n\t\t\t\t.then(groups => { this.groups = _.sortedUniq(_.uniq(this.groups.concat(groups))) })\n\t\t\t\t.catch(err => console.error('could not search groups', err))\n\t\t\t\t.then(() => { this.loadingGroups = false })\n\t\t}, 500),\n\n\t\tsaveChanges() {\n\t\t\tthis.loading = true\n\n\t\t\tconst data = {\n\t\t\t\tenforced: this.enforced,\n\t\t\t\tenforcedGroups: this.enforcedGroups,\n\t\t\t\texcludedGroups: this.excludedGroups,\n\t\t\t}\n\t\t\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(state => {\n\t\t\t\t\tthis.state = state\n\t\t\t\t\tthis.dirty = false\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t\t})\n\t\t\t\t.then(() => { this.loading = false })\n\t\t},\n\t},\n}\n</script>\n\n<style>\n\t.two-factor-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: -2px;\n\t\tmargin-right: 1px;\n\t}\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminTwoFactor.vue?vue&type=style&index=0&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminTwoFactor.vue?vue&type=style&index=0&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AdminTwoFactor.vue?vue&type=template&id=6a2ef42d&\"\nimport script from \"./AdminTwoFactor.vue?vue&type=script&lang=js&\"\nexport * from \"./AdminTwoFactor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AdminTwoFactor.vue?vue&type=style&index=0&lang=css&\"\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 () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('p',{staticClass:\"settings-hint\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.'))+\"\\n\\t\")]),_vm._v(\" \"),(_vm.loading)?_c('p',[_c('span',{staticClass:\"icon-loading-small two-factor-loading\"}),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.t('settings', 'Enforce two-factor authentication')))])]):_c('p',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.enforced),expression:\"enforced\"}],staticClass:\"checkbox\",attrs:{\"id\":\"two-factor-enforced\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.enforced)?_vm._i(_vm.enforced,null)>-1:(_vm.enforced)},on:{\"change\":function($event){var $$a=_vm.enforced,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.enforced=$$a.concat([$$v]))}else{$$i>-1&&(_vm.enforced=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.enforced=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"two-factor-enforced\"}},[_vm._v(_vm._s(_vm.t('settings', 'Enforce two-factor authentication')))])]),_vm._v(\" \"),(_vm.enforced)?[_c('h3',[_vm._v(_vm._s(_vm.t('settings', 'Limit to groups')))]),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.'))+\"\\n\\t\\t\"),_c('p',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Two-factor authentication is enforced for all members of the following groups.'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('p',[_c('Multiselect',{attrs:{\"options\":_vm.groups,\"placeholder\":_vm.t('settings', 'Enforced groups'),\"disabled\":_vm.loading,\"multiple\":true,\"searchable\":true,\"loading\":_vm.loadingGroups,\"show-no-options\":false,\"close-on-select\":false},on:{\"search-change\":_vm.searchGroup},model:{value:(_vm.enforcedGroups),callback:function ($$v) {_vm.enforcedGroups=$$v},expression:\"enforcedGroups\"}})],1),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Two-factor authentication is not enforced for members of the following groups.'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('p',[_c('Multiselect',{attrs:{\"options\":_vm.groups,\"placeholder\":_vm.t('settings', 'Excluded groups'),\"disabled\":_vm.loading,\"multiple\":true,\"searchable\":true,\"loading\":_vm.loadingGroups,\"show-no-options\":false,\"close-on-select\":false},on:{\"search-change\":_vm.searchGroup},model:{value:(_vm.excludedGroups),callback:function ($$v) {_vm.excludedGroups=$$v},expression:\"excludedGroups\"}})],1),_vm._v(\" \"),_c('p',[_c('em',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.'))+\"\\n\\t\\t\\t\")])])]:_vm._e(),_vm._v(\" \"),_c('p',[(_vm.dirty)?_c('Button',{attrs:{\"type\":\"primary\",\"disabled\":_vm.loading},on:{\"click\":_vm.saveChanges}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Save changes'))+\"\\n\\t\\t\")]):_vm._e()],1)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2019 Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\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 <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\n\nVue.use(Vuex)\n\nconst state = {\n\tenforced: false,\n\tenforcedGroups: [],\n\texcludedGroups: [],\n}\n\nconst mutations = {\n\tsetEnforced(state, enabled) {\n\t\tVue.set(state, 'enforced', enabled)\n\t},\n\tsetEnforcedGroups(state, total) {\n\t\tVue.set(state, 'enforcedGroups', total)\n\t},\n\tsetExcludedGroups(state, used) {\n\t\tVue.set(state, 'excludedGroups', used)\n\t},\n}\n\nexport default new Store({\n\tstrict: process.env.NODE_ENV !== 'production',\n\tstate,\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\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 <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\nimport Vue from 'vue'\n\nimport AdminTwoFactor from './components/AdminTwoFactor.vue'\nimport store from './store/admin-security'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.prototype.t = t\n\n// Not used here but required for legacy templates\nwindow.OC = window.OC || {}\nwindow.OC.Settings = window.OC.Settings || {}\n\nstore.replaceState(\n\tloadState('settings', 'mandatory2FAState')\n)\n\nconst View = Vue.extend(AdminTwoFactor)\nnew View({\n\tstore,\n}).$mount('#two-factor-auth-settings')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.two-factor-loading {\\n\\tdisplay: inline-block;\\n\\tvertical-align: sub;\\n\\tmargin-left: -2px;\\n\\tmargin-right: 1px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AdminTwoFactor.vue\"],\"names\":[],\"mappings\":\";AAkKA;CACA,qBAAA;CACA,mBAAA;CACA,iBAAA;CACA,iBAAA;AACA\",\"sourcesContent\":[\"<template>\\n\\t<div>\\n\\t\\t<p class=\\\"settings-hint\\\">\\n\\t\\t\\t{{ t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.') }}\\n\\t\\t</p>\\n\\t\\t<p v-if=\\\"loading\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small two-factor-loading\\\" />\\n\\t\\t\\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\\n\\t\\t</p>\\n\\t\\t<p v-else>\\n\\t\\t\\t<input id=\\\"two-factor-enforced\\\"\\n\\t\\t\\t\\tv-model=\\\"enforced\\\"\\n\\t\\t\\t\\ttype=\\\"checkbox\\\"\\n\\t\\t\\t\\tclass=\\\"checkbox\\\">\\n\\t\\t\\t<label for=\\\"two-factor-enforced\\\">{{ t('settings', 'Enforce two-factor authentication') }}</label>\\n\\t\\t</p>\\n\\t\\t<template v-if=\\\"enforced\\\">\\n\\t\\t\\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\\n\\t\\t\\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t<Multiselect v-model=\\\"enforcedGroups\\\"\\n\\t\\t\\t\\t\\t:options=\\\"groups\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Enforced groups')\\\"\\n\\t\\t\\t\\t\\t:disabled=\\\"loading\\\"\\n\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t:searchable=\\\"true\\\"\\n\\t\\t\\t\\t\\t:loading=\\\"loadingGroups\\\"\\n\\t\\t\\t\\t\\t:show-no-options=\\\"false\\\"\\n\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t@search-change=\\\"searchGroup\\\" />\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t<Multiselect v-model=\\\"excludedGroups\\\"\\n\\t\\t\\t\\t\\t:options=\\\"groups\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Excluded groups')\\\"\\n\\t\\t\\t\\t\\t:disabled=\\\"loading\\\"\\n\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t:searchable=\\\"true\\\"\\n\\t\\t\\t\\t\\t:loading=\\\"loadingGroups\\\"\\n\\t\\t\\t\\t\\t:show-no-options=\\\"false\\\"\\n\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t@search-change=\\\"searchGroup\\\" />\\n\\t\\t\\t</p>\\n\\t\\t\\t<p>\\n\\t\\t\\t\\t<em>\\n\\t\\t\\t\\t\\t<!-- this text is also found in the documentation. update it there as well if it ever changes -->\\n\\t\\t\\t\\t\\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\\n\\t\\t\\t\\t</em>\\n\\t\\t\\t</p>\\n\\t\\t</template>\\n\\t\\t<p>\\n\\t\\t\\t<Button v-if=\\\"dirty\\\"\\n\\t\\t\\t\\ttype=\\\"primary\\\"\\n\\t\\t\\t\\t:disabled=\\\"loading\\\"\\n\\t\\t\\t\\t@click=\\\"saveChanges\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Save changes') }}\\n\\t\\t\\t</Button>\\n\\t\\t</p>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport axios from '@nextcloud/axios'\\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\\nimport Button from '@nextcloud/vue/dist/Components/Button'\\n\\nimport _ from 'lodash'\\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\\n\\nexport default {\\n\\tname: 'AdminTwoFactor',\\n\\tcomponents: {\\n\\t\\tMultiselect,\\n\\t\\tButton,\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tloading: false,\\n\\t\\t\\tdirty: false,\\n\\t\\t\\tgroups: [],\\n\\t\\t\\tloadingGroups: false,\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\tenforced: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.$store.state.enforced\\n\\t\\t\\t},\\n\\t\\t\\tset(val) {\\n\\t\\t\\t\\tthis.dirty = true\\n\\t\\t\\t\\tthis.$store.commit('setEnforced', val)\\n\\t\\t\\t},\\n\\t\\t},\\n\\t\\tenforcedGroups: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.$store.state.enforcedGroups\\n\\t\\t\\t},\\n\\t\\t\\tset(val) {\\n\\t\\t\\t\\tthis.dirty = true\\n\\t\\t\\t\\tthis.$store.commit('setEnforcedGroups', val)\\n\\t\\t\\t},\\n\\t\\t},\\n\\t\\texcludedGroups: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.$store.state.excludedGroups\\n\\t\\t\\t},\\n\\t\\t\\tset(val) {\\n\\t\\t\\t\\tthis.dirty = true\\n\\t\\t\\t\\tthis.$store.commit('setExcludedGroups', val)\\n\\t\\t\\t},\\n\\t\\t},\\n\\t},\\n\\tmounted() {\\n\\t\\t// Groups are loaded dynamically, but the assigned ones *should*\\n\\t\\t// be valid groups, so let's add them as initial state\\n\\t\\tthis.groups = _.sortedUniq(_.uniq(this.enforcedGroups.concat(this.excludedGroups)))\\n\\n\\t\\t// Populate the groups with a first set so the dropdown is not empty\\n\\t\\t// when opening the page the first time\\n\\t\\tthis.searchGroup('')\\n\\t},\\n\\tmethods: {\\n\\t\\tsearchGroup: _.debounce(function(query) {\\n\\t\\t\\tthis.loadingGroups = true\\n\\t\\t\\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\\n\\t\\t\\t\\t.then(res => res.data.ocs)\\n\\t\\t\\t\\t.then(ocs => ocs.data.groups)\\n\\t\\t\\t\\t.then(groups => { this.groups = _.sortedUniq(_.uniq(this.groups.concat(groups))) })\\n\\t\\t\\t\\t.catch(err => console.error('could not search groups', err))\\n\\t\\t\\t\\t.then(() => { this.loadingGroups = false })\\n\\t\\t}, 500),\\n\\n\\t\\tsaveChanges() {\\n\\t\\t\\tthis.loading = true\\n\\n\\t\\t\\tconst data = {\\n\\t\\t\\t\\tenforced: this.enforced,\\n\\t\\t\\t\\tenforcedGroups: this.enforcedGroups,\\n\\t\\t\\t\\texcludedGroups: this.excludedGroups,\\n\\t\\t\\t}\\n\\t\\t\\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\\n\\t\\t\\t\\t.then(resp => resp.data)\\n\\t\\t\\t\\t.then(state => {\\n\\t\\t\\t\\t\\tthis.state = state\\n\\t\\t\\t\\t\\tthis.dirty = false\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch(err => {\\n\\t\\t\\t\\t\\tconsole.error('could not save changes', err)\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.then(() => { this.loading = false })\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style>\\n\\t.two-factor-loading {\\n\\t\\tdisplay: inline-block;\\n\\t\\tvertical-align: sub;\\n\\t\\tmargin-left: -2px;\\n\\t\\tmargin-right: 1px;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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__.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 = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(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 = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 788;","__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\t788: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(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(function(id) { return 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));","// 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, [874], function() { return __webpack_require__(11318); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","staticClass","_v","_s","t","directives","name","rawName","value","expression","attrs","domProps","Array","isArray","enforced","_i","on","$event","$$a","$$el","target","$$c","checked","$$i","concat","slice","groups","loading","loadingGroups","searchGroup","model","callback","$$v","enforcedGroups","excludedGroups","_e","saveChanges","Vue","Vuex","mutations","setEnforced","state","enabled","setEnforcedGroups","total","setExcludedGroups","used","Store","strict","process","__webpack_nonce__","btoa","OC","requestToken","window","Settings","store","loadState","AdminTwoFactor","$mount","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file |