has_secure_passkey 0.2.3 → 0.2.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a34b7c6d4ffc77b13aacd463668ca6c79c21b056121096623afdbdd4807dba8
4
- data.tar.gz: e79dc7f12cdc8ccad5b146f0c66ee309eb14c344b2753c9d14dda0d709ed94f7
3
+ metadata.gz: 78d4e249f4c8a171cf5aa0675aeca1af7e2c7940ae5e2a06acaa852d9ecc6d4a
4
+ data.tar.gz: edfdfcf82e4cf95027ec39ba1e0f1260bb4ec96752ba6b467129d9f7e2d5512f
5
5
  SHA512:
6
- metadata.gz: a1d6994dbacce740e0d60ca49abea80b11502b01cea37db931d97e7359b698aef98316930a1d94b415dca0bae716f4a855d291e108bf027ac219d66fbe61bc0f
7
- data.tar.gz: f1fe81cc4733432980055924d86f8c8c0f601cf0fa6754caeb8febf5374a668de509880e6d814b1c4787261c104176be012abd94751bc8c1add8ad3f1a34727a
6
+ metadata.gz: 85f5b84cfcb632fcbae5ce4b1c23b6826274766983f61e9cea6ea172911677bbf53589a978658ef869e098f1205bf1355cbba1c1f4b3ae89f9ad6fa96d139576
7
+ data.tar.gz: 0e7f79e4a319b9f0d01a77d1960898e11264f40cc5cf1a62ccd0b6477f308565647a4d1fc11a536ae5229127f96c8e427ab03a458d4085d8c2bf17bb2d8add96
@@ -1,5 +1,5 @@
1
- import * as WebAuthnJSON from "../@github--webauthn-json"
2
- import { post } from "../@rails--request"
1
+ import * as WebAuthnJSON from "@github/webauthn-json"
2
+ import { post } from "@rails/request"
3
3
 
