diff --git a/apps/oauth2/appinfo/info.xml b/apps/oauth2/appinfo/info.xml index 716e9ecd362d0..6cd8f4cae8d6a 100644 --- a/apps/oauth2/appinfo/info.xml +++ b/apps/oauth2/appinfo/info.xml @@ -5,7 +5,7 @@ OAuth 2.0 Allows OAuth2 compatible authentication from other web applications. The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications. - 1.15.2 + 1.15.3 agpl Lukas Reschke OAuth2 diff --git a/apps/oauth2/composer/composer/autoload_classmap.php b/apps/oauth2/composer/composer/autoload_classmap.php index b2f24b59c772a..6714e3e081a09 100644 --- a/apps/oauth2/composer/composer/autoload_classmap.php +++ b/apps/oauth2/composer/composer/autoload_classmap.php @@ -22,5 +22,6 @@ 'OCA\\OAuth2\\Migration\\Version010402Date20190107124745' => $baseDir . '/../lib/Migration/Version010402Date20190107124745.php', 'OCA\\OAuth2\\Migration\\Version011601Date20230522143227' => $baseDir . '/../lib/Migration/Version011601Date20230522143227.php', 'OCA\\OAuth2\\Migration\\Version011603Date20230620111039' => $baseDir . '/../lib/Migration/Version011603Date20230620111039.php', + 'OCA\\OAuth2\\Migration\\Version011901Date20240829164356' => $baseDir . '/../lib/Migration/Version011901Date20240829164356.php', 'OCA\\OAuth2\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php', ); diff --git a/apps/oauth2/composer/composer/autoload_static.php b/apps/oauth2/composer/composer/autoload_static.php index ad4983efbb9ab..d1ddd62f2b746 100644 --- a/apps/oauth2/composer/composer/autoload_static.php +++ b/apps/oauth2/composer/composer/autoload_static.php @@ -37,6 +37,7 @@ class ComposerStaticInitOAuth2 'OCA\\OAuth2\\Migration\\Version010402Date20190107124745' => __DIR__ . '/..' . '/../lib/Migration/Version010402Date20190107124745.php', 'OCA\\OAuth2\\Migration\\Version011601Date20230522143227' => __DIR__ . '/..' . '/../lib/Migration/Version011601Date20230522143227.php', 'OCA\\OAuth2\\Migration\\Version011603Date20230620111039' => __DIR__ . '/..' . '/../lib/Migration/Version011603Date20230620111039.php', + 'OCA\\OAuth2\\Migration\\Version011901Date20240829164356' => __DIR__ . '/..' . '/../lib/Migration/Version011901Date20240829164356.php', 'OCA\\OAuth2\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php', ); diff --git a/apps/oauth2/lib/Controller/OauthApiController.php b/apps/oauth2/lib/Controller/OauthApiController.php index dea8bd5c83da1..fec19f8f741d1 100644 --- a/apps/oauth2/lib/Controller/OauthApiController.php +++ b/apps/oauth2/lib/Controller/OauthApiController.php @@ -149,7 +149,8 @@ public function getToken( } try { - $storedClientSecret = $this->crypto->decrypt($client->getSecret()); + $storedClientSecretHash = $client->getSecret(); + $clientSecretHash = bin2hex($this->crypto->calculateHMAC($client_secret)); } catch (\Exception $e) { $this->logger->error('OAuth client secret decryption error', ['exception' => $e]); // we don't throttle here because it might not be a bruteforce attack @@ -158,7 +159,7 @@ public function getToken( ], Http::STATUS_BAD_REQUEST); } // The client id and secret must match. Else we don't provide an access token! - if ($client->getClientIdentifier() !== $client_id || $storedClientSecret !== $client_secret) { + if ($client->getClientIdentifier() !== $client_id || $storedClientSecretHash !== $clientSecretHash) { $response = new JSONResponse([ 'error' => 'invalid_client', ], Http::STATUS_BAD_REQUEST); diff --git a/apps/oauth2/lib/Controller/SettingsController.php b/apps/oauth2/lib/Controller/SettingsController.php index 3dcda337917ce..c1c397ae12172 100644 --- a/apps/oauth2/lib/Controller/SettingsController.php +++ b/apps/oauth2/lib/Controller/SettingsController.php @@ -72,8 +72,8 @@ public function addClient(string $name, $client->setName($name); $client->setRedirectUri($redirectUri); $secret = $this->secureRandom->generate(64, self::validChars); - $encryptedSecret = $this->crypto->encrypt($secret); - $client->setSecret($encryptedSecret); + $hashedSecret = bin2hex($this->crypto->calculateHMAC($secret)); + $client->setSecret($hashedSecret); $client->setClientIdentifier($this->secureRandom->generate(64, self::validChars)); $client = $this->clientMapper->insert($client); diff --git a/apps/oauth2/lib/Migration/Version011901Date20240829164356.php b/apps/oauth2/lib/Migration/Version011901Date20240829164356.php new file mode 100644 index 0000000000000..20f5754bf1138 --- /dev/null +++ b/apps/oauth2/lib/Migration/Version011901Date20240829164356.php @@ -0,0 +1,49 @@ +connection->getQueryBuilder(); + $qbUpdate->update('oauth2_clients') + ->set('secret', $qbUpdate->createParameter('updateSecret')) + ->where( + $qbUpdate->expr()->eq('id', $qbUpdate->createParameter('updateId')) + ); + + $qbSelect = $this->connection->getQueryBuilder(); + $qbSelect->select('id', 'secret') + ->from('oauth2_clients'); + $req = $qbSelect->executeQuery(); + while ($row = $req->fetch()) { + $id = $row['id']; + $storedEncryptedSecret = $row['secret']; + $secret = $this->crypto->decrypt($storedEncryptedSecret); + $hashedSecret = bin2hex($this->crypto->calculateHMAC($secret)); + $qbUpdate->setParameter('updateSecret', $hashedSecret, IQueryBuilder::PARAM_STR); + $qbUpdate->setParameter('updateId', $id, IQueryBuilder::PARAM_INT); + $qbUpdate->executeStatement(); + } + $req->closeCursor(); + } +} diff --git a/apps/oauth2/lib/Settings/Admin.php b/apps/oauth2/lib/Settings/Admin.php index 7b297116a77a4..e142d131d65f5 100644 --- a/apps/oauth2/lib/Settings/Admin.php +++ b/apps/oauth2/lib/Settings/Admin.php @@ -29,9 +29,9 @@ use OCA\OAuth2\Db\ClientMapper; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; +use OCP\IURLGenerator; use OCP\Security\ICrypto; use OCP\Settings\ISettings; -use OCP\IURLGenerator; use Psr\Log\LoggerInterface; class Admin implements ISettings { @@ -40,7 +40,6 @@ public function __construct( private IInitialState $initialState, private ClientMapper $clientMapper, private IURLGenerator $urlGenerator, - private ICrypto $crypto, private LoggerInterface $logger, ) { } @@ -51,13 +50,12 @@ public function getForm(): TemplateResponse { foreach ($clients as $client) { try { - $secret = $this->crypto->decrypt($client->getSecret()); $result[] = [ 'id' => $client->getId(), 'name' => $client->getName(), 'redirectUri' => $client->getRedirectUri(), 'clientId' => $client->getClientIdentifier(), - 'clientSecret' => $secret, + 'clientSecret' => '', ]; } catch (\Exception $e) { $this->logger->error('[Settings] OAuth client secret decryption error', ['exception' => $e]); diff --git a/apps/oauth2/src/App.vue b/apps/oauth2/src/App.vue index fc154204c8dd7..498e9b3637b92 100644 --- a/apps/oauth2/src/App.vue +++ b/apps/oauth2/src/App.vue @@ -39,6 +39,10 @@ @delete="deleteClient" /> + + {{ t('oauth2', 'Make sure you store the secret key, it cannot be recovered.') }} +

{{ t('oauth2', 'Add client') }}

@@ -68,6 +72,7 @@ import { generateUrl } from '@nextcloud/router' import { getCapabilities } from '@nextcloud/capabilities' import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js' import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' +import NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js' import { loadState } from '@nextcloud/initial-state' export default { @@ -76,6 +81,7 @@ export default { OAuthItem, NcSettingsSection, NcButton, + NcNoteCard, }, props: { clients: { @@ -92,6 +98,7 @@ export default { error: false, }, oauthDocLink: loadState('oauth2', 'oauth2-doc-link'), + showSecretWarning: false, } }, computed: { @@ -119,6 +126,7 @@ export default { ).then(response => { // eslint-disable-next-line vue/no-mutating-props this.clients.push(response.data) + this.showSecretWarning = true this.newClient.name = '' this.newClient.redirectUri = '' diff --git a/apps/oauth2/src/components/OAuthItem.vue b/apps/oauth2/src/components/OAuthItem.vue index a759af56906a0..f2f6d518b2cc8 100644 --- a/apps/oauth2/src/components/OAuthItem.vue +++ b/apps/oauth2/src/components/OAuthItem.vue @@ -37,7 +37,13 @@ {{ t('oauth2', 'Secret') }} - {{ renderedSecret }} + + {{ renderedSecret }} + + diff --git a/apps/oauth2/tests/Controller/OauthApiControllerTest.php b/apps/oauth2/tests/Controller/OauthApiControllerTest.php index 6faef7c88f31f..e1864b9612ad5 100644 --- a/apps/oauth2/tests/Controller/OauthApiControllerTest.php +++ b/apps/oauth2/tests/Controller/OauthApiControllerTest.php @@ -265,9 +265,20 @@ public function testRefreshTokenInvalidClient($clientId, $clientSecret) { ->with('validrefresh') ->willReturn($accessToken); + $this->crypto + ->method('calculateHMAC') + ->with($this->callback(function (string $text) { + return $text === 'clientSecret' || $text === 'invalidClientSecret'; + })) + ->willReturnCallback(function (string $text) { + return $text === 'clientSecret' + ? 'hashedClientSecret' + : 'hashedInvalidClientSecret'; + }); + $client = new Client(); $client->setClientIdentifier('clientId'); - $client->setSecret('clientSecret'); + $client->setSecret(bin2hex('hashedClientSecret')); $this->clientMapper->method('getByUid') ->with(42) ->willReturn($client); @@ -292,21 +303,20 @@ public function testRefreshTokenInvalidAppToken() { $client = new Client(); $client->setClientIdentifier('clientId'); - $client->setSecret('encryptedClientSecret'); + $client->setSecret(bin2hex('hashedClientSecret')); $this->clientMapper->method('getByUid') ->with(42) ->willReturn($client); $this->crypto ->method('decrypt') - ->with($this->callback(function (string $text) { - return $text === 'encryptedClientSecret' || $text === 'encryptedToken'; - })) - ->willReturnCallback(function (string $text) { - return $text === 'encryptedClientSecret' - ? 'clientSecret' - : ($text === 'encryptedToken' ? 'decryptedToken' : ''); - }); + ->with('encryptedToken') + ->willReturn('decryptedToken'); + + $this->crypto + ->method('calculateHMAC') + ->with('clientSecret') + ->willReturn('hashedClientSecret'); $this->tokenProvider->method('getTokenById') ->with(1337) @@ -331,21 +341,20 @@ public function testRefreshTokenValidAppToken() { $client = new Client(); $client->setClientIdentifier('clientId'); - $client->setSecret('encryptedClientSecret'); + $client->setSecret(bin2hex('hashedClientSecret')); $this->clientMapper->method('getByUid') ->with(42) ->willReturn($client); $this->crypto ->method('decrypt') - ->with($this->callback(function (string $text) { - return $text === 'encryptedClientSecret' || $text === 'encryptedToken'; - })) - ->willReturnCallback(function (string $text) { - return $text === 'encryptedClientSecret' - ? 'clientSecret' - : ($text === 'encryptedToken' ? 'decryptedToken' : ''); - }); + ->with('encryptedToken') + ->willReturn('decryptedToken'); + + $this->crypto + ->method('calculateHMAC') + ->with('clientSecret') + ->willReturn('hashedClientSecret'); $appToken = new PublicKeyToken(); $appToken->setUid('userId'); @@ -428,21 +437,20 @@ public function testRefreshTokenValidAppTokenBasicAuth() { $client = new Client(); $client->setClientIdentifier('clientId'); - $client->setSecret('encryptedClientSecret'); + $client->setSecret(bin2hex('hashedClientSecret')); $this->clientMapper->method('getByUid') ->with(42) ->willReturn($client); $this->crypto ->method('decrypt') - ->with($this->callback(function (string $text) { - return $text === 'encryptedClientSecret' || $text === 'encryptedToken'; - })) - ->willReturnCallback(function (string $text) { - return $text === 'encryptedClientSecret' - ? 'clientSecret' - : ($text === 'encryptedToken' ? 'decryptedToken' : ''); - }); + ->with('encryptedToken') + ->willReturn('decryptedToken'); + + $this->crypto + ->method('calculateHMAC') + ->with('clientSecret') + ->willReturn('hashedClientSecret'); $appToken = new PublicKeyToken(); $appToken->setUid('userId'); @@ -528,21 +536,20 @@ public function testRefreshTokenExpiredAppToken() { $client = new Client(); $client->setClientIdentifier('clientId'); - $client->setSecret('encryptedClientSecret'); + $client->setSecret(bin2hex('hashedClientSecret')); $this->clientMapper->method('getByUid') ->with(42) ->willReturn($client); $this->crypto ->method('decrypt') - ->with($this->callback(function (string $text) { - return $text === 'encryptedClientSecret' || $text === 'encryptedToken'; - })) - ->willReturnCallback(function (string $text) { - return $text === 'encryptedClientSecret' - ? 'clientSecret' - : ($text === 'encryptedToken' ? 'decryptedToken' : ''); - }); + ->with('encryptedToken') + ->willReturn('decryptedToken'); + + $this->crypto + ->method('calculateHMAC') + ->with('clientSecret') + ->willReturn('hashedClientSecret'); $appToken = new PublicKeyToken(); $appToken->setUid('userId'); diff --git a/apps/oauth2/tests/Controller/SettingsControllerTest.php b/apps/oauth2/tests/Controller/SettingsControllerTest.php index 817747599b7bc..39948595cbf59 100644 --- a/apps/oauth2/tests/Controller/SettingsControllerTest.php +++ b/apps/oauth2/tests/Controller/SettingsControllerTest.php @@ -103,13 +103,13 @@ public function testAddClient() { $this->crypto ->expects($this->once()) - ->method('encrypt') - ->willReturn('MyEncryptedSecret'); + ->method('calculateHMAC') + ->willReturn('MyHashedSecret'); $client = new Client(); $client->setName('My Client Name'); $client->setRedirectUri('https://example.com/'); - $client->setSecret('MySecret'); + $client->setSecret(bin2hex('MyHashedSecret')); $client->setClientIdentifier('MyClientIdentifier'); $this->clientMapper @@ -118,7 +118,7 @@ public function testAddClient() { ->with($this->callback(function (Client $c) { return $c->getName() === 'My Client Name' && $c->getRedirectUri() === 'https://example.com/' && - $c->getSecret() === 'MyEncryptedSecret' && + $c->getSecret() === bin2hex('MyHashedSecret') && $c->getClientIdentifier() === 'MyClientIdentifier'; }))->willReturnCallback(function (Client $c) { $c->setId(42); @@ -161,7 +161,7 @@ public function testDeleteClient() { $client->setId(123); $client->setName('My Client Name'); $client->setRedirectUri('https://example.com/'); - $client->setSecret('MySecret'); + $client->setSecret(bin2hex('MyHashedSecret')); $client->setClientIdentifier('MyClientIdentifier'); $this->clientMapper diff --git a/apps/oauth2/tests/Settings/AdminTest.php b/apps/oauth2/tests/Settings/AdminTest.php index fb19a9fc6d177..55f8920b2021e 100644 --- a/apps/oauth2/tests/Settings/AdminTest.php +++ b/apps/oauth2/tests/Settings/AdminTest.php @@ -28,7 +28,6 @@ use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; use OCP\IURLGenerator; -use OCP\Security\ICrypto; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\TestCase; @@ -38,7 +37,7 @@ class AdminTest extends TestCase { /** @var Admin|MockObject */ private $admin; - /** @var IInitialStateService|MockObject */ + /** @var IInitialState|MockObject */ private $initialState; /** @var ClientMapper|MockObject */ @@ -54,7 +53,6 @@ protected function setUp(): void { $this->initialState, $this->clientMapper, $this->createMock(IURLGenerator::class), - $this->createMock(ICrypto::class), $this->createMock(LoggerInterface::class) ); } diff --git a/dist/oauth2-oauth2.js b/dist/oauth2-oauth2.js index 80ef642cbfae3..bbd2688052d84 100644 --- a/dist/oauth2-oauth2.js +++ b/dist/oauth2-oauth2.js @@ -1,3 +1,3 @@ /*! For license information please see oauth2-oauth2.js.LICENSE.txt */ -(()=>{"use strict";var e,n={58179:(e,n,i)=>{var r=i(20144),o=i(4820),a=i(42588),l=i(10861),s=i.n(l);const d={name:"OAuthItem",components:{Delete:a.Z,NcButton:s()},props:{client:{type:Object,required:!0}},data(){return{id:this.client.id,name:this.client.name,redirectUri:this.client.redirectUri,clientId:this.client.clientId,clientSecret:this.client.clientSecret,renderSecret:!1}},computed:{renderedSecret(){return this.renderSecret?this.clientSecret:"****"}},methods:{toggleSecret(){this.renderSecret=!this.renderSecret}}};var c=i(93379),u=i.n(c),h=i(7795),p=i.n(h),m=i(90569),A=i.n(m),v=i(3565),f=i.n(v),g=i(19216),C=i.n(g),b=i(44589),y=i.n(b),w=i(58417),S={};S.styleTagTransform=y(),S.setAttributes=f(),S.insert=A().bind(null,"head"),S.domAPI=p(),S.insertStyleElement=C(),u()(w.Z,S),w.Z&&w.Z.locals&&w.Z.locals;var x=i(51900);const _=(0,x.Z)(d,(function(){var t=this,e=t._self._c;return e("tr",[e("td",[e("table",{staticClass:"inline"},[e("tr",[e("td",[t._v(t._s(t.t("oauth2","Name")))]),t._v(" "),e("td",[t._v(t._s(t.name))])]),t._v(" "),e("tr",[e("td",[t._v(t._s(t.t("oauth2","Redirection URI")))]),t._v(" "),e("td",[t._v(t._s(t.redirectUri))])]),t._v(" "),e("tr",[e("td",[t._v(t._s(t.t("oauth2","Client Identifier")))]),t._v(" "),e("td",[e("code",[t._v(t._s(t.clientId))])])]),t._v(" "),e("tr",[e("td",[t._v(t._s(t.t("oauth2","Secret")))]),t._v(" "),e("td",[e("code",[t._v(t._s(t.renderedSecret))]),e("a",{staticClass:"icon-toggle has-tooltip",attrs:{title:t.t("oauth2","Show client secret")},on:{click:t.toggleSecret}})])])])]),t._v(" "),e("td",{staticClass:"action-column"},[e("NcButton",{attrs:{type:"tertiary-no-background","aria-label":t.t("oauth2","Delete")},on:{click:function(e){return t.$emit("delete",t.id)}},scopedSlots:t._u([{key:"icon",fn:function(){return[e("Delete",{attrs:{size:20,title:t.t("oauth2","Delete")}})]},proxy:!0}])})],1)])}),[],!1,null,"142f39d4",null).exports;var N=i(79753),U=i(65878),O=i(13299),I=i.n(O),R=i(17963);const k={name:"App",components:{OAuthItem:_,NcSettingsSection:I(),NcButton:s()},props:{clients:{type:Array,required:!0}},data:()=>({newClient:{name:"",redirectUri:"",errorMsg:"",error:!1},oauthDocLink:(0,R.j)("oauth2","oauth2-doc-link")}),computed:{instanceName:()=>(0,U.F)().theming.name},methods:{deleteClient(t){o.Z.delete((0,N.generateUrl)("apps/oauth2/clients/{id}",{id:t})).then((e=>{this.clients=this.clients.filter((e=>e.id!==t))}))},addClient(){this.newClient.error=!1,o.Z.post((0,N.generateUrl)("apps/oauth2/clients"),{name:this.newClient.name,redirectUri:this.newClient.redirectUri}).then((t=>{this.clients.push(t.data),this.newClient.name="",this.newClient.redirectUri=""})).catch((t=>{this.newClient.error=!0,this.newClient.errorMsg=t.response.data.message}))}}};var T=i(21642),B={};B.styleTagTransform=y(),B.setAttributes=f(),B.insert=A().bind(null,"head"),B.domAPI=p(),B.insertStyleElement=C(),u()(T.Z,B),T.Z&&T.Z.locals&&T.Z.locals;const P=(0,x.Z)(k,(function(){var t=this,e=t._self._c;return e("NcSettingsSection",{attrs:{title:t.t("oauth2","OAuth 2.0 clients"),description:t.t("oauth2","OAuth 2.0 allows external services to request access to {instanceName}.",{instanceName:t.instanceName}),"doc-url":t.oauthDocLink}},[t.clients.length>0?e("table",{staticClass:"grid"},[e("thead",[e("tr",[e("th",{attrs:{id:"headerContent"}}),t._v(" "),e("th",{attrs:{id:"headerRemove"}},[t._v("\n \n\t\t\t\t\t")])])]),t._v(" "),e("tbody",t._l(t.clients,(function(n){return e("OAuthItem",{key:n.id,attrs:{client:n},on:{delete:t.deleteClient}})})),1)]):t._e(),t._v(" "),e("br"),t._v(" "),e("h3",[t._v(t._s(t.t("oauth2","Add client")))]),t._v(" "),t.newClient.error?e("span",{staticClass:"msg error"},[t._v(t._s(t.newClient.errorMsg))]):t._e(),t._v(" "),e("form",{on:{submit:function(e){return e.preventDefault(),t.addClient.apply(null,arguments)}}},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.newClient.name,expression:"newClient.name"}],attrs:{id:"name",type:"text",name:"name",placeholder:t.t("oauth2","Name")},domProps:{value:t.newClient.name},on:{input:function(e){e.target.composing||t.$set(t.newClient,"name",e.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newClient.redirectUri,expression:"newClient.redirectUri"}],attrs:{id:"redirectUri",type:"url",name:"redirectUri",placeholder:t.t("oauth2","Redirection URI")},domProps:{value:t.newClient.redirectUri},on:{input:function(e){e.target.composing||t.$set(t.newClient,"redirectUri",e.target.value)}}}),t._v(" "),e("NcButton",{staticClass:"inline-button",attrs:{"native-type":"submit"}},[t._v("\n\t\t\t\t"+t._s(t.t("oauth2","Add"))+"\n\t\t\t")])],1)])}),[],!1,null,"2483118c",null).exports;r.default.prototype.t=t,r.default.prototype.OC=OC;const D=(0,R.j)("oauth2","clients");new(r.default.extend(P))({propsData:{clients:D}}).$mount("#oauth2")},21642:(t,e,n)=>{n.d(e,{Z:()=>l});var i=n(87537),r=n.n(i),o=n(23645),a=n.n(o)()(r());a.push([t.id,"\ntable[data-v-2483118c] {\n\tmax-width: 800px;\n}\n\n/** Overwrite button height and position to be aligned with the text input */\n.inline-button[data-v-2483118c] {\n\tmin-height: 34px !important;\n\tdisplay: inline-flex !important;\n}\n","",{version:3,sources:["webpack://./apps/oauth2/src/App.vue"],names:[],mappings:";AAgJA;CACA,gBAAA;AACA;;AAEA,4EAAA;AACA;CACA,2BAAA;CACA,+BAAA;AACA",sourcesContent:["\x3c!--\n - @copyright Copyright (c) 2018 Roeland Jago Douma \n -\n - @author Roeland Jago Douma \n -\n - @license GNU AGPL version 3 or any later version\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 --\x3e\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!./OAuthItem.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!./OAuthItem.vue?vue&type=script&lang=js\"","\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!./OAuthItem.vue?vue&type=style&index=0&id=142f39d4&prod&scoped=true&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!./OAuthItem.vue?vue&type=style&index=0&id=142f39d4&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./OAuthItem.vue?vue&type=template&id=142f39d4&scoped=true\"\nimport script from \"./OAuthItem.vue?vue&type=script&lang=js\"\nexport * from \"./OAuthItem.vue?vue&type=script&lang=js\"\nimport style0 from \"./OAuthItem.vue?vue&type=style&index=0&id=142f39d4&prod&scoped=true&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 \"142f39d4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('tr',[_c('td',[_c('table',{staticClass:\"inline\"},[_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Name')))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.name))])]),_vm._v(\" \"),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Redirection URI')))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.redirectUri))])]),_vm._v(\" \"),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Client Identifier')))]),_vm._v(\" \"),_c('td',[_c('code',[_vm._v(_vm._s(_vm.clientId))])])]),_vm._v(\" \"),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Secret')))]),_vm._v(\" \"),_c('td',[_c('code',[_vm._v(_vm._s(_vm.renderedSecret))]),_c('a',{staticClass:\"icon-toggle has-tooltip\",attrs:{\"title\":_vm.t('oauth2', 'Show client secret')},on:{\"click\":_vm.toggleSecret}})])])])]),_vm._v(\" \"),_c('td',{staticClass:\"action-column\"},[_c('NcButton',{attrs:{\"type\":\"tertiary-no-background\",\"aria-label\":_vm.t('oauth2', 'Delete')},on:{\"click\":function($event){return _vm.$emit('delete', _vm.id)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Delete',{attrs:{\"size\":20,\"title\":_vm.t('oauth2', 'Delete')}})]},proxy:true}])})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\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\"","\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!./App.vue?vue&type=style&index=0&id=2483118c&prod&scoped=true&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!./App.vue?vue&type=style&index=0&id=2483118c&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=2483118c&scoped=true\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=2483118c&prod&scoped=true&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 \"2483118c\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcSettingsSection',{attrs:{\"title\":_vm.t('oauth2', 'OAuth 2.0 clients'),\"description\":_vm.t('oauth2', 'OAuth 2.0 allows external services to request access to {instanceName}.', { instanceName: _vm.instanceName }),\"doc-url\":_vm.oauthDocLink}},[(_vm.clients.length > 0)?_c('table',{staticClass:\"grid\"},[_c('thead',[_c('tr',[_c('th',{attrs:{\"id\":\"headerContent\"}}),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"headerRemove\"}},[_vm._v(\"\\n \\n\\t\\t\\t\\t\\t\")])])]),_vm._v(\" \"),_c('tbody',_vm._l((_vm.clients),function(client){return _c('OAuthItem',{key:client.id,attrs:{\"client\":client},on:{\"delete\":_vm.deleteClient}})}),1)]):_vm._e(),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('h3',[_vm._v(_vm._s(_vm.t('oauth2', 'Add client')))]),_vm._v(\" \"),(_vm.newClient.error)?_c('span',{staticClass:\"msg error\"},[_vm._v(_vm._s(_vm.newClient.errorMsg))]):_vm._e(),_vm._v(\" \"),_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.addClient.apply(null, arguments)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newClient.name),expression:\"newClient.name\"}],attrs:{\"id\":\"name\",\"type\":\"text\",\"name\":\"name\",\"placeholder\":_vm.t('oauth2', 'Name')},domProps:{\"value\":(_vm.newClient.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.newClient, \"name\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newClient.redirectUri),expression:\"newClient.redirectUri\"}],attrs:{\"id\":\"redirectUri\",\"type\":\"url\",\"name\":\"redirectUri\",\"placeholder\":_vm.t('oauth2', 'Redirection URI')},domProps:{\"value\":(_vm.newClient.redirectUri)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.newClient, \"redirectUri\", $event.target.value)}}}),_vm._v(\" \"),_c('NcButton',{staticClass:\"inline-button\",attrs:{\"native-type\":\"submit\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('oauth2', 'Add'))+\"\\n\\t\\t\\t\")])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 Roeland Jago Douma \n *\n * @author Christoph Wurst \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 Vue from 'vue'\nimport App from './App.vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nVue.prototype.t = t\nVue.prototype.OC = OC\n\nconst clients = loadState('oauth2', 'clients')\n\nconst View = Vue.extend(App)\nconst oauth = new View({\n\tpropsData: {\n\t\tclients,\n\t},\n})\noauth.$mount('#oauth2')\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, \"\\ntable[data-v-2483118c] {\\n\\tmax-width: 800px;\\n}\\n\\n/** Overwrite button height and position to be aligned with the text input */\\n.inline-button[data-v-2483118c] {\\n\\tmin-height: 34px !important;\\n\\tdisplay: inline-flex !important;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/oauth2/src/App.vue\"],\"names\":[],\"mappings\":\";AAgJA;CACA,gBAAA;AACA;;AAEA,4EAAA;AACA;CACA,2BAAA;CACA,+BAAA;AACA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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.icon-toggle[data-v-142f39d4],\\n.icon-delete[data-v-142f39d4] {\\n\\tdisplay: inline-block;\\n\\twidth: 16px;\\n\\theight: 16px;\\n\\tpadding: 10px;\\n\\tvertical-align: middle;\\n}\\ntd code[data-v-142f39d4] {\\n\\tdisplay: inline-block;\\n\\tvertical-align: middle;\\n}\\ntable.inline td[data-v-142f39d4] {\\n\\tborder: none;\\n\\tpadding: 5px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/oauth2/src/components/OAuthItem.vue\"],\"names\":[],\"mappings\":\";AAuHA;;CAEA,qBAAA;CACA,WAAA;CACA,YAAA;CACA,aAAA;CACA,sBAAA;AACA;AACA;CACA,qBAAA;CACA,sBAAA;AACA;AACA;CACA,YAAA;CACA,YAAA;AACA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\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","// 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};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__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 = 5053;","__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\t5053: 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 = (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__(58179)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","name","components","Delete","NcButton","props","client","type","Object","required","data","id","redirectUri","clientId","clientSecret","renderSecret","computed","renderedSecret","methods","toggleSecret","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","staticClass","_v","_s","t","attrs","on","$event","$emit","scopedSlots","_u","key","fn","proxy","OAuthItem","NcSettingsSection","clients","Array","newClient","errorMsg","error","oauthDocLink","loadState","instanceName","getCapabilities","theming","deleteClient","axios","generateUrl","then","response","filter","addClient","push","catch","reason","message","length","_l","_e","preventDefault","apply","arguments","directives","rawName","value","expression","domProps","target","composing","$set","Vue","OC","App","propsData","$mount","___CSS_LOADER_EXPORT___","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"oauth2-oauth2.js?v=4b681ecb5d82d290abf1","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/oauth2/src/components/OAuthItem.vue","webpack:///nextcloud/apps/oauth2/src/components/OAuthItem.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/oauth2/src/components/OAuthItem.vue?78cb","webpack://nextcloud/./apps/oauth2/src/components/OAuthItem.vue?7546","webpack://nextcloud/./apps/oauth2/src/components/OAuthItem.vue?098f","webpack:///nextcloud/apps/oauth2/src/App.vue","webpack:///nextcloud/apps/oauth2/src/App.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/oauth2/src/App.vue?639d","webpack://nextcloud/./apps/oauth2/src/App.vue?8831","webpack://nextcloud/./apps/oauth2/src/App.vue?40c9","webpack:///nextcloud/apps/oauth2/src/main.js","webpack:///nextcloud/apps/oauth2/src/App.vue?vue&type=style&index=0&id=c8d8d966&prod&scoped=true&lang=css","webpack:///nextcloud/apps/oauth2/src/components/OAuthItem.vue?vue&type=style&index=0&id=2cc31321&prod&scoped=true&lang=css","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/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/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};","\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!./OAuthItem.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!./OAuthItem.vue?vue&type=script&lang=js\"","\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!./OAuthItem.vue?vue&type=style&index=0&id=2cc31321&prod&scoped=true&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!./OAuthItem.vue?vue&type=style&index=0&id=2cc31321&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./OAuthItem.vue?vue&type=template&id=2cc31321&scoped=true\"\nimport script from \"./OAuthItem.vue?vue&type=script&lang=js\"\nexport * from \"./OAuthItem.vue?vue&type=script&lang=js\"\nimport style0 from \"./OAuthItem.vue?vue&type=style&index=0&id=2cc31321&prod&scoped=true&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 \"2cc31321\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('tr',[_c('td',[_c('table',{staticClass:\"inline\"},[_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Name')))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.name))])]),_vm._v(\" \"),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Redirection URI')))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.redirectUri))])]),_vm._v(\" \"),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Client Identifier')))]),_vm._v(\" \"),_c('td',[_c('code',[_vm._v(_vm._s(_vm.clientId))])])]),_vm._v(\" \"),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.t('oauth2', 'Secret')))]),_vm._v(\" \"),_c('td',[_c('code',[_vm._v(_vm._s(_vm.renderedSecret))]),_vm._v(\" \"),(_vm.clientSecret !== '')?_c('a',{staticClass:\"icon-toggle has-tooltip\",attrs:{\"title\":_vm.t('oauth2', 'Show client secret')},on:{\"click\":_vm.toggleSecret}}):_vm._e()])])])]),_vm._v(\" \"),_c('td',{staticClass:\"action-column\"},[_c('NcButton',{attrs:{\"type\":\"tertiary-no-background\",\"aria-label\":_vm.t('oauth2', 'Delete')},on:{\"click\":function($event){return _vm.$emit('delete', _vm.id)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Delete',{attrs:{\"size\":20,\"title\":_vm.t('oauth2', 'Delete')}})]},proxy:true}])})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\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\"","\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!./App.vue?vue&type=style&index=0&id=c8d8d966&prod&scoped=true&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!./App.vue?vue&type=style&index=0&id=c8d8d966&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=c8d8d966&scoped=true\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=c8d8d966&prod&scoped=true&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 \"c8d8d966\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcSettingsSection',{attrs:{\"title\":_vm.t('oauth2', 'OAuth 2.0 clients'),\"description\":_vm.t('oauth2', 'OAuth 2.0 allows external services to request access to {instanceName}.', { instanceName: _vm.instanceName }),\"doc-url\":_vm.oauthDocLink}},[(_vm.clients.length > 0)?_c('table',{staticClass:\"grid\"},[_c('thead',[_c('tr',[_c('th',{attrs:{\"id\":\"headerContent\"}}),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"headerRemove\"}},[_vm._v(\"\\n \\n\\t\\t\\t\\t\\t\")])])]),_vm._v(\" \"),_c('tbody',_vm._l((_vm.clients),function(client){return _c('OAuthItem',{key:client.id,attrs:{\"client\":client},on:{\"delete\":_vm.deleteClient}})}),1)]):_vm._e(),_vm._v(\" \"),(_vm.showSecretWarning)?_c('NcNoteCard',{attrs:{\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('oauth2', 'Make sure you store the secret key, it cannot be recovered.'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('h3',[_vm._v(_vm._s(_vm.t('oauth2', 'Add client')))]),_vm._v(\" \"),(_vm.newClient.error)?_c('span',{staticClass:\"msg error\"},[_vm._v(_vm._s(_vm.newClient.errorMsg))]):_vm._e(),_vm._v(\" \"),_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.addClient.apply(null, arguments)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newClient.name),expression:\"newClient.name\"}],attrs:{\"id\":\"name\",\"type\":\"text\",\"name\":\"name\",\"placeholder\":_vm.t('oauth2', 'Name')},domProps:{\"value\":(_vm.newClient.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.newClient, \"name\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newClient.redirectUri),expression:\"newClient.redirectUri\"}],attrs:{\"id\":\"redirectUri\",\"type\":\"url\",\"name\":\"redirectUri\",\"placeholder\":_vm.t('oauth2', 'Redirection URI')},domProps:{\"value\":(_vm.newClient.redirectUri)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.newClient, \"redirectUri\", $event.target.value)}}}),_vm._v(\" \"),_c('NcButton',{staticClass:\"inline-button\",attrs:{\"native-type\":\"submit\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('oauth2', 'Add'))+\"\\n\\t\\t\\t\")])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 Roeland Jago Douma \n *\n * @author Christoph Wurst \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 Vue from 'vue'\nimport App from './App.vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nVue.prototype.t = t\nVue.prototype.OC = OC\n\nconst clients = loadState('oauth2', 'clients')\n\nconst View = Vue.extend(App)\nconst oauth = new View({\n\tpropsData: {\n\t\tclients,\n\t},\n})\noauth.$mount('#oauth2')\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, \"\\ntable[data-v-c8d8d966] {\\n\\tmax-width: 800px;\\n}\\n\\n/** Overwrite button height and position to be aligned with the text input */\\n.inline-button[data-v-c8d8d966] {\\n\\tmin-height: 34px !important;\\n\\tdisplay: inline-flex !important;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/oauth2/src/App.vue\"],\"names\":[],\"mappings\":\";AAwJA;CACA,gBAAA;AACA;;AAEA,4EAAA;AACA;CACA,2BAAA;CACA,+BAAA;AACA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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.icon-toggle[data-v-2cc31321],\\n.icon-delete[data-v-2cc31321] {\\n\\tdisplay: inline-block;\\n\\twidth: 16px;\\n\\theight: 16px;\\n\\tpadding: 10px;\\n\\tvertical-align: middle;\\n}\\ntd code[data-v-2cc31321] {\\n\\tdisplay: inline-block;\\n\\tvertical-align: middle;\\n}\\ntable.inline td[data-v-2cc31321] {\\n\\tborder: none;\\n\\tpadding: 5px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/oauth2/src/components/OAuthItem.vue\"],\"names\":[],\"mappings\":\";AA6HA;;CAEA,qBAAA;CACA,WAAA;CACA,YAAA;CACA,aAAA;CACA,sBAAA;AACA;AACA;CACA,qBAAA;CACA,sBAAA;AACA;AACA;CACA,YAAA;CACA,YAAA;AACA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\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","// 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};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__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 = 5053;","__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\t5053: 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 = (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__(93208)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","name","components","Delete","NcButton","props","client","type","Object","required","data","id","redirectUri","clientId","clientSecret","renderSecret","computed","renderedSecret","methods","toggleSecret","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","staticClass","_v","_s","t","attrs","on","_e","$event","$emit","scopedSlots","_u","key","fn","proxy","OAuthItem","NcSettingsSection","NcNoteCard","clients","Array","newClient","errorMsg","error","oauthDocLink","loadState","showSecretWarning","instanceName","getCapabilities","theming","deleteClient","axios","generateUrl","then","response","filter","addClient","push","catch","reason","message","length","_l","preventDefault","apply","arguments","directives","rawName","value","expression","domProps","target","composing","$set","Vue","OC","App","propsData","$mount","___CSS_LOADER_EXPORT___","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file