@thirdweb-dev/service-utils 0.0.0-dev-81d8779-20230714182546 → 0.0.0-dev-5a2d8b2-20230714182930

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('../../dist/index-f45a96ee.cjs.dev.js');
5
+ var index = require('../../dist/index-c32e136a.cjs.dev.js');
6
6
  var services = require('../../dist/services-a3f36057.cjs.dev.js');
7
7
 
8
8
  const DEFAULT_CACHE_TTL_SECONDS = 60;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('../../dist/index-8a3bbee6.cjs.prod.js');
5
+ var index = require('../../dist/index-175beb0e.cjs.prod.js');
6
6
  var services = require('../../dist/services-9e185105.cjs.prod.js');
7
7
 
8
8
  const DEFAULT_CACHE_TTL_SECONDS = 60;
@@ -1,4 +1,4 @@
1
- import { a as authorize } from '../../dist/index-bdbd7887.esm.js';
1
+ import { a as authorize } from '../../dist/index-5476722b.esm.js';
2
2
  export { b as SERVICES, S as SERVICE_DEFINITIONS, a as SERVICE_NAMES, g as getServiceByName } from '../../dist/services-86283509.esm.js';
3
3
 
4
4
  const DEFAULT_CACHE_TTL_SECONDS = 60;
@@ -6,7 +6,7 @@ export type AuthorizationInput = {
6
6
  origin: string | null;
7
7
  bundleId: string | null;
8
8
  secretKeyHash: string | null;
9
- targetAddress?: string;
9
+ targetAddress?: string | string[];
10
10
  };