4
4
  export default class WebAuthn extends HTMLElement {
5
5
  static observedAttributes = ["action", "callback", "options"];
@@ -10,7 +10,6 @@ export default class WebAuthn extends HTMLElement {
10
10
 
11
11
  connectedCallback() {
12
12
  this.progressBar = Turbo.navigator.delegate.adapter.progressBar
13
- this.style.display = "none"
14
13
  this.setAttribute("data-turbo-temporary", 1)
15
14
  this.setAttribute("data-turbo-track", "reload")
16
15
  this.run()
@@ -12,28 +12,12 @@ var __export = (target, all) => {
12
12
  // app/assets/javascripts/@github--webauthn-json.js
13
13
  var exports__github_webauthn_json = {};
14
14
  __export(exports__github_webauthn_json, {
15
- supported: () => {
16
- {
17
- return supported;
18
- }
19
- },
20
- schema: () => {
21
- {
22
- return c;
23
- }
24
- },
25
- get: () => {
26
- {
27
- return get;
28
- }
29
- },
30
- create: () => {
31
- {
32
- return create;
33
- }
34
- }
15
+ supported: () => supported,
16
+ schema: () => c,
17
+ get: () => get,
18
+ create: () => create
35
19
  });
36
- var base64urlToBuffer = function(e) {
20
+ function base64urlToBuffer(e) {
37
21
  const r = "==".slice(0, (4 - e.length % 4) % 4);
38
22
  const t = e.replace(/-/g, "+").replace(/_/g, "/") + r;
39
23
  const n = atob(t);
@@ -42,8 +26,8 @@ var base64urlToBuffer = function(e) {
42
26
  for (let e2 = 0;e2 < n.length; e2++)
43
27
  o[e2] = n.charCodeAt(e2);
44
28
  return i;
45
- };
46
- var bufferToBase64url = function(e) {
29
+ }
30
+ function bufferToBase64url(e) {
47
31
  const r = new Uint8Array(e);
48
32
  let t = "";
49
33
  for (const e2 of r)
@@ -51,63 +35,40 @@ var bufferToBase64url = function(e) {
51
35
  const n = btoa(t);
52
36
  const i = n.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
53
37
  return i;
54
- };
55
- var convert = function(t, n, i) {
38
+ }
39
+ var e = "copy";
40
+ var r = "convert";
41
+ function convert(t, n, i) {
56
42
  if (n === e)
57
43
  return i;
58
44
  if (n === r)
59
45
  return t(i);
60
46
  if (n instanceof Array)
61
- return i.map((e) => convert(t, n[0], e));
47
+ return i.map((e2) => convert(t, n[0], e2));
62
48
  if (n instanceof Object) {
63
- const e = {};
64
- for (const [r, o] of Object.entries(n)) {
49
+ const e2 = {};
50
+ for (const [r2, o] of Object.entries(n)) {
65
51
  if (o.derive) {
66
- const e2 = o.derive(i);
67
- e2 !== undefined && (i[r] = e2);
52
+ const e3 = o.derive(i);
53
+ e3 !== undefined && (i[r2] = e3);
68
54
  }
69
- if (r in i)
70
- i[r] != null ? e[r] = convert(t, o.schema, i[r]) : e[r] = null;
55
+ if (r2 in i)
56
+ i[r2] != null ? e2[r2] = convert(t, o.schema, i[r2]) : e2[r2] = null;
71
57
  else if (o.required)
72
- throw new Error(`Missing key: ${r}`);
58
+ throw new Error(`Missing key: ${r2}`);
73
59
  }
74
- return e;
60
+ return e2;
75
61
  }
76
- };
77
- var derived = function(e, r) {
78
- return { required: true, schema: e, derive: r };
79
- };
80
- var required = function(e) {
81
- return { required: true, schema: e };
82
- };
83
- var optional = function(e) {
84
- return { required: false, schema: e };
85
- };
86
- var createRequestFromJSON = function(e) {
87
- return convert(base64urlToBuffer, o, e);
88
- };
89
- var createResponseToJSON = function(e) {
90
- return convert(bufferToBase64url, a, e);
91
- };
92
- async function create(e) {
93
- const r = await navigator.credentials.create(createRequestFromJSON(e));
94
- return createResponseToJSON(r);
95
62
  }
96
- var getRequestFromJSON = function(e) {
97
- return convert(base64urlToBuffer, u, e);
98
- };
99
- var getResponseToJSON = function(e) {
100
- return convert(bufferToBase64url, s, e);
101
- };
102
- async function get(e) {
103
- const r = await navigator.credentials.get(getRequestFromJSON(e));
104
- return getResponseToJSON(r);
63
+ function derived(e2, r2) {
64
+ return { required: true, schema: e2, derive: r2 };
65
+ }
66
+ function required(e2) {
67
+ return { required: true, schema: e2 };
68
+ }
69
+ function optional(e2) {
70
+ return { required: false, schema: e2 };
105
71
  }
106
- var supported = function() {
107
- return !!(navigator.credentials && navigator.credentials.create && navigator.credentials.get && window.PublicKeyCredential);
108
- };
109
- var e = "copy";
110
- var r = "convert";
111
72
  var t = { type: required(e), id: required(r), transports: optional(e) };
112
73
  var n = { appid: optional(e), appidExclude: optional(e), credProps: optional(e) };
113
74
  var i = { appid: optional(e), appidExclude: optional(e), credProps: optional(e) };
@@ -119,46 +80,31 @@ var a = { type: required(e), id: required(e), rawId: required(r), authenticatorA
119
80
  var u = { mediation: optional(e), publicKey: required({ challenge: required(r), timeout: optional(e), rpId: optional(e), allowCredentials: optional([t]), userVerification: optional(e), extensions: optional(n) }), signal: optional(e) };
120
81
  var s = { type: required(e), id: required(e), rawId: required(r), authenticatorAttachment: optional(e), response: required({ clientDataJSON: required(r), authenticatorData: required(r), signature: required(r), userHandle: required(r) }), clientExtensionResults: derived(i, (e2) => e2.getClientExtensionResults()) };
121
82
  var c = { credentialCreationOptions: o, publicKeyCredentialWithAttestation: a, credentialRequestOptions: u, publicKeyCredentialWithAssertion: s };
83
+ function createRequestFromJSON(e2) {
84
+ return convert(base64urlToBuffer, o, e2);
85
+ }
86
+ function createResponseToJSON(e2) {
87
+ return convert(bufferToBase64url, a, e2);
88
+ }
89
+ async function create(e2) {
90
+ const r2 = await navigator.credentials.create(createRequestFromJSON(e2));
91
+ return createResponseToJSON(r2);
92
+ }
93
+ function getRequestFromJSON(e2) {
94
+ return convert(base64urlToBuffer, u, e2);
95
+ }
96
+ function getResponseToJSON(e2) {
97
+ return convert(bufferToBase64url, s, e2);
98
+ }
99
+ async function get(e2) {
100
+ const r2 = await navigator.credentials.get(getRequestFromJSON(e2));
101
+ return getResponseToJSON(r2);
102
+ }
103
+ function supported() {
104
+ return !!(navigator.credentials && navigator.credentials.create && navigator.credentials.get && window.PublicKeyCredential);
105
+ }
122
106
 
123
107
  // app/assets/javascripts/@rails--request.js
124
- var getCookie = function(t2) {
125
- const e2 = document.cookie ? document.cookie.split("; ") : [];
126
- const n2 = `${encodeURIComponent(t2)}=`;
127
- const s2 = e2.find((t3) => t3.startsWith(n2));
128
- if (s2) {
129
- const t3 = s2.split("=").slice(1).join("=");
130
- if (t3)
131
- return decodeURIComponent(t3);
132
- }
133
- };
134
- var compact = function(t2) {
135
- const e2 = {};
136
- for (const n2 in t2) {
137
- const s2 = t2[n2];
138
- s2 !== undefined && (e2[n2] = s2);
139
- }
140
- return e2;
141
- };
142
- var metaContent = function(t2) {
143
- const e2 = document.head.querySelector(`meta[name="${t2}"]`);
144
- return e2 && e2.content;
145
- };
146
- var stringEntriesFromFormData = function(t2) {
147
- return [...t2].reduce((t3, [e2, n2]) => t3.concat(typeof n2 === "string" ? [[e2, n2]] : []), []);
148
- };
149
- var mergeEntries = function(t2, e2) {
150
- for (const [n2, s2] of e2)
151
- if (!(s2 instanceof window.File))
152
- if (t2.has(n2) && !n2.includes("[]")) {
153
- t2.delete(n2);
154
- t2.set(n2, s2);
155
- } else
156
- t2.append(n2, s2);
157
- };
158
- async function post(t2, e2) {
159
- const n2 = new FetchRequest("post", t2, e2);
160
- return n2.perform();
161
- }
162
108
  class FetchResponse {
163
109
  constructor(t2) {
164
110
  this.response = t2;
@@ -233,6 +179,40 @@ class RequestInterceptor {
233
179
  this.interceptor = undefined;
234
180
  }
235
181
  }
182
+ function getCookie(t2) {
183
+ const e2 = document.cookie ? document.cookie.split("; ") : [];
184
+ const n2 = `${encodeURIComponent(t2)}=`;
185
+ const s2 = e2.find((t3) => t3.startsWith(n2));
186
+ if (s2) {
187
+ const t3 = s2.split("=").slice(1).join("=");
188
+ if (t3)
189
+ return decodeURIComponent(t3);
190
+ }
191
+ }
192
+ function compact(t2) {
193
+ const e2 = {};
194
+ for (const n2 in t2) {
195
+ const s2 = t2[n2];
196
+ s2 !== undefined && (e2[n2] = s2);
197
+ }
198
+ return e2;
199
+ }
200
+ function metaContent(t2) {
201
+ const e2 = document.head.querySelector(`meta[name="${t2}"]`);
202
+ return e2 && e2.content;
203
+ }
204
+ function stringEntriesFromFormData(t2) {
205
+ return [...t2].reduce((t3, [e2, n2]) => t3.concat(typeof n2 === "string" ? [[e2, n2]] : []), []);
206
+ }
207
+ function mergeEntries(t2, e2) {
208
+ for (const [n2, s2] of e2)
209
+ if (!(s2 instanceof window.File))
210
+ if (t2.has(n2) && !n2.includes("[]")) {
211
+ t2.delete(n2);
212
+ t2.set(n2, s2);
213
+ } else
214
+ t2.append(n2, s2);
215
+ }
236
216
 
237
217
  class FetchRequest {
238
218
  constructor(t2, e2, n2 = {}) {
@@ -334,6 +314,10 @@ class FetchRequest {
334
314
  return e2 && !t2 ? JSON.stringify(this.body) : this.body;
335
315
  }
336
316
  }
317
+ async function post(t2, e2) {
318
+ const n2 = new FetchRequest("post", t2, e2);
319
+ return n2.perform();
320
+ }
337
321
 
338
322
  // app/assets/javascripts/components/web_authn.js
339
323
  class WebAuthn extends HTMLElement {
@@ -343,7 +327,6 @@ class WebAuthn extends HTMLElement {
343
327
  }
344
328
  connectedCallback() {
345
329
  this.progressBar = Turbo.navigator.delegate.adapter.progressBar;
346
- this.style.display = "none";
347
330
  this.setAttribute("data-turbo-temporary", 1);
348
331
  this.setAttribute("data-turbo-track", "reload");
349
332
  this.run();
@@ -1,3 +1,3 @@
1
1
  module HasSecurePasskey
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_secure_passkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Pezza
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-11-04 00:00:00.000000000 Z
10
+ date: 2024-11-07 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -46,8 +46,6 @@ files:
46
46
  - MIT-LICENSE
47
47
  - README.md
48
48
  - Rakefile
49
- - app/assets/javascripts/@github--webauthn-json.js
50
- - app/assets/javascripts/@rails--request.js
51
49
  - app/assets/javascripts/components/has_secure_passkey.js
52
50
  - app/assets/javascripts/components/web_authn.js
53
51
  - app/assets/javascripts/has_secure_passkey.js
@@ -1 +0,0 @@
1
- function base64urlToBuffer(e){const r="==".slice(0,(4-e.length%4)%4);const t=e.replace(/-/g,"+").replace(/_/g,"/")+r;const n=atob(t);const i=new ArrayBuffer(n.length);const o=new Uint8Array(i);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return i}function bufferToBase64url(e){const r=new Uint8Array(e);let t="";for(const e of r)t+=String.fromCharCode(e);const n=btoa(t);const i=n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");return i}var e="copy";var r="convert";function convert(t,n,i){if(n===e)return i;if(n===r)return t(i);if(n instanceof Array)return i.map((e=>convert(t,n[0],e)));if(n instanceof Object){const e={};for(const[r,o]of Object.entries(n)){if(o.derive){const e=o.derive(i);void 0!==e&&(i[r]=e)}if(r in i)null!=i[r]?e[r]=convert(t,o.schema,i[r]):e[r]=null;else if(o.required)throw new Error(`Missing key: ${r}`)}return e}}function derived(e,r){return{required:true,schema:e,derive:r}}function required(e){return{required:true,schema:e}}function optional(e){return{required:false,schema:e}}var t={type:required(e),id:required(r),transports:optional(e)};var n={appid:optional(e),appidExclude:optional(e),credProps:optional(e)};var i={appid:optional(e),appidExclude:optional(e),credProps:optional(e)};var o={publicKey:required({rp:required(e),user:required({id:required(r),name:required(e),displayName:required(e)}),challenge:required(r),pubKeyCredParams:required(e),timeout:optional(e),excludeCredentials:optional([t]),authenticatorSelection:optional(e),attestation:optional(e),extensions:optional(n)}),signal:optional(e)};var a={type:required(e),id:required(e),rawId:required(r),authenticatorAttachment:optional(e),response:required({clientDataJSON:required(r),attestationObject:required(r),transports:derived(e,(e=>{var r;return(null==(r=e.getTransports)?void 0:r.call(e))||[]}))}),clientExtensionResults:derived(i,(e=>e.getClientExtensionResults()))};var u={mediation:optional(e),publicKey:required({challenge:required(r),timeout:optional(e),rpId:optional(e),allowCredentials:optional([t]),userVerification:optional(e),extensions:optional(n)}),signal:optional(e)};var s={type:required(e),id:required(e),rawId:required(r),authenticatorAttachment:optional(e),response:required({clientDataJSON:required(r),authenticatorData:required(r),signature:required(r),userHandle:required(r)}),clientExtensionResults:derived(i,(e=>e.getClientExtensionResults()))};var c={credentialCreationOptions:o,publicKeyCredentialWithAttestation:a,credentialRequestOptions:u,publicKeyCredentialWithAssertion:s};function createRequestFromJSON(e){return convert(base64urlToBuffer,o,e)}function createResponseToJSON(e){return convert(bufferToBase64url,a,e)}async function create(e){const r=await navigator.credentials.create(createRequestFromJSON(e));return createResponseToJSON(r)}function getRequestFromJSON(e){return convert(base64urlToBuffer,u,e)}function getResponseToJSON(e){return convert(bufferToBase64url,s,e)}async function get(e){const r=await navigator.credentials.get(getRequestFromJSON(e));return getResponseToJSON(r)}function supported(){return!!(navigator.credentials&&navigator.credentials.create&&navigator.credentials.get&&window.PublicKeyCredential)}export{create,get,c as schema,supported};
@@ -1,2 +0,0 @@
1
- class FetchResponse{constructor(t){this.response=t}get statusCode(){return this.response.status}get redirected(){return this.response.redirected}get ok(){return this.response.ok}get unauthenticated(){return this.statusCode===401}get unprocessableEntity(){return this.statusCode===422}get authenticationURL(){return this.response.headers.get("WWW-Authenticate")}get contentType(){const t=this.response.headers.get("Content-Type")||"";return t.replace(/;.*$/,"")}get headers(){return this.response.headers}get html(){return this.contentType.match(/^(application|text)\/(html|xhtml\+xml)$/)?this.text:Promise.reject(new Error(`Expected an HTML response but got "${this.contentType}" instead`))}get json(){return this.contentType.match(/^application\/.*json$/)?this.responseJson||(this.responseJson=this.response.json()):Promise.reject(new Error(`Expected a JSON response but got "${this.contentType}" instead`))}get text(){return this.responseText||(this.responseText=this.response.text())}get isTurboStream(){return this.contentType.match(/^text\/vnd\.turbo-stream\.html/)}get isScript(){return this.contentType.match(/\b(?:java|ecma)script\b/)}async renderTurboStream(){if(!this.isTurboStream)return Promise.reject(new Error(`Expected a Turbo Stream response but got "${this.contentType}" instead`));window.Turbo?await window.Turbo.renderStreamMessage(await this.text):console.warn("You must set `window.Turbo = Turbo` to automatically process Turbo Stream events with request.js")}async activeScript(){if(!this.isScript)return Promise.reject(new Error(`Expected a Script response but got "${this.contentType}" instead`));{const t=document.createElement("script");const e=document.querySelector("meta[name=csp-nonce]");const n=e&&e.content;n&&t.setAttribute("nonce",n);t.innerHTML=await this.text;document.body.appendChild(t)}}}class RequestInterceptor{static register(t){this.interceptor=t}static get(){return this.interceptor}static reset(){this.interceptor=void 0}}function getCookie(t){const e=document.cookie?document.cookie.split("; "):[];const n=`${encodeURIComponent(t)}=`;const s=e.find((t=>t.startsWith(n)));if(s){const t=s.split("=").slice(1).join("=");if(t)return decodeURIComponent(t)}}function compact(t){const e={};for(const n in t){const s=t[n];s!==void 0&&(e[n]=s)}return e}function metaContent(t){const e=document.head.querySelector(`meta[name="${t}"]`);return e&&e.content}function stringEntriesFromFormData(t){return[...t].reduce(((t,[e,n])=>t.concat(typeof n==="string"?[[e,n]]:[])),[])}function mergeEntries(t,e){for(const[n,s]of e)if(!(s instanceof window.File))if(t.has(n)&&!n.includes("[]")){t.delete(n);t.set(n,s)}else t.append(n,s)}class FetchRequest{constructor(t,e,n={}){this.method=t;this.options=n;this.originalUrl=e.toString()}async perform(){try{const t=RequestInterceptor.get();t&&await t(this)}catch(t){console.error(t)}const t=this.responseKind==="turbo-stream"&&window.Turbo?window.Turbo.fetch:window.fetch;const e=new FetchResponse(await t(this.url,this.fetchOptions));if(e.unauthenticated&&e.authenticationURL)return Promise.reject(window.location.href=e.authenticationURL);e.isScript&&await e.activeScript();const n=e.ok||e.unprocessableEntity;n&&e.isTurboStream&&await e.renderTurboStream();return e}addHeader(t,e){const n=this.additionalHeaders;n[t]=e;this.options.headers=n}sameHostname(){if(!this.originalUrl.startsWith("http:"))return true;try{return new URL(this.originalUrl).hostname===window.location.hostname}catch(t){return true}}get fetchOptions(){return{method:this.method.toUpperCase(),headers:this.headers,body:this.formattedBody,signal:this.signal,credentials:this.credentials,redirect:this.redirect}}get headers(){const t={"X-Requested-With":"XMLHttpRequest","Content-Type":this.contentType,Accept:this.accept};this.sameHostname()&&(t["X-CSRF-Token"]=this.csrfToken);return compact(Object.assign(t,this.additionalHeaders))}get csrfToken(){return getCookie(metaContent("csrf-param"))||metaContent("csrf-token")}get contentType(){return this.options.contentType?this.options.contentType:this.body==null||this.body instanceof window.FormData?void 0:this.body instanceof window.File?this.body.type:"application/json"}get accept(){switch(this.responseKind){case"html":return"text/html, application/xhtml+xml";case"turbo-stream":return"text/vnd.turbo-stream.html, text/html, application/xhtml+xml";case"json":return"application/json, application/vnd.api+json";case"script":return"text/javascript, application/javascript";default:return"*/*"}}get body(){return this.options.body}get query(){const t=(this.originalUrl.split("?")[1]||"").split("#")[0];const e=new URLSearchParams(t);let n=this.options.query;n=n instanceof window.FormData?stringEntriesFromFormData(n):n instanceof window.URLSearchParams?n.entries():Object.entries(n||{});mergeEntries(e,n);const s=e.toString();return s.length>0?`?${s}`:""}get url(){return this.originalUrl.split("?")[0].split("#")[0]+this.query}get responseKind(){return this.options.responseKind||"html"}get signal(){return this.options.signal}get redirect(){return this.options.redirect||"follow"}get credentials(){return this.options.credentials||"same-origin"}get additionalHeaders(){return this.options.headers||{}}get formattedBody(){const t=Object.prototype.toString.call(this.body)==="[object String]";const e=this.headers["Content-Type"]==="application/json";return e&&!t?JSON.stringify(this.body):this.body}}async function get(t,e){const n=new FetchRequest("get",t,e);return n.perform()}async function post(t,e){const n=new FetchRequest("post",t,e);return n.perform()}async function put(t,e){const n=new FetchRequest("put",t,e);return n.perform()}async function patch(t,e){const n=new FetchRequest("patch",t,e);return n.perform()}async function destroy(t,e){const n=new FetchRequest("delete",t,e);return n.perform()}export{FetchRequest,FetchResponse,RequestInterceptor,destroy,get,patch,post,put};
2
- //# sourceMappingURL=index.js.map