@things-factory/oauth2-client 5.0.7 → 6.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/client/{bootstrap.js → bootstrap.ts} +0 -0
  2. package/{server/controllers → client}/index.ts +0 -0
  3. package/client/pages/oauth2-client/oauth2-client-importer.ts +97 -0
  4. package/client/pages/oauth2-client/oauth2-client-list-page.ts +337 -0
  5. package/client/pages/{oauth2-client-register.js → oauth2-client-register.ts} +79 -86
  6. package/client/pages/{oauth2-client.js → oauth2-client.ts} +157 -161
  7. package/client/pages/oauth2-clients.ts +192 -0
  8. package/client/{route.js → route.ts} +1 -1
  9. package/client/tsconfig.json +11 -0
  10. package/dist-client/bootstrap.d.ts +1 -0
  11. package/dist-client/bootstrap.js +2 -0
  12. package/dist-client/bootstrap.js.map +1 -0
  13. package/dist-client/index.d.ts +0 -0
  14. package/dist-client/index.js +2 -0
  15. package/dist-client/index.js.map +1 -0
  16. package/dist-client/pages/oauth2-client/oauth2-client-importer.d.ts +22 -0
  17. package/dist-client/pages/oauth2-client/oauth2-client-importer.js +100 -0
  18. package/dist-client/pages/oauth2-client/oauth2-client-importer.js.map +1 -0
  19. package/dist-client/pages/oauth2-client/oauth2-client-list-page.d.ts +55 -0
  20. package/dist-client/pages/oauth2-client/oauth2-client-list-page.js +315 -0
  21. package/dist-client/pages/oauth2-client/oauth2-client-list-page.js.map +1 -0
  22. package/dist-client/pages/oauth2-client-register.d.ts +21 -0
  23. package/dist-client/pages/oauth2-client-register.js +190 -0
  24. package/dist-client/pages/oauth2-client-register.js.map +1 -0
  25. package/dist-client/pages/oauth2-client.d.ts +35 -0
  26. package/dist-client/pages/oauth2-client.js +586 -0
  27. package/dist-client/pages/oauth2-client.js.map +1 -0
  28. package/dist-client/pages/oauth2-clients.d.ts +1 -0
  29. package/dist-client/pages/oauth2-clients.js +194 -0
  30. package/dist-client/pages/oauth2-clients.js.map +1 -0
  31. package/dist-client/route.d.ts +1 -0
  32. package/dist-client/route.js +14 -0
  33. package/dist-client/route.js.map +1 -0
  34. package/dist-client/tsconfig.tsbuildinfo +1 -0
  35. package/dist-server/index.d.ts +2 -0
  36. package/dist-server/index.js +2 -16
  37. package/dist-server/index.js.map +1 -1
  38. package/dist-server/routes.d.ts +1 -0
  39. package/dist-server/routes.js +10 -18
  40. package/dist-server/routes.js.map +1 -1
  41. package/dist-server/service/index.d.ts +5 -0
  42. package/dist-server/service/index.js +19 -0
  43. package/dist-server/service/index.js.map +1 -0
  44. package/dist-server/service/oauth2-client/index.d.ts +5 -0
  45. package/dist-server/service/oauth2-client/index.js +9 -0
  46. package/dist-server/service/oauth2-client/index.js.map +1 -0
  47. package/dist-server/service/oauth2-client/oauth2-client-mutation.d.ts +11 -0
  48. package/dist-server/service/oauth2-client/oauth2-client-mutation.js +165 -0
  49. package/dist-server/service/oauth2-client/oauth2-client-mutation.js.map +1 -0
  50. package/dist-server/service/oauth2-client/oauth2-client-query.d.ts +11 -0
  51. package/dist-server/service/oauth2-client/oauth2-client-query.js +79 -0
  52. package/dist-server/service/oauth2-client/oauth2-client-query.js.map +1 -0
  53. package/dist-server/service/oauth2-client/oauth2-client-type.d.ts +45 -0
  54. package/dist-server/service/oauth2-client/oauth2-client-type.js +177 -0
  55. package/dist-server/service/oauth2-client/oauth2-client-type.js.map +1 -0
  56. package/dist-server/service/oauth2-client/oauth2-client.d.ts +39 -0
  57. package/dist-server/service/oauth2-client/oauth2-client.js +220 -0
  58. package/dist-server/service/oauth2-client/oauth2-client.js.map +1 -0
  59. package/dist-server/tsconfig.tsbuildinfo +1 -0
  60. package/package.json +12 -10
  61. package/server/index.ts +2 -3
  62. package/server/routes.ts +9 -20
  63. package/server/service/index.ts +17 -0
  64. package/server/service/oauth2-client/index.ts +6 -0
  65. package/server/service/oauth2-client/oauth2-client-mutation.ts +188 -0
  66. package/server/service/oauth2-client/oauth2-client-query.ts +50 -0
  67. package/server/service/oauth2-client/oauth2-client-type.ts +126 -0
  68. package/server/service/oauth2-client/oauth2-client.ts +193 -0
  69. package/server/tsconfig.json +11 -0
  70. package/things-factory.config.js +5 -14
  71. package/client/index.js +0 -1
  72. package/client/pages/oauth2-clients.js +0 -197
  73. package/dist-server/controllers/index.js +0 -1
  74. package/dist-server/controllers/index.js.map +0 -1
  75. package/dist-server/entities/index.js +0 -9
  76. package/dist-server/entities/index.js.map +0 -1
  77. package/dist-server/entities/oauth2-client.js +0 -190
  78. package/dist-server/entities/oauth2-client.js.map +0 -1
  79. package/dist-server/graphql/index.js +0 -34
  80. package/dist-server/graphql/index.js.map +0 -1
  81. package/dist-server/graphql/resolvers/index.js +0 -18
  82. package/dist-server/graphql/resolvers/index.js.map +0 -1
  83. package/dist-server/graphql/resolvers/oauth2-client/create-oauth2-client.js +0 -19
  84. package/dist-server/graphql/resolvers/oauth2-client/create-oauth2-client.js.map +0 -1
  85. package/dist-server/graphql/resolvers/oauth2-client/delete-oauth2-client.js +0 -12
  86. package/dist-server/graphql/resolvers/oauth2-client/delete-oauth2-client.js.map +0 -1
  87. package/dist-server/graphql/resolvers/oauth2-client/delete-oauth2-clients.js +0 -15
  88. package/dist-server/graphql/resolvers/oauth2-client/delete-oauth2-clients.js.map +0 -1
  89. package/dist-server/graphql/resolvers/oauth2-client/get-oauth2-access-token.js +0 -49
  90. package/dist-server/graphql/resolvers/oauth2-client/get-oauth2-access-token.js.map +0 -1
  91. package/dist-server/graphql/resolvers/oauth2-client/index.js +0 -15
  92. package/dist-server/graphql/resolvers/oauth2-client/index.js.map +0 -1
  93. package/dist-server/graphql/resolvers/oauth2-client/oauth2-client-query.js +0 -46
  94. package/dist-server/graphql/resolvers/oauth2-client/oauth2-client-query.js.map +0 -1
  95. package/dist-server/graphql/resolvers/oauth2-client/refresh-oauth2-access-token.js +0 -38
  96. package/dist-server/graphql/resolvers/oauth2-client/refresh-oauth2-access-token.js.map +0 -1
  97. package/dist-server/graphql/resolvers/oauth2-client/update-oauth2-client.js +0 -15
  98. package/dist-server/graphql/resolvers/oauth2-client/update-oauth2-client.js.map +0 -1
  99. package/dist-server/graphql/types/index.js +0 -18
  100. package/dist-server/graphql/types/index.js.map +0 -1
  101. package/dist-server/graphql/types/oauth2-client/index.js +0 -42
  102. package/dist-server/graphql/types/oauth2-client/index.js.map +0 -1
  103. package/dist-server/graphql/types/oauth2-client/new-oauth2-client.js +0 -30
  104. package/dist-server/graphql/types/oauth2-client/new-oauth2-client.js.map +0 -1
  105. package/dist-server/graphql/types/oauth2-client/oauth2-client-list.js +0 -14
  106. package/dist-server/graphql/types/oauth2-client/oauth2-client-list.js.map +0 -1
  107. package/dist-server/graphql/types/oauth2-client/oauth2-client-patch.js +0 -30
  108. package/dist-server/graphql/types/oauth2-client/oauth2-client-patch.js.map +0 -1
  109. package/dist-server/graphql/types/oauth2-client/oauth2-client.js +0 -38
  110. package/dist-server/graphql/types/oauth2-client/oauth2-client.js.map +0 -1
  111. package/server/entities/index.ts +0 -9
  112. package/server/entities/oauth2-client.ts +0 -156
  113. package/server/graphql/index.ts +0 -9
  114. package/server/graphql/resolvers/index.ts +0 -1
  115. package/server/graphql/resolvers/oauth2-client/create-oauth2-client.ts +0 -24
  116. package/server/graphql/resolvers/oauth2-client/delete-oauth2-client.ts +0 -10
  117. package/server/graphql/resolvers/oauth2-client/delete-oauth2-clients.ts +0 -13
  118. package/server/graphql/resolvers/oauth2-client/get-oauth2-access-token.ts +0 -64
  119. package/server/graphql/resolvers/oauth2-client/index.ts +0 -21
  120. package/server/graphql/resolvers/oauth2-client/oauth2-client-query.ts +0 -62
  121. package/server/graphql/resolvers/oauth2-client/refresh-oauth2-access-token.ts +0 -54
  122. package/server/graphql/resolvers/oauth2-client/update-oauth2-client.ts +0 -17
  123. package/server/graphql/types/index.ts +0 -1
  124. package/server/graphql/types/oauth2-client/index.ts +0 -23
  125. package/server/graphql/types/oauth2-client/new-oauth2-client.ts +0 -24
  126. package/server/graphql/types/oauth2-client/oauth2-client-list.ts +0 -8
  127. package/server/graphql/types/oauth2-client/oauth2-client-patch.ts +0 -24
  128. package/server/graphql/types/oauth2-client/oauth2-client.ts +0 -32
  129. package/tsconfig.json +0 -9