11
11
  type CacheOptions = {
12
12
  get: (clientId: string) => Promise<string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"../../../../../src/core/authorize","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EAElB,kBAAe;AAGhB,OAAO,EAAE,mBAAmB,EAAE,mBAAgB;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClD,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtE,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AASF,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EAAE,iBAAiB,EAChC,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAoH9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"../../../../../src/core/authorize","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EAElB,kBAAe;AAGhB,OAAO,EAAE,mBAAmB,EAAE,mBAAgB;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClD,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtE,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AASF,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EAAE,iBAAiB,EAChC,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAoH9B"}
@@ -1,5 +1,5 @@
1
1
  export type CoreAuthInput = {
2
2
  clientId?: string;
3
- targetAddress?: string;
3
+ targetAddress?: string | string[];
4
4
  };
5
5
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"../../../../src/core","sources":["types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAE1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"../../../../src/core","sources":["types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAE1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC,CAAC"}
@@ -9,7 +9,7 @@ async function fetchKeyMetadataFromApi(clientId, config) {
9
9
  const url = new URL(`${apiUrl}/v1/keys/use`);
10
10
  url.searchParams.set("clientId", clientId);
11
11
  url.searchParams.set("scope", serviceScope);
12
- const response = await fetch(url.href, {
12
+ const response = await fetch(url.toString(), {
13
13
  method: "GET",
14
14
  headers: {
15
15
  "x-service-api-key": serviceApiKey,
@@ -25,10 +25,12 @@ async function fetchKeyMetadataFromApi(clientId, config) {
25
25
  function authorizeClient(authOptions, apiKeyMeta) {
26
26
  const {
27
27
  origin,
28
+ bundleId,
28
29
  secretKeyHash: providedSecretHash
29
30
  } = authOptions;
30
31
  const {
31
32
  domains,
33
+ bundleIds,
32
34
  secretHash
33
35
  } = apiKeyMeta;
34
36
  if (providedSecretHash) {
@@ -78,7 +80,28 @@ function authorizeClient(authOptions, apiKeyMeta) {
78
80
  };
79
81
  }
80
82
 
81
- // FIXME: validate bundle id
83
+ // validate bundleId
84
+ if (bundleId) {
85
+ if (
86
+ // find matching bundle id, or if all bundles allowed
87
+ bundleIds.find(b => {
88
+ if (b === "*") {
89
+ return true;
90
+ }
91
+ return b === bundleId;
92
+ })) {
93
+ return {
94
+ authorized: true,
95
+ apiKeyMeta
96
+ };
97
+ }
98
+ return {
99
+ authorized: false,
100
+ errorMessage: "The bundle is not authorized for this key.",
101
+ errorCode: "BUNDLE_UNAUTHORIZED",
102
+ status: 401
103
+ };
104
+ }
82
105
  return {
83
106
  authorized: false,
84
107
  errorMessage: "The keys are invalid.",
@@ -87,12 +110,10 @@ function authorizeClient(authOptions, apiKeyMeta) {
87
110
  };
88
111
  }
89
112
 
90
- function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
113
+ function authorizeService(apiKeyMetadata, serviceConfig, authorizationPayload) {
91
114
  const {
92
115
  services
93
- } = apikeyMetadata;
94
- // const { serviceTargetAddresses, serviceAction } = validations;
95
-
116
+ } = apiKeyMetadata;
96
117
  // validate services
97
118
  const service = services.find(srv => srv.name === serviceConfig.serviceScope);
98
119
  if (!service) {
@@ -120,11 +141,12 @@ function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
120
141
  // validate service target addresses
121
142
  // the service has to pass in the target address for this to be validated
122
143
  if (authorizationPayload?.targetAddress) {
123
- const isTargetAddressAllowed = service.targetAddresses.includes(authorizationPayload.targetAddress);
124
- if (!isTargetAddressAllowed) {
144
+ const checkedAddresses = Array.isArray(authorizationPayload.targetAddress) ? authorizationPayload.targetAddress : [authorizationPayload.targetAddress];
145
+ const allAllowed = service.targetAddresses.includes("*");
146
+ if (!allAllowed && checkedAddresses.some(ta => !service.targetAddresses.includes(ta))) {
125
147
  return {
126
148
  authorized: false,
127
- errorMessage: `The service "${serviceConfig.serviceScope}" target address "${authorizationPayload.targetAddress}" is not authorized for this key.`,
149
+ errorMessage: `The service "${serviceConfig.serviceScope}" target address is not authorized for this key.`,
128
150
  errorCode: "SERVICE_TARGET_ADDRESS_UNAUTHORIZED",
129
151
  status: 403
130
152
  };
@@ -132,7 +154,7 @@ function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
132
154
  }
133
155
  return {
134
156
  authorized: true,
135
- apiKeyMeta: apikeyMetadata
157
+ apiKeyMeta: apiKeyMetadata
136
158
  };
137
159
  }
138
160
 
@@ -7,7 +7,7 @@ async function fetchKeyMetadataFromApi(clientId, config) {
7
7
  const url = new URL(`${apiUrl}/v1/keys/use`);
8
8
  url.searchParams.set("clientId", clientId);
9
9
  url.searchParams.set("scope", serviceScope);
10
- const response = await fetch(url.href, {
10
+ const response = await fetch(url.toString(), {
11
11
  method: "GET",
12
12
  headers: {
13
13
  "x-service-api-key": serviceApiKey,
@@ -23,10 +23,12 @@ async function fetchKeyMetadataFromApi(clientId, config) {
23
23
  function authorizeClient(authOptions, apiKeyMeta) {
24
24
  const {
25
25
  origin,
26
+ bundleId,
26
27
  secretKeyHash: providedSecretHash
27
28
  } = authOptions;
28
29
  const {
29
30
  domains,
31
+ bundleIds,
30
32
  secretHash
31
33
  } = apiKeyMeta;
32
34
  if (providedSecretHash) {
@@ -76,7 +78,28 @@ function authorizeClient(authOptions, apiKeyMeta) {
76
78
  };
77
79
  }
78
80
 
79
- // FIXME: validate bundle id
81
+ // validate bundleId
82
+ if (bundleId) {
83
+ if (
84
+ // find matching bundle id, or if all bundles allowed
85
+ bundleIds.find(b => {
86
+ if (b === "*") {
87
+ return true;
88
+ }
89
+ return b === bundleId;
90
+ })) {
91
+ return {
92
+ authorized: true,
93
+ apiKeyMeta
94
+ };
95
+ }
96
+ return {
97
+ authorized: false,
98
+ errorMessage: "The bundle is not authorized for this key.",
99
+ errorCode: "BUNDLE_UNAUTHORIZED",
100
+ status: 401
101
+ };
102
+ }
80
103
  return {
81
104
  authorized: false,
82
105
  errorMessage: "The keys are invalid.",
@@ -85,12 +108,10 @@ function authorizeClient(authOptions, apiKeyMeta) {
85
108
  };
86
109
  }
87
110
 
88
- function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
111
+ function authorizeService(apiKeyMetadata, serviceConfig, authorizationPayload) {
89
112
  const {
90
113
  services
91
- } = apikeyMetadata;
92
- // const { serviceTargetAddresses, serviceAction } = validations;
93
-
114
+ } = apiKeyMetadata;
94
115
  // validate services
95
116
  const service = services.find(srv => srv.name === serviceConfig.serviceScope);
96
117
  if (!service) {
@@ -118,11 +139,12 @@ function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
118
139
  // validate service target addresses
119
140
  // the service has to pass in the target address for this to be validated
120
141
  if (authorizationPayload?.targetAddress) {
121
- const isTargetAddressAllowed = service.targetAddresses.includes(authorizationPayload.targetAddress);
122
- if (!isTargetAddressAllowed) {
142
+ const checkedAddresses = Array.isArray(authorizationPayload.targetAddress) ? authorizationPayload.targetAddress : [authorizationPayload.targetAddress];
143
+ const allAllowed = service.targetAddresses.includes("*");
144
+ if (!allAllowed && checkedAddresses.some(ta => !service.targetAddresses.includes(ta))) {
123
145
  return {
124
146
  authorized: false,
125
- errorMessage: `The service "${serviceConfig.serviceScope}" target address "${authorizationPayload.targetAddress}" is not authorized for this key.`,
147
+ errorMessage: `The service "${serviceConfig.serviceScope}" target address is not authorized for this key.`,
126
148
  errorCode: "SERVICE_TARGET_ADDRESS_UNAUTHORIZED",
127
149
  status: 403
128
150
  };
@@ -130,7 +152,7 @@ function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
130
152
  }
131
153
  return {
132
154
  authorized: true,
133
- apiKeyMeta: apikeyMetadata
155
+ apiKeyMeta: apiKeyMetadata
134
156
  };
135
157
  }
136
158
 
@@ -9,7 +9,7 @@ async function fetchKeyMetadataFromApi(clientId, config) {
9
9
  const url = new URL(`${apiUrl}/v1/keys/use`);
10
10
  url.searchParams.set("clientId", clientId);
11
11
  url.searchParams.set("scope", serviceScope);
12
- const response = await fetch(url.href, {
12
+ const response = await fetch(url.toString(), {
13
13
  method: "GET",
14
14
  headers: {
15
15
  "x-service-api-key": serviceApiKey,
@@ -25,10 +25,12 @@ async function fetchKeyMetadataFromApi(clientId, config) {
25
25
  function authorizeClient(authOptions, apiKeyMeta) {
26
26
  const {
27
27
  origin,
28
+ bundleId,
28
29
  secretKeyHash: providedSecretHash
29
30
  } = authOptions;
30
31
  const {
31
32
  domains,
33
+ bundleIds,
32
34
  secretHash
33
35
  } = apiKeyMeta;
34
36
  if (providedSecretHash) {
@@ -78,7 +80,28 @@ function authorizeClient(authOptions, apiKeyMeta) {
78
80
  };
79
81
  }
80
82
 
81
- // FIXME: validate bundle id
83
+ // validate bundleId
84
+ if (bundleId) {
85
+ if (
86
+ // find matching bundle id, or if all bundles allowed
87
+ bundleIds.find(b => {
88
+ if (b === "*") {
89
+ return true;
90
+ }
91
+ return b === bundleId;
92
+ })) {
93
+ return {
94
+ authorized: true,
95
+ apiKeyMeta
96
+ };
97
+ }
98
+ return {
99
+ authorized: false,
100
+ errorMessage: "The bundle is not authorized for this key.",
101
+ errorCode: "BUNDLE_UNAUTHORIZED",
102
+ status: 401
103
+ };
104
+ }
82
105
  return {
83
106
  authorized: false,
84
107
  errorMessage: "The keys are invalid.",
@@ -87,12 +110,10 @@ function authorizeClient(authOptions, apiKeyMeta) {
87
110
  };
88
111
  }
89
112
 
90
- function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
113
+ function authorizeService(apiKeyMetadata, serviceConfig, authorizationPayload) {
91
114
  const {
92
115
  services
93
- } = apikeyMetadata;
94
- // const { serviceTargetAddresses, serviceAction } = validations;
95
-
116
+ } = apiKeyMetadata;
96
117
  // validate services
97
118
  const service = services.find(srv => srv.name === serviceConfig.serviceScope);
98
119
  if (!service) {
@@ -120,11 +141,12 @@ function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
120
141
  // validate service target addresses
121
142
  // the service has to pass in the target address for this to be validated
122
143
  if (authorizationPayload?.targetAddress) {
123
- const isTargetAddressAllowed = service.targetAddresses.includes(authorizationPayload.targetAddress);
124
- if (!isTargetAddressAllowed) {
144
+ const checkedAddresses = Array.isArray(authorizationPayload.targetAddress) ? authorizationPayload.targetAddress : [authorizationPayload.targetAddress];
145
+ const allAllowed = service.targetAddresses.includes("*");
146
+ if (!allAllowed && checkedAddresses.some(ta => !service.targetAddresses.includes(ta))) {
125
147
  return {
126
148
  authorized: false,
127
- errorMessage: `The service "${serviceConfig.serviceScope}" target address "${authorizationPayload.targetAddress}" is not authorized for this key.`,
149
+ errorMessage: `The service "${serviceConfig.serviceScope}" target address is not authorized for this key.`,
128
150
  errorCode: "SERVICE_TARGET_ADDRESS_UNAUTHORIZED",
129
151
  status: 403
130
152
  };
@@ -132,7 +154,7 @@ function authorizeService(apikeyMetadata, serviceConfig, authorizationPayload) {
132
154
  }
133
155
  return {
134
156
  authorized: true,
135
- apiKeyMeta: apikeyMetadata
157
+ apiKeyMeta: apiKeyMetadata
136
158
  };
137
159
  }
138
160
 
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var node_crypto = require('node:crypto');
6
- var index = require('../../dist/index-f45a96ee.cjs.dev.js');
6
+ var index = require('../../dist/index-c32e136a.cjs.dev.js');
7
7
  var services = require('../../dist/services-a3f36057.cjs.dev.js');
8
8
 
9
9
  async function authorizeNode(authInput, serviceConfig) {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var node_crypto = require('node:crypto');
6
- var index = require('../../dist/index-8a3bbee6.cjs.prod.js');
6
+ var index = require('../../dist/index-175beb0e.cjs.prod.js');
7
7
  var services = require('../../dist/services-9e185105.cjs.prod.js');
8
8
 
9
9
  async function authorizeNode(authInput, serviceConfig) {
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'node:crypto';
2
- import { a as authorize } from '../../dist/index-bdbd7887.esm.js';
2
+ import { a as authorize } from '../../dist/index-5476722b.esm.js';
3
3
  export { b as SERVICES, S as SERVICE_DEFINITIONS, a as SERVICE_NAMES, g as getServiceByName } from '../../dist/services-86283509.esm.js';
4
4
 
5
5
  async function authorizeNode(authInput, serviceConfig) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thirdweb-dev/service-utils",
3
- "version": "0.0.0-dev-81d8779-20230714182546",
3
+ "version": "0.0.0-dev-5a2d8b2-20230714182930",
4
4
  "main": "dist/thirdweb-dev-service-utils.cjs.js",
5
5
  "module": "dist/thirdweb-dev-service-utils.esm.js",
6
6
  "exports": {