@@ -0,0 +1,586 @@
1
+ import { __asyncGenerator, __await, __decorate, __metadata } from "tslib";
2
+ import '@operato/help/ox-help-icon.js';
3
+ import Clipboard from 'clipboard';
4
+ import gql from 'graphql-tag';
5
+ import { css, html } from 'lit';
6
+ import { customElement, property, query, queryAll } from 'lit/decorators.js';
7
+ import { asyncReplace } from 'lit/directives/async-replace.js';
8
+ import { connect } from 'pwa-helpers/connect-mixin.js';
9
+ import { client } from '@operato/graphql';
10
+ import { notify } from '@operato/layout';
11
+ import { navigate, PageView, store } from '@operato/shell';
12
+ import { sleep } from '@operato/utils';
13
+ const OAUTH2CLIENT = `
14
+ id
15
+ name
16
+ description
17
+ icon
18
+ grantType
19
+ clientId
20
+ clientSecret
21
+ callbackUrl
22
+ authUrl
23
+ accessTokenUrl
24
+ webhook
25
+ username
26
+ password
27
+ codeChallengeMethod
28
+ codeVerifier
29
+ scopes
30
+ accessToken
31
+ refreshToken
32
+ jwtToken
33
+ expires
34
+ tokenType
35
+ updatedAt
36
+ createdAt
37
+ `;
38
+ let Oauth2Client = class Oauth2Client extends connect(store)(PageView) {
39
+ get context() {
40
+ var _a;
41
+ return {
42
+ title: {
43
+ icon: 'apps',
44
+ text: (_a = this.oauth2Client) === null || _a === void 0 ? void 0 : _a.name
45
+ }
46
+ };
47
+ }
48
+ render() {
49
+ var oauth2Client = this.oauth2Client || {};
50
+ return html `
51
+ <div>
52
+ <h2><mwc-icon>apps</mwc-icon>&nbsp;${oauth2Client.name || ''}</h2>
53
+ <p page-description>${oauth2Client.description || ''}</p>
54
+ </div>
55
+
56
+ <div icon>
57
+ <img src=${oauth2Client.icon}>
58
+ </div>
59
+
60
+ <form>
61
+ <div fieldset-container>
62
+ <fieldset>
63
+ <legend>oauth2 client</legend>
64
+ <div field-2column>
65
+ <div field grid-span>
66
+ <label for='name'>name</label>
67
+ <input type='text' id="name" name="name" .value=${oauth2Client.name || ''}>
68
+ </div>
69
+
70
+ <div field grid-span>
71
+ <label for='description'>description</label>
72
+ <input type='text' id="description" name="description" .value=${oauth2Client.description || ''}>
73
+ </div>
74
+
75
+ <div field grid-span>
76
+ <label for='icon'>icon</label>
77
+ <input type='text' id="icon" name="icon"
78
+ @change=${e => (this._icon = e.target.value)}
79
+ .value=${oauth2Client.icon || ''}
80
+ >
81
+ </div>
82
+ </div>
83
+ </fieldset>
84
+ </div>
85
+
86
+ <div fieldset-container>
87
+ <fieldset>
88
+ <legend>authorization</legend>
89
+ <div field-2column>
90
+ <div field grid-span>
91
+ <label for='grant-type'>grant type
92
+ <ox-help-icon topic='/oauth2-client/grant-type'></ox-help-icon>
93
+ </label>
94
+ <select type='text' id="grant-type" name="grantType" .value=${oauth2Client.grantType || 'code'}
95
+ @change=${e => (this._grantType = e.target.value)}>
96
+ <option></option>
97
+ <option value='code'>Authorization Code Grant</option>
98
+ <option value='jwt'>JWT As Authorization Grant</option>
99
+ <option value='owner'>Resource Owner Password Credentials Grant</option>
100
+ <option value='credentials'>Client Credentials Grant</option>
101
+ </select>
102
+ </div>
103
+
104
+ <div field grid-span>
105
+ <label for='auth-url'>auth url</label>
106
+ <input type='text' id="auth-url" name="authUrl" .value=${oauth2Client.authUrl || ''}>
107
+ <div input-hint>The endpoint for authorization server. This is used to get the authorization code.</div>
108
+ </div>
109
+
110
+ <div field grid-span>
111
+ <label for='access-token-url'>access token url</label>
112
+ <input type='text' id="access-token-url" name="accessTokenUrl" .value=${oauth2Client.accessTokenUrl || ''}>
113
+ <div input-hint>The endpoint for authentication server. This is used to exchange the authorization code for an access token.</div>
114
+ </div>
115
+
116
+ <div field grid-span>
117
+ <label for='callback-url'>callback url</label>
118
+ <input type='text' id="callback-url" name="callbackUrl" .value=${oauth2Client.callbackUrl || ''}>
119
+ <div input-hint>This is the callback url that you will be redirected to, after your application is authorized.
120
+ This is used to extract the authorization code or access token.
121
+ Normally, this callback url should match the one you use during the application registration process.
122
+ If you leave this field empty, default callback url(${location.origin}/oauth2-client/callback</label>) will be used.</div>
123
+ </div>
124
+
125
+ <div field grid-span>
126
+ <label for='client-id'>client id</label>
127
+ <input type='text' id="client-id" name="clientId" .value=${oauth2Client.clientId || ''}>
128
+ <div input-hint>The client identifier issued to the client during the application registration process.</div>
129
+ </div>
130
+
131
+ <div field grid-span>
132
+ <label for='client-secret'>client secret</label>
133
+ <input type='text' id="client-secret" name="clientSecret" .value=${oauth2Client.clientSecret || ''}>
134
+ <div input-hint>The client secret issued to the client during the application registration process.</div>
135
+ </div>
136
+
137
+ ${this._grantType == 'owner'
138
+ ? html `
139
+ <div field grid-span>
140
+ <label for="username">user name</label>
141
+ <input type="text" id="username" name="username" .value=${oauth2Client.username || ''} />
142
+ </div>
143
+
144
+ <div field grid-span>
145
+ <label for="password">password</label>
146
+ <input type="password" id="password" name="password" .value=${oauth2Client.password || ''} />
147
+ </div>
148
+ `
149
+ : html ``}
150
+
151
+ ${this._grantType == 'jwt'
152
+ ? html `
153
+ <div field grid-span>
154
+ <label for="jwt-token">jwt-token</label>
155
+ <input type="text" id="jwt-token" name="jwtToken" .value=${oauth2Client.jwtToken || ''} />
156
+ <div input-hint>The JWT Bearer Token for JWT As Authorization Grant</div>
157
+ </div>
158
+ `
159
+ : html ``}
160
+
161
+ <!-- code PKCE grant type not supported yet
162
+ <div field grid-span>
163
+ <label for='code-challenge-method'>code challenge method</label>
164
+ <select type='text' id="code-challenge-method" name="codeChallengeMethod" .value=${oauth2Client.codeChallengeMethod}>
165
+ <option></option>
166
+ <option>SHA-256</option>
167
+ <option>Plain</option>
168
+ </select>
169
+ <div input-hint>Algorithm used for generating the code challenge</div>
170
+ </div>
171
+
172
+ <div field grid-span>
173
+ <label for='code-verifier'>code verifier
174
+ <ox-help-icon topic='/oauth2-client/code-verifier'></ox-help-icon>
175
+ </label>
176
+ <input type='text' id="code-verifier" name="codeVerifier" .value=${oauth2Client.codeVerifier || ''}>
177
+ <div input-hint>A random, 43-128 character string used to connect the authorization request to the token request.
178
+ Uses the following characters: [A-Z]/[a-z]/[0-9]/"-"/"."/"_"/"~".</div>
179
+ </div>
180
+ -->
181
+
182
+ <div field grid-span>
183
+ <label for='scopes'>scopes</label>
184
+ <input type='text' id="scopes" name="scopes" .value=${oauth2Client.scopes || ''}>
185
+ <div input-hint>The scopes of the access request. It may have multiple space-delimited values.</div>
186
+ </div>
187
+ </div>
188
+ </fieldset>
189
+ </div>
190
+
191
+ <div fieldset-container>
192
+ <fieldset>
193
+ <div field grid-span>
194
+ <label for='token-type'>token type</label>
195
+ <input type='text' id="token-type" .value=${oauth2Client.tokenType || ''} readonly>
196
+ <div input-hint>Added to the authorization header before the access token.</div>
197
+ </div>
198
+
199
+ <legend>access token</legend>
200
+ <div field-2column>
201
+ <div field grid-span>
202
+ <label for="access-token">access token</label>
203
+ <input id="access-token" type="text" .value=${oauth2Client.accessToken || ''} readonly />
204
+ <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>
205
+ ${oauth2Client.expires
206
+ ? html `<div input-hint>
207
+ expired in ${new Date(Number(oauth2Client.expires))} :
208
+ ${asyncReplace(this.expTimer(oauth2Client.expires))}
209
+ </div>`
210
+ : html ``}
211
+ </div>
212
+
213
+ <div field grid-span>
214
+ <label for="refresh-token">refresh token</label>
215
+ <input id="refresh-token" type="text" .value=${oauth2Client.refreshToken || ''} readonly />
216
+ <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>
217
+ </div>
218
+ </div>
219
+ </fieldset>
220
+ </div>
221
+
222
+ <button @click=${e => this.deleteOauth2Client(e)}>delete this app</button>
223
+ <button @click=${async (e) => {
224
+ e.preventDefault();
225
+ await this.updateOauth2Client();
226
+ await this.generateOauth2AccessToken();
227
+ }}>get new access token</button>
228
+ <button @click=${async (e) => {
229
+ e.preventDefault();
230
+ await this.updateOauth2Client();
231
+ await this.refreshOauth2AccessToken();
232
+ }} ?disabled=${!oauth2Client.refreshToken}>refresh access token</button>
233
+ <input type="submit" value="update" @click=${async (e) => {
234
+ e.preventDefault();
235
+ await this.updateOauth2Client();
236
+ }}>
237
+ </form>
238
+ `;
239
+ }
240
+ updated(changes) {
241
+ var _a;
242
+ if (changes.has('oauth2Client')) {
243
+ this._grantType = (_a = this.oauth2Client) === null || _a === void 0 ? void 0 : _a.grantType;
244
+ }
245
+ }
246
+ firstUpdated() {
247
+ this.clipboard = new Clipboard(this.copybuttons, {
248
+ target: (trigger => trigger.parentElement.querySelector('input'))
249
+ });
250
+ }
251
+ async pageUpdated(changes, lifecycle, before) {
252
+ if (this.active) {
253
+ await this.fetchOauth2Client();
254
+ }
255
+ }
256
+ expTimer(exp) {
257
+ return __asyncGenerator(this, arguments, function* expTimer_1() {
258
+ const DAY = 24 * 60 * 60;
259
+ const HOUR = 60 * 60;
260
+ const MIN = 60;
261
+ while (this.active) {
262
+ var remain = Math.floor((Number(exp) - Date.now()) / 1000);
263
+ const days = Math.floor(remain / DAY);
264
+ remain -= days * DAY;
265
+ const hours = Math.floor(remain / HOUR);
266
+ remain -= hours * HOUR;
267
+ const mins = Math.floor(remain / MIN);
268
+ const secs = remain - mins * MIN;
269
+ yield yield __await(`${days} days ${hours} hours ${mins} mins ${secs} seconds remain`);
270
+ yield __await(sleep(1000));
271
+ }
272
+ });
273
+ }
274
+ async fetchOauth2Client() {
275
+ const response = await client.query({
276
+ query: gql `
277
+ query($id: String!) {
278
+ oauth2Client(id: $id) {
279
+ ${OAUTH2CLIENT}
280
+ }
281
+ }
282
+ `,
283
+ variables: {
284
+ id: this.lifecycle.resourceId
285
+ }
286
+ });
287
+ this.oauth2Client = response.data.oauth2Client;
288
+ }
289
+ async updateOauth2Client() {
290
+ const formData = new FormData(this.form);
291
+ const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => {
292
+ patch[key] = value;
293
+ return patch;
294
+ }, {});
295
+ const id = this.lifecycle.resourceId;
296
+ const response = await client.mutate({
297
+ mutation: gql `
298
+ mutation($id: String!, $patch: Oauth2ClientPatch!) {
299
+ updateOauth2Client(id: $id, patch: $patch) {
300
+ ${OAUTH2CLIENT}
301
+ }
302
+ }
303
+ `,
304
+ variables: {
305
+ id,
306
+ patch
307
+ }
308
+ });
309
+ if (response.errors) {
310
+ notify({
311
+ level: 'error',
312
+ message: 'update oauth2 client fail'
313
+ });
314
+ }
315
+ else {
316
+ this.oauth2Client = response.data.updateOauth2Client;
317
+ }
318
+ }
319
+ async deleteOauth2Client(e) {
320
+ e.preventDefault();
321
+ const id = this.lifecycle.resourceId;
322
+ const response = await client.mutate({
323
+ mutation: gql `
324
+ mutation ($id: String!) {
325
+ deleteOauth2Client(id: $id)
326
+ }
327
+ `,
328
+ variables: {
329
+ id
330
+ }
331
+ });
332
+ if (response.errors) {
333
+ notify({
334
+ level: 'error',
335
+ message: 'delete oauth2 client fail'
336
+ });
337
+ }
338
+ else {
339
+ navigate('oauth2-clients');
340
+ }
341
+ }
342
+ async generateOauth2AccessToken() {
343
+ const id = this.lifecycle.resourceId;
344
+ if (this.oauth2Client.grantType == 'code') {
345
+ const response = await client.mutate({
346
+ mutation: gql `
347
+ mutation ($id: String!) {
348
+ getOauth2AuthUrl(id: $id)
349
+ }
350
+ `,
351
+ variables: {
352
+ id: this.lifecycle.resourceId
353
+ }
354
+ });
355
+ if (!response.errors) {
356
+ location.href = response.data.getOauth2AuthUrl;
357
+ }
358
+ else {
359
+ notify({
360
+ level: 'error',
361
+ message: 'getting application access token fail'
362
+ });
363
+ }
364
+ }
365
+ else {
366
+ const response = await client.mutate({
367
+ mutation: gql `
368
+ mutation($id: String!) {
369
+ getOauth2AccessToken(id: $id) {
370
+ ${OAUTH2CLIENT}
371
+ }
372
+ }
373
+ `,
374
+ variables: {
375
+ id: this.lifecycle.resourceId
376
+ }
377
+ });
378
+ if (response.errors) {
379
+ notify({
380
+ level: 'error',
381
+ message: 'getting application access token fail'
382
+ });
383
+ }
384
+ else {
385
+ this.oauth2Client = response.data.getOauth2AccessToken;
386
+ notify({
387
+ level: 'info',
388
+ message: 'got application access token successfully'
389
+ });
390
+ }
391
+ }
392
+ }
393
+ async refreshOauth2AccessToken() {
394
+ const id = this.lifecycle.resourceId;
395
+ const response = await client.mutate({
396
+ mutation: gql `
397
+ mutation($id: String!) {
398
+ refreshOauth2AccessToken(id: $id) {
399
+ ${OAUTH2CLIENT}
400
+ }
401
+ }
402
+ `,
403
+ variables: {
404
+ id: this.lifecycle.resourceId
405
+ }
406
+ });
407
+ if (response.errors) {
408
+ notify({
409
+ level: 'error',
410
+ message: 'getting application access token fail'
411
+ });
412
+ }
413
+ else {
414
+ this.oauth2Client = response.data.refreshOauth2AccessToken;
415
+ notify({
416
+ level: 'info',
417
+ message: 'got application access token successfully'
418
+ });
419
+ }
420
+ }
421
+ };
422
+ Oauth2Client.styles = [
423
+ css `
424
+ :host {
425
+ display: flex;
426
+ flex-direction: column;
427
+ overflow-y: auto;
428
+ position: relative;
429
+
430
+ background-color: var(--main-section-background-color);
431
+ padding: var(--padding-wide);
432
+ }
433
+ h2 {
434
+ margin: var(--title-margin);
435
+ font: var(--title-font);
436
+ color: var(--title-text-color);
437
+ }
438
+ [page-description] {
439
+ margin: var(--page-description-margin);
440
+ font: var(--page-description-font);
441
+ color: var(--page-description-color);
442
+ }
443
+ [icon] {
444
+ position: absolute;
445
+ top: 10px;
446
+ right: 10px;
447
+ max-width: 80px;
448
+ }
449
+ [icon] img {
450
+ max-width: 100%;
451
+ max-height: 100%;
452
+ }
453
+
454
+ [button-primary] {
455
+ background-color: var(--button-primary-background-color);
456
+ border: var(--button-border);
457
+ border-radius: var(--button-border-radius);
458
+ margin: var(--button-margin);
459
+ padding: var(--button-primary-padding);
460
+ color: var(--button-primary-color);
461
+ font: var(--button-primary-font);
462
+ text-transform: var(--button-text-transform);
463
+
464
+ text-decoration: none;
465
+ }
466
+ [button-primary]:hover {
467
+ background-color: var(--button-primary-active-background-color);
468
+ box-shadow: var(--button-active-box-shadow);
469
+ }
470
+ label {
471
+ font: var(--label-font);
472
+ color: var(--label-color);
473
+ text-transform: var(--label-text-transform);
474
+ }
475
+ input,
476
+ select {
477
+ border: var(--border-dark-color);
478
+ border-radius: var(--border-radius);
479
+ margin: var(--input-margin);
480
+ padding: var(--input-padding);
481
+ font: var(--input-font);
482
+
483
+ flex: 1;
484
+ }
485
+ select:focus,
486
+ input:focus,
487
+ button {
488
+ outline: none;
489
+ }
490
+ form {
491
+ max-width: var(--content-container-max-width);
492
+ }
493
+ [fieldset-container] {
494
+ background-color: var(--theme-white-color);
495
+ margin: var(--margin-wide) 0 var(--margin-default) 0;
496
+ padding: var(--padding-default);
497
+ border-radius: var(--border-radius);
498
+ box-shadow: var(--box-shadow);
499
+ }
500
+ [fieldset-container] fieldset {
501
+ margin: 0;
502
+ margin-top: -15px;
503
+ }
504
+ fieldset {
505
+ border-radius: var(--border-radius);
506
+ border: var(--border-dark-color);
507
+ margin: var(--fieldset-margin);
508
+ padding: var(--fieldset-padding);
509
+ }
510
+ legend {
511
+ padding: var(--legend-padding);
512
+ font-weight: bold;
513
+ color: var(--legend-color);
514
+ }
515
+ [field-2column] {
516
+ display: grid;
517
+ grid-template-columns: 1fr 1fr;
518
+ grid-gap: 15px;
519
+ }
520
+ [field] {
521
+ display: flex;
522
+ flex-direction: column;
523
+ position: relative;
524
+ }
525
+ [grid-span] {
526
+ grid-column: span 2;
527
+ }
528
+ button,
529
+ input[type='submit'],
530
+ [button-in-field] {
531
+ background-color: var(--button-background-color);
532
+ border: var(--button-border);
533
+ border-radius: var(--button-border-radius);
534
+ padding: var(--button-padding);
535
+ color: var(--button-color);
536
+ font: var(--button-font);
537
+ text-transform: var(--button-text-transform);
538
+
539
+ margin: var(--margin-default) 0 var(--margin-default) var(--margin-default);
540
+ float: right;
541
+ text-decoration: none;
542
+ }
543
+ button:hover,
544
+ input[type='submit']:hover {
545
+ border: var(--button-activ-border);
546
+ box-shadow: var(--button-active-box-shadow);
547
+ }
548
+ [button-in-field] {
549
+ border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;
550
+ position: absolute;
551
+ top: 11px;
552
+ right: 0;
553
+ max-height: 36px;
554
+ }
555
+ [input-hint] {
556
+ font: var(--input-hint-font);
557
+ color: var(--input-hint-color);
558
+ }
559
+ @media screen and (max-width: 480px) {
560
+ [field] {
561
+ grid-column: span 2;
562
+ }
563
+ }
564
+ `
565
+ ];
566
+ __decorate([
567
+ property({ type: Object }),
568
+ __metadata("design:type", Object)
569
+ ], Oauth2Client.prototype, "oauth2Client", void 0);
570
+ __decorate([
571
+ property({ type: String }),
572
+ __metadata("design:type", String)
573
+ ], Oauth2Client.prototype, "_grantType", void 0);
574
+ __decorate([
575
+ query('form'),
576
+ __metadata("design:type", HTMLFormElement)
577
+ ], Oauth2Client.prototype, "form", void 0);
578
+ __decorate([
579
+ queryAll('[clipboard-copy]'),
580
+ __metadata("design:type", Object)
581
+ ], Oauth2Client.prototype, "copybuttons", void 0);
582
+ Oauth2Client = __decorate([
583
+ customElement('oauth2-client')
584
+ ], Oauth2Client);
585
+ export { Oauth2Client };
586
+ //# sourceMappingURL=oauth2-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2-client.js","sourceRoot":"","sources":["../../client/pages/oauth2-client.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/help/ox-help-icon.js'\n\nimport Clipboard from 'clipboard'\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, queryAll } from 'lit/decorators.js'\nimport { asyncReplace } from 'lit/directives/async-replace.js'\nimport { connect } from 'pwa-helpers/connect-mixin.js'\n\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { navigate, PageView, store } from '@operato/shell'\nimport { sleep } from '@operato/utils'\n\nconst OAUTH2CLIENT = `\nid\nname\ndescription\nicon\ngrantType\nclientId\nclientSecret\ncallbackUrl\nauthUrl\naccessTokenUrl\nwebhook\nusername\npassword\ncodeChallengeMethod\ncodeVerifier\nscopes\naccessToken\nrefreshToken\njwtToken\nexpires\ntokenType\nupdatedAt\ncreatedAt\n`\n\n@customElement('oauth2-client')\nexport class Oauth2Client extends connect(store)(PageView) {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n position: relative;\n\n background-color: var(--main-section-background-color);\n padding: var(--padding-wide);\n }\n h2 {\n margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n }\n [page-description] {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n }\n [icon] {\n position: absolute;\n top: 10px;\n right: 10px;\n max-width: 80px;\n }\n [icon] img {\n max-width: 100%;\n max-height: 100%;\n }\n\n [button-primary] {\n background-color: var(--button-primary-background-color);\n border: var(--button-border);\n border-radius: var(--button-border-radius);\n margin: var(--button-margin);\n padding: var(--button-primary-padding);\n color: var(--button-primary-color);\n font: var(--button-primary-font);\n text-transform: var(--button-text-transform);\n\n text-decoration: none;\n }\n [button-primary]:hover {\n background-color: var(--button-primary-active-background-color);\n box-shadow: var(--button-active-box-shadow);\n }\n label {\n font: var(--label-font);\n color: var(--label-color);\n text-transform: var(--label-text-transform);\n }\n input,\n select {\n border: var(--border-dark-color);\n border-radius: var(--border-radius);\n margin: var(--input-margin);\n padding: var(--input-padding);\n font: var(--input-font);\n\n flex: 1;\n }\n select:focus,\n input:focus,\n button {\n outline: none;\n }\n form {\n max-width: var(--content-container-max-width);\n }\n [fieldset-container] {\n background-color: var(--theme-white-color);\n margin: var(--margin-wide) 0 var(--margin-default) 0;\n padding: var(--padding-default);\n border-radius: var(--border-radius);\n box-shadow: var(--box-shadow);\n }\n [fieldset-container] fieldset {\n margin: 0;\n margin-top: -15px;\n }\n fieldset {\n border-radius: var(--border-radius);\n border: var(--border-dark-color);\n margin: var(--fieldset-margin);\n padding: var(--fieldset-padding);\n }\n legend {\n padding: var(--legend-padding);\n font-weight: bold;\n color: var(--legend-color);\n }\n [field-2column] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: 15px;\n }\n [field] {\n display: flex;\n flex-direction: column;\n position: relative;\n }\n [grid-span] {\n grid-column: span 2;\n }\n button,\n input[type='submit'],\n [button-in-field] {\n background-color: var(--button-background-color);\n border: var(--button-border);\n border-radius: var(--button-border-radius);\n padding: var(--button-padding);\n color: var(--button-color);\n font: var(--button-font);\n text-transform: var(--button-text-transform);\n\n margin: var(--margin-default) 0 var(--margin-default) var(--margin-default);\n float: right;\n text-decoration: none;\n }\n button:hover,\n input[type='submit']:hover {\n border: var(--button-activ-border);\n box-shadow: var(--button-active-box-shadow);\n }\n [button-in-field] {\n border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;\n position: absolute;\n top: 11px;\n right: 0;\n max-height: 36px;\n }\n [input-hint] {\n font: var(--input-hint-font);\n color: var(--input-hint-color);\n }\n @media screen and (max-width: 480px) {\n [field] {\n grid-column: span 2;\n }\n }\n `\n ]\n\n @property({ type: Object }) oauth2Client: any\n @property({ type: String }) _grantType?: string\n\n @query('form') form!: HTMLFormElement\n @queryAll('[clipboard-copy]') copybuttons\n\n private clipboard?: Clipboard\n private _icon?: string\n\n get context() {\n return {\n title: {\n icon: 'apps',\n text: this.oauth2Client?.name\n }\n }\n }\n\n render() {\n var oauth2Client = this.oauth2Client || {}\n\n return html`\n <div>\n <h2><mwc-icon>apps</mwc-icon>&nbsp;${oauth2Client.name || ''}</h2>\n <p page-description>${oauth2Client.description || ''}</p>\n </div>\n\n <div icon>\n <img src=${oauth2Client.icon}>\n </div>\n\n <form>\n <div fieldset-container>\n <fieldset>\n <legend>oauth2 client</legend>\n <div field-2column>\n <div field grid-span>\n <label for='name'>name</label>\n <input type='text' id=\"name\" name=\"name\" .value=${oauth2Client.name || ''}>\n </div>\n\n <div field grid-span>\n <label for='description'>description</label>\n <input type='text' id=\"description\" name=\"description\" .value=${oauth2Client.description || ''}>\n </div>\n\n <div field grid-span>\n <label for='icon'>icon</label>\n <input type='text' id=\"icon\" name=\"icon\" \n @change=${e => (this._icon = e.target.value)} \n .value=${oauth2Client.icon || ''}\n >\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <legend>authorization</legend>\n <div field-2column>\n <div field grid-span>\n <label for='grant-type'>grant type\n <ox-help-icon topic='/oauth2-client/grant-type'></ox-help-icon>\n </label>\n <select type='text' id=\"grant-type\" name=\"grantType\" .value=${oauth2Client.grantType || 'code'} \n @change=${e => (this._grantType = e.target.value)}>\n <option></option>\n <option value='code'>Authorization Code Grant</option>\n <option value='jwt'>JWT As Authorization Grant</option>\n <option value='owner'>Resource Owner Password Credentials Grant</option>\n <option value='credentials'>Client Credentials Grant</option>\n </select>\n </div>\n\n <div field grid-span>\n <label for='auth-url'>auth url</label>\n <input type='text' id=\"auth-url\" name=\"authUrl\" .value=${oauth2Client.authUrl || ''}>\n <div input-hint>The endpoint for authorization server. This is used to get the authorization code.</div>\n </div>\n\n <div field grid-span>\n <label for='access-token-url'>access token url</label>\n <input type='text' id=\"access-token-url\" name=\"accessTokenUrl\" .value=${\n oauth2Client.accessTokenUrl || ''\n }>\n <div input-hint>The endpoint for authentication server. This is used to exchange the authorization code for an access token.</div>\n </div>\n\n <div field grid-span>\n <label for='callback-url'>callback url</label>\n <input type='text' id=\"callback-url\" name=\"callbackUrl\" .value=${oauth2Client.callbackUrl || ''}>\n <div input-hint>This is the callback url that you will be redirected to, after your application is authorized.\n This is used to extract the authorization code or access token.\n Normally, this callback url should match the one you use during the application registration process.\n If you leave this field empty, default callback url(${\n location.origin\n }/oauth2-client/callback</label>) will be used.</div>\n </div>\n \n <div field grid-span>\n <label for='client-id'>client id</label>\n <input type='text' id=\"client-id\" name=\"clientId\" .value=${oauth2Client.clientId || ''}>\n <div input-hint>The client identifier issued to the client during the application registration process.</div>\n </div>\n\n <div field grid-span>\n <label for='client-secret'>client secret</label>\n <input type='text' id=\"client-secret\" name=\"clientSecret\" .value=${oauth2Client.clientSecret || ''}>\n <div input-hint>The client secret issued to the client during the application registration process.</div>\n </div>\n\n ${\n this._grantType == 'owner'\n ? html`\n <div field grid-span>\n <label for=\"username\">user name</label>\n <input type=\"text\" id=\"username\" name=\"username\" .value=${oauth2Client.username || ''} />\n </div>\n\n <div field grid-span>\n <label for=\"password\">password</label>\n <input type=\"password\" id=\"password\" name=\"password\" .value=${oauth2Client.password || ''} />\n </div>\n `\n : html``\n }\n\n ${\n this._grantType == 'jwt'\n ? html`\n <div field grid-span>\n <label for=\"jwt-token\">jwt-token</label>\n <input type=\"text\" id=\"jwt-token\" name=\"jwtToken\" .value=${oauth2Client.jwtToken || ''} />\n <div input-hint>The JWT Bearer Token for JWT As Authorization Grant</div>\n </div>\n `\n : html``\n }\n\n <!-- code PKCE grant type not supported yet\n <div field grid-span>\n <label for='code-challenge-method'>code challenge method</label>\n <select type='text' id=\"code-challenge-method\" name=\"codeChallengeMethod\" .value=${\n oauth2Client.codeChallengeMethod\n }>\n <option></option>\n <option>SHA-256</option>\n <option>Plain</option>\n </select>\n <div input-hint>Algorithm used for generating the code challenge</div>\n </div>\n\n <div field grid-span>\n <label for='code-verifier'>code verifier\n <ox-help-icon topic='/oauth2-client/code-verifier'></ox-help-icon>\n </label>\n <input type='text' id=\"code-verifier\" name=\"codeVerifier\" .value=${oauth2Client.codeVerifier || ''}>\n <div input-hint>A random, 43-128 character string used to connect the authorization request to the token request.\n Uses the following characters: [A-Z]/[a-z]/[0-9]/\"-\"/\".\"/\"_\"/\"~\".</div>\n </div>\n -->\n \n <div field grid-span>\n <label for='scopes'>scopes</label>\n <input type='text' id=\"scopes\" name=\"scopes\" .value=${oauth2Client.scopes || ''}>\n <div input-hint>The scopes of the access request. It may have multiple space-delimited values.</div>\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <div field grid-span>\n <label for='token-type'>token type</label>\n <input type='text' id=\"token-type\" .value=${oauth2Client.tokenType || ''} readonly>\n <div input-hint>Added to the authorization header before the access token.</div>\n </div>\n\n <legend>access token</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"access-token\">access token</label>\n <input id=\"access-token\" type=\"text\" .value=${oauth2Client.accessToken || ''} readonly />\n <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n ${\n oauth2Client.expires\n ? html`<div input-hint>\n expired in ${new Date(Number(oauth2Client.expires))} :\n ${asyncReplace(this.expTimer(oauth2Client.expires))}\n </div>`\n : html``\n }\n </div>\n\n <div field grid-span>\n <label for=\"refresh-token\">refresh token</label>\n <input id=\"refresh-token\" type=\"text\" .value=${oauth2Client.refreshToken || ''} readonly />\n <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n </div>\n </div>\n </fieldset>\n </div>\n\n <button @click=${e => this.deleteOauth2Client(e)}>delete this app</button>\n <button @click=${async e => {\n e.preventDefault()\n await this.updateOauth2Client()\n await this.generateOauth2AccessToken()\n }}>get new access token</button>\n <button @click=${async e => {\n e.preventDefault()\n await this.updateOauth2Client()\n await this.refreshOauth2AccessToken()\n }} ?disabled=${!oauth2Client.refreshToken}>refresh access token</button>\n <input type=\"submit\" value=\"update\" @click=${async e => {\n e.preventDefault()\n await this.updateOauth2Client()\n }}>\n </form>\n `\n }\n\n updated(changes) {\n if (changes.has('oauth2Client')) {\n this._grantType = this.oauth2Client?.grantType\n }\n }\n\n firstUpdated() {\n this.clipboard = new Clipboard(this.copybuttons, {\n target: (trigger => trigger.parentElement.querySelector('input')) as any\n })\n }\n\n async pageUpdated(changes, lifecycle, before) {\n if (this.active) {\n await this.fetchOauth2Client()\n }\n }\n\n async *expTimer(exp) {\n const DAY = 24 * 60 * 60\n const HOUR = 60 * 60\n const MIN = 60\n\n while (this.active) {\n var remain = Math.floor((Number(exp) - Date.now()) / 1000)\n const days = Math.floor(remain / DAY)\n remain -= days * DAY\n const hours = Math.floor(remain / HOUR)\n remain -= hours * HOUR\n const mins = Math.floor(remain / MIN)\n const secs = remain - mins * MIN\n yield `${days} days ${hours} hours ${mins} mins ${secs} seconds remain`\n await sleep(1000)\n }\n }\n\n async fetchOauth2Client() {\n const response = await client.query({\n query: gql`\n query($id: String!) {\n oauth2Client(id: $id) {\n ${OAUTH2CLIENT}\n }\n }\n `,\n variables: {\n id: this.lifecycle.resourceId\n }\n })\n\n this.oauth2Client = response.data.oauth2Client\n }\n\n async updateOauth2Client() {\n const formData = new FormData(this.form)\n\n const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => {\n patch[key] = value\n return patch\n }, {})\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation($id: String!, $patch: Oauth2ClientPatch!) {\n updateOauth2Client(id: $id, patch: $patch) {\n ${OAUTH2CLIENT}\n }\n }\n `,\n variables: {\n id,\n patch\n }\n })\n\n if (response.errors) {\n notify({\n level: 'error',\n message: 'update oauth2 client fail'\n })\n } else {\n this.oauth2Client = response.data.updateOauth2Client\n }\n }\n\n async deleteOauth2Client(e) {\n e.preventDefault()\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteOauth2Client(id: $id)\n }\n `,\n variables: {\n id\n }\n })\n\n if (response.errors) {\n notify({\n level: 'error',\n message: 'delete oauth2 client fail'\n })\n } else {\n navigate('oauth2-clients')\n }\n }\n\n async generateOauth2AccessToken() {\n const id = this.lifecycle.resourceId\n\n if (this.oauth2Client.grantType == 'code') {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n getOauth2AuthUrl(id: $id)\n }\n `,\n variables: {\n id: this.lifecycle.resourceId\n }\n })\n\n if (!response.errors) {\n location.href = response.data.getOauth2AuthUrl\n } else {\n notify({\n level: 'error',\n message: 'getting application access token fail'\n })\n }\n } else {\n const response = await client.mutate({\n mutation: gql`\n mutation($id: String!) {\n getOauth2AccessToken(id: $id) {\n ${OAUTH2CLIENT}\n }\n }\n `,\n variables: {\n id: this.lifecycle.resourceId\n }\n })\n\n if (response.errors) {\n notify({\n level: 'error',\n message: 'getting application access token fail'\n })\n } else {\n this.oauth2Client = response.data.getOauth2AccessToken\n notify({\n level: 'info',\n message: 'got application access token successfully'\n })\n }\n }\n }\n\n async refreshOauth2AccessToken() {\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation($id: String!) {\n refreshOauth2AccessToken(id: $id) {\n ${OAUTH2CLIENT}\n }\n }\n `,\n variables: {\n id: this.lifecycle.resourceId\n }\n })\n\n if (response.errors) {\n notify({\n level: 'error',\n message: 'getting application access token fail'\n })\n } else {\n this.oauth2Client = response.data.refreshOauth2AccessToken\n notify({\n level: 'info',\n message: 'got application access token successfully'\n })\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};