paskia 0.10.0__py3-none-any.whl → 0.10.2__py3-none-any.whl
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.
- paskia/_version.py +2 -2
- paskia/bootstrap.py +8 -7
- paskia/db/__init__.py +2 -0
- paskia/db/background.py +5 -8
- paskia/db/operations.py +17 -0
- paskia/db/structs.py +3 -2
- paskia/fastapi/__main__.py +21 -13
- paskia/fastapi/authz.py +8 -1
- paskia/fastapi/mainapp.py +6 -4
- paskia/fastapi/user.py +22 -0
- paskia/frontend-build/auth/admin/index.html +7 -6
- paskia/frontend-build/auth/assets/AccessDenied-CVQZxSIL.css +1 -0
- paskia/frontend-build/auth/assets/AccessDenied-Licr0tqA.js +8 -0
- paskia/frontend-build/auth/assets/{RestrictedAuth-BOdNrlQB.css → RestrictedAuth-0MFeNWS2.css} +1 -1
- paskia/frontend-build/auth/assets/{RestrictedAuth-BSusdAfp.js → RestrictedAuth-DWKMTEV3.js} +1 -1
- paskia/frontend-build/auth/assets/_plugin-vue_export-helper-DJsHCwvl.js +33 -0
- paskia/frontend-build/auth/assets/_plugin-vue_export-helper-DUBf8-iM.css +1 -0
- paskia/frontend-build/auth/assets/{admin-CmNtuH3s.css → admin-B1H4YqM_.css} +1 -1
- paskia/frontend-build/auth/assets/admin-CZKsX1OI.js +1 -0
- paskia/frontend-build/auth/assets/{auth-BKq4T2K2.css → auth-B4EpDxom.css} +1 -1
- paskia/frontend-build/auth/assets/auth-Pe-PKe8b.js +1 -0
- paskia/frontend-build/auth/assets/forward-BC0p23CH.js +1 -0
- paskia/frontend-build/auth/assets/{pow-2N9bxgAo.js → pow-DUr-T9XX.js} +1 -1
- paskia/frontend-build/auth/assets/reset-CkY9h28U.js +1 -0
- paskia/frontend-build/auth/assets/restricted-C9cJlHkd.js +1 -0
- paskia/frontend-build/auth/assets/theme-C2WysaSw.js +1 -0
- paskia/frontend-build/auth/index.html +8 -7
- paskia/frontend-build/auth/restricted/index.html +7 -6
- paskia/frontend-build/int/forward/index.html +6 -6
- paskia/frontend-build/int/reset/index.html +3 -3
- paskia/frontend-build/paskia.webp +0 -0
- paskia/util/__init__.py +0 -0
- paskia/util/apistructs.py +110 -0
- paskia/util/frontend.py +75 -0
- paskia/util/hostutil.py +75 -0
- paskia/util/htmlutil.py +47 -0
- paskia/util/passphrase.py +20 -0
- paskia/util/permutil.py +43 -0
- paskia/util/pow.py +45 -0
- paskia/util/querysafe.py +11 -0
- paskia/util/sessionutil.py +38 -0
- paskia/util/startupbox.py +103 -0
- paskia/util/timeutil.py +47 -0
- paskia/util/useragent.py +10 -0
- paskia/util/userinfo.py +63 -0
- paskia/util/vitedev.py +71 -0
- paskia/util/wordlist.py +54 -0
- {paskia-0.10.0.dist-info → paskia-0.10.2.dist-info}/METADATA +14 -11
- paskia-0.10.2.dist-info/RECORD +78 -0
- paskia/frontend-build/auth/assets/AccessDenied-C29NZI95.css +0 -1
- paskia/frontend-build/auth/assets/AccessDenied-DAdzg_MJ.js +0 -12
- paskia/frontend-build/auth/assets/_plugin-vue_export-helper-D2l53SUz.js +0 -49
- paskia/frontend-build/auth/assets/_plugin-vue_export-helper-DYJ24FZK.css +0 -1
- paskia/frontend-build/auth/assets/admin-BeFvGyD6.js +0 -1
- paskia/frontend-build/auth/assets/auth-DvHf8hgy.js +0 -1
- paskia/frontend-build/auth/assets/forward-C86Jm_Uq.js +0 -1
- paskia/frontend-build/auth/assets/reset-D71FG0VL.js +0 -1
- paskia/frontend-build/auth/assets/restricted-CW0drE_k.js +0 -1
- paskia-0.10.0.dist-info/RECORD +0 -60
- {paskia-0.10.0.dist-info → paskia-0.10.2.dist-info}/WHEEL +0 -0
- {paskia-0.10.0.dist-info → paskia-0.10.2.dist-info}/entry_points.txt +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as De,r as d,w as Ge,c as W,o as _e,n as ye,a as ke,b as _,d as f,e as a,f as D,g as Ae,h as it,F as de,i as ut,j as Pe,t as P,k as K,v as ct,l as Je,m as dt,s as ft,p as vt,q as ht,u as pt,x as ae,y as G,z as b,A as Fe,B as fe,C as Me,D as be,E as Ee,G as gt,H as Qe,N as mt,O as we,I as yt,J as wt,K as bt}from"./_plugin-vue_export-helper-D2l53SUz.js";import{u as xe,B as _t,U as Xe,_ as kt,a as It,N as xt,M as St,R as Ct,L as $t,b as Lt,A as Wt,c as At}from"./AccessDenied-DAdzg_MJ.js";import{i as je,a as ee,g as Oe,b as qe,c as Ye,s as Ze}from"./pow-2N9bxgAo.js";import{g as Ie}from"./helpers-DzjFIx78.js";const Be={};async function Pt(U="login"){if(Be[U])return Be[U];const o=await fetch("/auth/api/forward");if(o.status===401||o.status===403){const L=await o.json();if(L.auth?.iframe){let k=L.auth.iframe;return U!==L.auth.mode&&(k=k.replace(/mode=[^&]*/,`mode=${U}`)),Be[U]=k,k}}throw new Error("Unable to fetch auth iframe URL")}const Mt={class:"pairing-entry"},Et={key:0,class:"input-row"},Bt={class:"slot-word"},Dt={class:"typed-prefix"},Nt={class:"hint-suffix"},Ut={key:0,class:"cursor-overlay",style:{"--cursor-pos":0,"--word-len":0}},Tt=["placeholder"],Vt={key:0,class:"processing-status"},Ht={class:"processing-icon"},Rt={key:1,class:"device-info"},Kt={class:"device-permit-text"},zt={class:"device-meta"},Ft={key:0,class:"error-message",style:{"margin-top":"0.5rem"}},jt={class:"button-row",style:{"margin-top":"0.75rem",display:"flex",gap:"0.5rem"}},Ot=["disabled"],qt=["disabled"],Yt={__name:"RemoteAuthPermit",props:{title:{type:String,default:"Help Another Device Sign In"},description:{type:String,default:"Enter the code shown on the device that needs to sign in."},placeholder:{type:String,default:"Enter three words"},action:{type:String,default:"login"}},emits:["completed","error","cancelled","back","register","deviceInfoVisible"],setup(U,{expose:o,emit:L}){const k=L,I=d(!1),S=d(null),T=d(null);let c=null,V=null;try{V=xe()}catch{}const E=d(null),z=d(null),u=d(""),p=d(!1),m=d(""),v=d(null),h=d("");Ge(v,e=>{k("deviceInfoVisible",!!e)});const y=d(!1),A=d(!1),C=d(0),J=d(0),Q=d(0),re=d(!1),ve=d(!1);let te=0,se=!1,Y=null,ne=null,F=null,j=null,N=null,Z=null;function oe(e,s="info",t=3e3){V&&V.showMessage(e,s,t)}async function le(){try{const e=await dt();T.value=e}catch(e){console.warn("Unable to load settings",e)}}function ie(e,s){if(!e||s<0)return{word:"",start:0,end:0};let t=s,i=s;for(;t>0&&/[a-zA-Z]/.test(e[t-1]);)t--;for(;i<e.length&&/[a-zA-Z]/.test(e[i]);)i++;return{word:e.slice(t,i),start:t,end:i}}function X(e){return e.trim().split(/[.\s]+/).filter(s=>s.length>0)}function B(e){const s=X(e),t=[];for(const i of s){let l=i.toLowerCase();for(;l.length>0&&t.length<3;){let $=null;for(let w=Math.min(l.length,6);w>=3;w--){const x=l.slice(0,w);if(ee(x)){$=x;break}}if($)t.push($),l=l.slice($.length);else{t.push(l);break}}if(t.length>=3)break}return t}function he(e){const s=/[.\s]$/.test(e),t=B(e);return s?t.length:Math.max(0,t.length-1)}function pe(e){if(!e)return{valid:!0,segments:[]};const s=[],t=/[.\s]$/.test(e);let i,l=/([a-zA-Z]+)|([.\s]+)/g;for(;(i=l.exec(e))!==null;)i[1]?s.push({text:i[1],isWord:!0,start:i.index}):i[2]&&s.push({text:i[2],isWord:!1,start:i.index});const $=s.filter(x=>x.isWord);let w=!0;return $.forEach((x,H)=>{const M=H===$.length-1,q=x.text.toLowerCase();M&&!t?x.invalid=!je(q):x.invalid=!ee(q),x.invalid&&(w=!1)}),{valid:w,segments:s}}W(()=>{const{segments:e}=pe(u.value);return e.map(s=>({text:s.text,invalid:s.invalid||!1}))});function Se(e){return pe(e).valid}function Ce(e){return B(e).length>0&&B(e).every(s=>ee(s))}function ge(e){if(/[.\s]$/.test(e))return"";const t=e.match(/[a-zA-Z]+$/);return t?t[0].toLowerCase():""}function $e(e,s){if(!e||s===0)return{wordIndex:0,charIndex:0};const t=e.slice(0,s),i=/[.\s]$/.test(t),l=B(t);if(l.length===0)return{wordIndex:0,charIndex:0};if(i)return{wordIndex:Math.min(l.length,2),charIndex:0};const $=l[l.length-1],w=l.length-1;B(e);const x=$.length;return w<2&&!ve.value&&ee($)?{wordIndex:w+1,charIndex:0}:{wordIndex:Math.min(w,2),charIndex:x}}function ue(e,s){if(!e||s===0)return{wordIndex:0,charIndex:0};const t=e.slice(0,s),i=/[.\s]$/.test(t),l=B(t);if(l.length===0)return{wordIndex:0,charIndex:0};if(i)return{wordIndex:Math.min(l.length,2),charIndex:0};const $=l[l.length-1],w=l.length-1;return{wordIndex:Math.min(w,2),charIndex:$.length}}const r=W(()=>{const e=B(u.value),s=[],t=ge(u.value),i=h.value,l=/[.\s]$/.test(u.value),$=J.value!==Q.value,w=ue(u.value,Math.min(J.value,Q.value)),x=ue(u.value,Math.max(J.value,Q.value)),H=$?ue(u.value,C.value):$e(u.value,C.value);for(let M=0;M<3;M++){const q=H.wordIndex===M;let O=-1,R=-1;if($&&(M>w.wordIndex&&M<x.wordIndex?(O=0,R=e[M]?.length??0):M===w.wordIndex&&M===x.wordIndex?(O=w.charIndex,R=x.charIndex):M===w.wordIndex?(O=w.charIndex,R=e[M]?.length??0):M===x.wordIndex&&(O=0,R=x.charIndex)),M<e.length){const me=e[M].toLowerCase(),Ke=M===e.length-1,ze=Ke&&!l?!je(me):!ee(me);if(Ke&&!l&&i&&t){const lt=i.length;s.push({text:"",typedPrefix:t,hintSuffix:i.slice(t.length),invalid:ze,hasCursor:q,cursorCharIndex:q?H.charIndex:-1,wordLen:lt,selectionStartChar:O,selectionEndChar:R})}else s.push({text:me,invalid:ze,hasCursor:q,cursorCharIndex:q?H.charIndex:-1,wordLen:me.length,selectionStartChar:O,selectionEndChar:R})}else s.push({text:"",invalid:!1,hasCursor:q,cursorCharIndex:0,wordLen:0,selectionStartChar:O,selectionEndChar:R})}return s}),n=W(()=>J.value!==Q.value),g=W(()=>{const e=B(u.value);return e.length===3&&e.every(s=>ee(s))});function Ne(e){return B(e).join(".")}function tt(){if(!Y||F)return;const e=Ye(Y);F=Ze(e,ne).then(s=>{j=s,F=null})}async function Ue(){if(j){const s=j;return j=null,s}if(F){await F;const s=j;return j=null,s}if(!Y)throw new Error("No PoW challenge available");const e=Ye(Y);return await Ze(e,ne)}function Te(e){e?.challenge&&(Y=e.challenge,ne=e.work,j=null,F=null,tt())}async function Le(){if(!(c||se)){se=!0;try{const e=T.value?.auth_host,s="/auth/ws/remote-auth/permit",t=e&&location.host!==e?`//${e}${s}`:s;c=await vt(t);const i=await c.receive_json();if(i.status&&i.detail)throw new Error(i.detail);if(!i.pow?.challenge)throw new Error("Server did not send PoW challenge");Te(i.pow)}catch(e){throw console.error("WebSocket connection error:",e),c=null,e}finally{se=!1}}}function st(e){if(e.key==="Tab"||e.key===" "||e.key==="Escape"){at(e);return}setTimeout(Ve,0)}function Ve(){const e=E.value,s=e?.selectionStart??u.value.length,t=e?.selectionEnd??s,l=(e?.selectionDirection??"none")==="backward"?s:t;ve.value=l<te,te=l,C.value=l,Q.value=t,J.value=s}function nt(){C.value=E.value?.selectionStart??u.value.length;const{word:e,end:s}=ie(u.value,C.value);if(he(u.value)>=3||!e||e.length<1||C.value!==s){h.value="";return}const i=Oe(e.toLowerCase());i&&i!==e.toLowerCase()?h.value=i:h.value=""}function He(){if(!h.value)return!1;const{word:e,start:s,end:t}=ie(u.value,C.value);if(!e)return!1;const i=u.value.slice(0,s),w=B(i).length===2?"":" ",x=u.value.slice(t);u.value=i+h.value+w+x.trimStart();const H=s+h.value.length+w.length;return ye(()=>{E.value?.setSelectionRange(H,H),C.value=H}),h.value="",!0}function ce(){C.value=E.value?.selectionStart??u.value.length;const e=C.value,t=u.value.slice(0,e).match(/([a-zA-Z]+) $/);if(t){const l=t[1].toLowerCase(),$=Oe(l);if($&&$!==l&&!ee(l)){const w=e-t[0].length,x=u.value.slice(0,w),H=u.value.slice(e),O=B(x).length===2?"":" ";u.value=x+$+O+H;const R=w+$.length+O.length;ye(()=>{E.value?.setSelectionRange(R,R),C.value=R})}}nt(),N&&(clearTimeout(N),N=null),v.value=null,S.value=null,A.value=!1,y.value=!Se(u.value);const i=B(u.value);if(i.length>=1&&!c&&!se&&Le(),i.length===3){if(!Ce(u.value))return;N=setTimeout(()=>{ot()},150)}}async function ot(){if(!(p.value||I.value||!g.value||Ne(u.value)===Z&&v.value)){p.value=!0,m.value="pow",S.value=null,A.value=!1;try{if(await Le(),!c)throw new Error("Failed to connect");const s=await Ue(),t=qe(s),i=Ne(u.value);if(!g.value)return;m.value="server",c.send_json({code:i,pow:t});const l=await c.receive_json();if(Te(l.pow),typeof l.status=="number"&&l.status>=400){oe(l.detail||"Request failed","error"),A.value=!0,v.value=null,Z=null;return}l.status==="found"&&l.host?(v.value={host:l.host,user_agent_pretty:l.user_agent_pretty,client_ip:l.client_ip,action:l.action||"login"},Z=i,ye(()=>{z.value?.focus()})):(oe("Unexpected response from server","error"),A.value=!0,v.value=null,Z=null)}catch(s){console.error("Lookup error:",s),oe(s.message||"Lookup failed","error"),A.value=!0,v.value=null,Z=null,c&&(c.close(),c=null)}finally{p.value=!1,m.value=""}}}function at(e){if(e.key==="Escape"){u.value="",ce(),e.preventDefault();return}if(e.key==="Tab"){if(h.value&&He()){e.preventDefault(),ce();return}u.value.trim()&&e.preventDefault();return}e.key===" "&&h.value&&He()&&(e.preventDefault(),ce())}async function rt(){if(!(!v.value||I.value)){I.value=!0,S.value=null;try{if(c||await Le(),!c)throw new Error("Failed to connect");const e=await Ue(),s=qe(e);c.send_json({authenticate:!0,pow:s});const t=await c.receive_json();if(typeof t.status=="number"&&t.status>=400)throw new Error(t.detail||"Authentication failed");if(!t.optionsJSON)throw new Error(t.detail||"Failed to get authentication options");const i=await ft(t);c.send_json(i);const l=await c.receive_json();if(typeof l.status=="number"&&l.status>=400)throw new Error(l.detail||"Authentication failed");if(l.status==="success")oe("Device authenticated successfully!","success",3e3),k("completed"),We();else throw new Error(l.detail||"Authentication failed")}catch(e){console.error("Pairing error:",e);const s=e.name==="NotAllowedError"?"Passkey authentication was cancelled":e.message||"Authentication failed";S.value=s,k("error",s)}finally{I.value=!1,c&&(c.close(),c=null)}}}async function Re(){if(c){try{c.send_json({deny:!0}),await new Promise(e=>setTimeout(e,100))}catch(e){console.error("Error sending deny message:",e)}c.close(),c=null}We()}function We(){u.value="",S.value=null,A.value=!1,v.value=null,p.value=!1,m.value="",h.value="",y.value=!1,Z=null,c&&(c.close(),c=null),Y=null,ne=null,F=null,j=null}return _e(async()=>{await le(),ye(()=>{C.value=E.value?.selectionStart??0})}),ke(()=>{N&&(clearTimeout(N),N=null),c&&(c.close(),c=null)}),o({reset:We,deny:Re,code:u,handleInput:ce,loading:I,error:S}),(e,s)=>(f(),_("div",Mt,[a("form",{onSubmit:Je(rt,["prevent"]),class:"pairing-form"},[v.value?v.value?(f(),_("div",Rt,[a("p",Kt,[K("Permit "+P(v.value.action==="register"?"registration":"login")+" to ",1),a("strong",null,P(v.value.host),1)]),a("p",zt,P(v.value.user_agent_pretty),1),S.value?(f(),_("p",Ft,P(S.value),1)):D("",!0),a("div",jt,[a("button",{type:"button",class:"btn-secondary",disabled:I.value,onClick:Re,style:{flex:"1"}}," Deny ",8,Ot),a("button",{ref_key:"submitBtnRef",ref:z,type:"submit",disabled:I.value,class:"btn-primary",style:{flex:"1"}},P(I.value?"Authenticating…":"Authorize"),9,qt)])])):D("",!0):(f(),_("div",Et,[a("div",{class:Ae(["input-wrapper",{"has-error":A.value,"is-complete":v.value&&!A.value,focused:re.value,"has-selection":n.value}])},[a("div",{class:Ae(["slot-machine",{"has-error":A.value,"is-complete":v.value&&!A.value}]),"aria-hidden":"true"},[(f(!0),_(de,null,ut(r.value,(t,i)=>(f(),_("div",{key:i,class:Ae(["slot-reel",{"invalid-word":t.invalid,empty:!t.text&&!t.typedPrefix}])},[a("div",Bt,[t.selectionStartChar>=0&&t.selectionEndChar>t.selectionStartChar?(f(),_("span",{key:0,class:"selection-overlay",style:Pe({"--sel-start":t.selectionStartChar,"--sel-end":t.selectionEndChar,"--word-len":t.wordLen})},null,4)):D("",!0),t.typedPrefix?(f(),_(de,{key:1},[a("span",Dt,P(t.typedPrefix),1),a("span",Nt,P(t.hintSuffix),1),t.hasCursor?(f(),_("span",{key:0,class:"cursor-overlay",style:Pe({"--cursor-pos":t.cursorCharIndex,"--word-len":t.wordLen})},null,4)):D("",!0)],64)):t.text?(f(),_(de,{key:2},[K(P(t.text)+" ",1),t.hasCursor?(f(),_("span",{key:0,class:"cursor-overlay",style:Pe({"--cursor-pos":t.cursorCharIndex,"--word-len":t.wordLen})},null,4)):D("",!0)],64)):(f(),_(de,{key:3},[t.hasCursor?(f(),_("span",Ut)):D("",!0)],64))])],2))),128))],2),it(a("input",{ref_key:"inputRef",ref:E,"onUpdate:modelValue":s[0]||(s[0]=t=>u.value=t),type:"text",placeholder:U.placeholder,autocomplete:"off",autocapitalize:"none",autocorrect:"off",spellcheck:"false",class:"pairing-input hidden-input",onInput:ce,onKeydown:st,onMouseup:Ve,onFocus:s[1]||(s[1]=t=>re.value=!0),onBlur:s[2]||(s[2]=t=>re.value=!1)},null,40,Tt),[[ct,u.value]])],2),m.value?(f(),_("div",Vt,[a("span",Ht,P(m.value==="pow"?"🔐":"📡"),1),s[3]||(s[3]=a("span",{class:"processing-spinner-small"},null,-1))])):D("",!0)]))],32)]))}},Zt=De(Yt,[["__scopeId","data-v-77a073d9"]]),Gt={class:"view-root","data-view":"profile"},Jt={class:"view-header"},Qt={class:"remote-auth-inline"},Xt={key:0,class:"remote-auth-label"},es={class:"section-block"},ts={class:"section-body"},ss={class:"section-block"},ns=["disabled"],os=["disabled"],as=["disabled"],rs={key:0,class:"logout-note"},ls={key:1,class:"logout-note"},is={__name:"ProfileView",setup(U){const o=xe(),L=d(null),k=d(!1),I=d(!1),S=d(""),T=d(!1),c=d(null),V=d(null),E=d(!1),z=d(null),u=d(null),p=d(null),m=d(null),v=d(null),h=d(null),y=d(null),A=d(null),C=W(()=>k.value||I.value);Ge(k,r=>{r&&(S.value=o.userInfo?.ctx.user.display_name??"")}),_e(()=>{L.value=setInterval(()=>{o.userInfo&&(o.userInfo={...o.userInfo})},6e4)}),ke(()=>{L.value&&clearInterval(L.value)});const J=async()=>{try{await gt.register(null,null,()=>{o.showMessage("Adding new passkey...","info")}),await o.loadUserInfo(),o.showMessage("New passkey added successfully!","success",3e3)}catch(r){console.error("Failed to add new passkey:",r),o.showMessage(r.message,"error")}},Q=()=>{o.showMessage("The other device is now signed in!","success",4e3),setTimeout(()=>z.value?.reset(),3e3)},re=r=>{r.includes("cancelled")||o.showMessage(r,"error",4e3)},ve=()=>{o.showMessage("📋 Link copied! Send it to your other device."),I.value=!1},te=r=>{Me(r,{primarySelector:".btn-primary",itemSelector:"button"})},se=r=>{if(C.value)return;const n=fe(r);n&&n==="down"&&(r.preventDefault(),Me(A.value,{primarySelector:".mini-btn",itemSelector:".mini-btn, .pairing-input"}))},Y=r=>{if(C.value)return;const n=fe(r);if(!n)return;r.preventDefault(),n==="left"||n==="right"?be(A.value,r.target,n,{itemSelector:".mini-btn, .pairing-input"}):n==="up"?h.value?.focusCurrent?.():n==="down"&&u.value?.$el?.focus()},ne=r=>{C.value||(r==="down"||r==="right"?te(p.value):(r==="up"||r==="left")&&Me(A.value,{primarySelector:".mini-btn",itemSelector:".mini-btn, .pairing-input"}))},F=r=>{if(C.value)return;const n=fe(r);n&&(r.preventDefault(),n==="left"||n==="right"?be(p.value,r.target,n,{itemSelector:"button"}):n==="up"?Ee(u.value?.$el,0,{itemSelector:".credential-item"}):n==="down"&&Ee(m.value?.$el,0,{itemSelector:".session-group"}))},j=r=>{C.value||(r==="up"?te(p.value):r==="down"&&te(v.value))},N=r=>{if(C.value)return;const n=fe(r);n&&(r.preventDefault(),n==="left"||n==="right"?be(v.value,r.target,n,{itemSelector:"button"}):n==="up"&&Ee(m.value?.$el,-1,{itemSelector:".session-group"}))},Z=async r=>{const n=r?.credential;if(n)try{await o.deleteCredential(n),o.showMessage("Passkey deleted! You should also remove it from your password manager or device.","success",3e3)}catch(g){o.showMessage(`Failed to delete passkey: ${g.message}`,"error")}},oe=W(()=>o.settings?.rp_name||"this service"),le=W(()=>o.userInfo?.sessions||[]),ie=W(()=>le.value.find(n=>n.is_current)?.host||"this host"),X=d({}),B=async r=>{const n=r?.id;if(n){X.value={...X.value,[n]:!0};try{await o.terminateSession(n)}catch(g){o.showMessage(g.message||"Failed to terminate session","error",5e3)}finally{const g={...X.value};delete g[n],X.value=g}}},he=async()=>{await o.logoutEverywhere()},pe=async()=>{await o.logout()},Se=()=>{S.value=o.userInfo?.ctx.user.display_name??"",k.value=!0},Ce=W(()=>{const r=o.userInfo?.ctx.permissions;return r.includes("auth:admin")||r.includes("auth:org:admin")}),ge=W(()=>le.value.length>1),$e=W(()=>{const r=[{label:"Auth",href:ht()}];return Ce.value&&r.push({label:"Admin",href:pt()}),r}),ue=async()=>{const r=S.value.trim();if(!r){o.showMessage("Name cannot be empty","error");return}try{T.value=!0,await Qe("/auth/api/user/display-name",{method:"PATCH",body:{display_name:r}}),k.value=!1,await o.loadUserInfo(),o.showMessage("Name updated successfully!","success",3e3)}catch(n){o.showMessage(n.message||"Failed to update name","error")}finally{T.value=!1}};return(r,n)=>(f(),_("section",Gt,[a("header",Jt,[n[10]||(n[10]=a("h1",null,"User Profile",-1)),ae(_t,{ref_key:"breadcrumbs",ref:h,entries:$e.value,onKeydown:se},null,8,["entries"]),n[11]||(n[11]=a("p",{class:"view-lede"},"Account dashboard for managing credentials and authenticating with other devices.",-1))]),a("section",{class:"section-block",ref_key:"userInfoSection",ref:A},[b(o).userInfo?.ctx?(f(),G(Xe,{key:0,ref_key:"userBasicInfo",ref:y,name:b(o).userInfo.ctx.user.display_name,visits:b(o).userInfo.visits,"created-at":b(o).userInfo.created_at,"last-seen":b(o).userInfo.last_seen,loading:b(o).isLoading,"update-endpoint":"/auth/api/user/display-name",onSaved:n[1]||(n[1]=g=>b(o).loadUserInfo()),onEditName:Se,onKeydown:Y},{default:Fe(()=>[a("div",Qt,[E.value?D("",!0):(f(),_("label",Xt,"Code words:")),ae(Zt,{ref_key:"pairingEntry",ref:z,title:"",description:"",onCompleted:Q,onError:re,onDeviceInfoVisible:n[0]||(n[0]=g=>E.value=g)},null,512)]),n[12]||(n[12]=a("p",{class:"remote-auth-description"},"Provided by another device requesting remote auth.",-1))]),_:1},8,["name","visits","created-at","last-seen","loading"])):D("",!0)],512),a("section",es,[n[13]||(n[13]=a("div",{class:"section-header"},[a("h2",null,"Your Passkeys"),a("p",{class:"section-description"},[K("Ideally have at least two passkeys in case you lose one. More than one user can be registered on the same device, giving you a choice at login. "),a("a",{href:"https://bitwarden.com/pricing/",target:"_blank",rel:"noopener noreferrer"},"Bitwarden"),K(" can sync one passkey to all your devices. Other secure options include "),a("b",null,"local passkeys"),K(", as well as hardware keys such as "),a("a",{href:"https://www.yubico.com",target:"_blank",rel:"noopener noreferrer"},"YubiKey"),K(". Cloud sync via Google, Microsoft or iCloud is discouraged.")])],-1)),a("div",ts,[ae(kt,{ref_key:"credentialList",ref:u,credentials:b(o).userInfo?.credentials||[],"aaguid-info":b(o).userInfo?.aaguid_info||{},loading:b(o).isLoading,"hovered-credential-uuid":c.value,"hovered-session-credential-uuid":V.value?.credential,"navigation-disabled":C.value,"allow-delete":"",onDelete:Z,onCredentialHover:n[2]||(n[2]=g=>c.value=g),onNavigateOut:ne},null,8,["credentials","aaguid-info","loading","hovered-credential-uuid","hovered-session-credential-uuid","navigation-disabled"]),a("div",{class:"button-row",ref_key:"credentialButtons",ref:p},[a("button",{onClick:J,class:"btn-primary",onKeydown:F},"Register New",32),a("button",{onClick:n[3]||(n[3]=g=>I.value=!0),class:"btn-secondary",onKeydown:F},"Another Device",32)],512)])]),ae(It,{ref_key:"sessionList",ref:m,sessions:le.value,"terminating-sessions":X.value,"hovered-credential-uuid":c.value,"navigation-disabled":C.value,onTerminate:B,onSessionHover:n[4]||(n[4]=g=>V.value=g),onNavigateOut:j,"section-description":"You are currently signed in to the following sessions. If you don't recognize something, consider deleting not only the session but the associated passkey you suspect is compromised, as only this terminates all linked sessions and prevents logging in again."},null,8,["sessions","terminating-sessions","hovered-credential-uuid","navigation-disabled"]),k.value?(f(),G(St,{key:0,onClose:n[7]||(n[7]=g=>k.value=!1)},{default:Fe(()=>[n[14]||(n[14]=a("h3",null,"Edit Display Name",-1)),a("form",{onSubmit:Je(ue,["prevent"]),class:"modal-form"},[ae(xt,{label:"Display Name",modelValue:S.value,"onUpdate:modelValue":n[5]||(n[5]=g=>S.value=g),busy:T.value,onCancel:n[6]||(n[6]=g=>k.value=!1)},null,8,["modelValue","busy"])],32)]),_:1})):D("",!0),a("section",ss,[a("div",{class:"button-row",ref_key:"logoutButtons",ref:v},[a("button",{type:"button",class:"btn-secondary",onClick:n[8]||(n[8]=(...g)=>b(Ie)&&b(Ie)(...g)),onKeydown:N}," Back ",32),ge.value?(f(),_(de,{key:1},[a("button",{onClick:pe,class:"btn-danger",disabled:b(o).isLoading,onKeydown:N},"Logout",40,os),a("button",{onClick:he,class:"btn-danger",disabled:b(o).isLoading,onKeydown:N},"All",40,as)],64)):(f(),_("button",{key:0,onClick:he,class:"btn-danger",disabled:b(o).isLoading,onKeydown:N},"Logout",40,ns))],512),ge.value?(f(),_("p",ls,[n[16]||(n[16]=a("strong",null,"Logout",-1)),K(" this session on "+P(ie.value)+", or ",1),n[17]||(n[17]=a("strong",null,"All",-1)),K(" sessions across all sites and devices for "+P(oe.value)+". You'll need to log in again with your passkey afterwards.",1)])):(f(),_("p",rs,[n[15]||(n[15]=a("strong",null,"Logout",-1)),K(" from "+P(ie.value)+".",1)]))]),I.value?(f(),G(Ct,{key:1,endpoint:"/auth/api/user/create-link",onClose:n[9]||(n[9]=g=>I.value=!1),onCopied:ve})):D("",!0)]))}},us=De(is,[["__scopeId","data-v-70360523"]]),cs={class:"view-root host-view","data-view":"host-profile"},ds={class:"view-header"},fs={class:"view-lede"},vs={class:"section-body"},hs={key:1,class:"empty-state"},ps={class:"section-block"},gs={class:"section-body host-actions"},ms=["disabled"],ys=["disabled"],ws={class:"note"},bs={__name:"HostProfileView",props:{initializing:{type:Boolean,default:!1}},setup(U){const o=xe(),L=window.location.host,k=d(null),I=d(null),S=W(()=>o.userInfo?.ctx||null),T=W(()=>S.value?.org.display_name??""),c=W(()=>S.value?.role.display_name??""),V=W(()=>{const h=o.settings?.rp_name;return h?`${h} account`:"Account overview"}),E=W(()=>`You're signed in to ${L}.`),z=W(()=>o.settings?.auth_host||""),u=W(()=>{const h=z.value;if(!h)return"";let y=o.settings?.ui_base_path??"/auth/";return y.startsWith("/")||(y=`/${y}`),y.endsWith("/")||(y=`${y}/`),`${window.location.protocol||"https:"}//${h}${y}`}),p=()=>{u.value&&(window.location.href=u.value)},m=async()=>{await o.logout()},v=h=>{const y=fe(h);y&&(h.preventDefault(),(y==="left"||y==="right")&&be(I.value,h.target,y,{itemSelector:"button"}))};return(h,y)=>(f(),_("section",cs,[a("header",ds,[a("h1",null,P(V.value),1),a("p",fs,P(E.value),1)]),a("section",{class:"section-block",ref_key:"userInfoSection",ref:k},[a("div",vs,[S.value?(f(),G(Xe,{key:0,name:S.value.user.display_name,visits:b(o).userInfo?.visits||0,"created-at":b(o).userInfo?.created_at,"last-seen":b(o).userInfo?.last_seen,"org-display-name":T.value,"role-name":c.value,"can-edit":!1},null,8,["name","visits","created-at","last-seen","org-display-name","role-name"])):(f(),_("p",hs,P(U.initializing?"Loading your account…":"No active session found."),1))])],512),a("section",ps,[a("div",gs,[a("div",{class:"button-row",ref_key:"buttonRow",ref:I,onKeydown:v},[a("button",{type:"button",class:"btn-secondary",onClick:y[0]||(y[0]=(...A)=>b(Ie)&&b(Ie)(...A))}," Back "),a("button",{type:"button",class:"btn-danger",disabled:b(o).isLoading,onClick:m},P(b(o).isLoading?"Signing out…":"Logout"),9,ms),u.value?(f(),_("button",{key:0,type:"button",class:"btn-primary",disabled:b(o).isLoading,onClick:p}," Full Profile ",8,ys)):D("",!0)],544),a("p",ws,[y[1]||(y[1]=a("strong",null,"Logout",-1)),K(" from "+P(b(L))+", or access your ",1),y[2]||(y[2]=a("strong",null,"Full Profile",-1)),K(" at "+P(z.value)+" (you may need to sign in again).",1)])])])]))}},_s=De(bs,[["__scopeId","data-v-237999a2"]]),ks={class:"app-shell"},Is={class:"app-main"},xs={__name:"App",setup(U){const o=xe(),L=d("loading"),k=d("Loading...");function I(p){if(!p)return null;const m=p.trim().toLowerCase();return m?m.replace(/:80$/,"").replace(/:443$/,""):null}const S=W(()=>{const p=o.settings?.auth_host;if(!p)return!1;const m=I(window.location.host),v=I(p);return m!==v});W(()=>o.userInfo?.ctx.user.uuid);function T(){o.userInfo=null,L.value="terminal"}const c=()=>o.userInfo?.ctx.user.uuid,V=new mt(c,T);_e(()=>V.start()),ke(()=>V.stop());async function E(){try{return o.userInfo=await Qe("/auth/api/user-info",{method:"POST"}),L.value="profile",!0}catch{return o.userInfo=null,!1}}async function z(){const p=await Pt("login");yt(p),k.value="Authentication required..."}function u(p){const m=p.data;if(m?.type)switch(m.type){case"auth-success":we(),L.value="loading",k.value="Loading user profile...",E();break;case"auth-error":m.cancelled?console.log("Authentication cancelled by user"):o.showMessage(m.message||"Authentication failed","error",5e3);break;case"auth-cancelled":console.log("Authentication cancelled");break;case"auth-back":we(),T();break;case"auth-close-request":we();break}}return _e(async()=>{window.addEventListener("message",u),await o.loadSettings();const p=o.settings?.rp_name;if(p){const v=o.settings?.auth_host,h=v&&I(window.location.host)!==I(v);document.title=h?`${p} · Account summary`:p}await E()||z()}),ke(()=>{window.removeEventListener("message",u),we()}),(p,m)=>(f(),_("div",ks,[ae(Lt),a("main",Is,[L.value==="profile"&&S.value?(f(),G(_s,{key:0})):L.value==="profile"?(f(),G(us,{key:1})):L.value==="loading"?(f(),G($t,{key:2,message:k.value},null,8,["message"])):L.value==="terminal"?(f(),G(Wt,{key:3})):D("",!0)])]))}},et=wt(xs);et.use(At());et.mount("#app");bt();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as o,a6 as d,o as u,y as s,d as m,z as l,J as h,K as p}from"./_plugin-vue_export-helper-D2l53SUz.js";import{R as f}from"./RestrictedAuth-BSusdAfp.js";import{g as a}from"./helpers-DzjFIx78.js";import"./pow-2N9bxgAo.js";const w={__name:"RestrictedForward",setup(_){const n=o(()=>d()),r=o(()=>{const e=document.documentElement.getAttribute("data-mode");return e==="reauth"?"reauth":e==="forbidden"?"forbidden":"login"});function c(){location.reload()}function i(){const t=n.value||"/auth/";window.location.pathname!==t&&history.replaceState(null,"",t),window.location.href=t}return u(()=>{window.addEventListener("keydown",t=>{t.key==="Escape"&&a()})}),(t,e)=>(m(),s(f,{mode:r.value,onAuthenticated:c,onBack:l(a),onHome:i},null,8,["mode","onBack"]))}};h(w).mount("#app");p();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as M,Q as N,r as i,c as m,a6 as b,o as $,b as c,d as u,f as z,e as t,t as p,g as F,h as K,v as V,L as D,m as E,H as x,a7 as I,a8 as G,G as H,J as L,K as U}from"./_plugin-vue_export-helper-D2l53SUz.js";const j={class:"app-shell"},J={key:0,class:"global-status",style:{display:"block"}},O={class:"view-root"},Q={class:"surface surface--tight",style:{"max-width":"560px",margin:"0 auto",width:"100%"}},Y={class:"view-header",style:{"text-align":"center"}},q={class:"view-lede"},W={key:0,class:"section-block"},X={key:1,class:"section-block"},Z={key:2,class:"section-block"},ee={class:"section-body"},se={class:"name-edit"},te=["disabled"],ae=["disabled"],ne={__name:"ResetApp",setup(ie){const o=N({show:!1,message:"",type:"info"}),d=i(!0),n=i(!1),l=i(""),T=i(null),g=i(null),h=i(""),y=i("");let v=null;const P=m(()=>g.value?.token_type||"your enrollment"),R=m(()=>d.value?"Preparing your secure enrollment…":f.value?`Finish up ${P.value}. You may edit the name below if needed, and it will be saved to your passkey.`:"This authentication link is no longer valid.");m(()=>b());const f=m(()=>!!(l.value&&g.value));function r(e,s="info",a=3e3){o.show=!0,o.message=e,o.type=s,v&&clearTimeout(v),a>0&&(v=setTimeout(()=>{o.show=!1},a))}async function S(){try{const e=await E();T.value=e,e?.rp_name&&(document.title=`${e.rp_name} · Passkey Setup`)}catch(e){console.warn("Unable to load settings",e)}}async function B(){if(l.value)try{g.value=await x("/auth/api/token-info",{method:"GET",headers:{Authorization:`Bearer ${l.value}`}}),h.value=g.value.display_name}catch(e){console.error("Failed to load token info",e);const s=e instanceof I?e.data?.detail||"The authentication link is invalid or expired.":G(e);y.value=s}}async function _(){if(!f.value||n.value)return;n.value=!0,r("Starting passkey registration…","info");let e;try{const s=h.value.trim()||null;e=await H.register(l.value,s)}catch(s){n.value=!1;const a=s?.message||"Passkey registration cancelled",w=a==="Passkey registration cancelled";r(w?a:`Registration failed: ${a}`,w?"info":"error",4e3);return}try{await C(e)}catch(s){n.value=!1;const a=s?.message||"Failed to establish session";r(a,"error",4e3);return}r("Passkey registered successfully!","success",800),setTimeout(()=>{n.value=!1,k()},800)}async function C(e){if(!e?.session_token)throw new Error("Registration response missing session_token");return await x("/auth/api/set-session",{method:"POST",headers:{Authorization:`Bearer ${e.session_token}`}})}function k(){const e=b.value||"/auth/";window.location.pathname!==e&&history.replaceState(null,"",e),window.location.reload()}function A(){const e=window.location.pathname.split("/").filter(Boolean);if(!e.length)return"";const s=e[e.length-1],a=e.slice(0,-1);return a.length>1||a.length===1&&a[0]!=="auth"||!s.includes(".")?"":s}return $(async()=>{if(l.value=A(),await S(),!l.value){const e="Reset link is missing or malformed.";y.value=e,r(e,"error",0),d.value=!1;return}await B(),d.value=!1}),(e,s)=>(u(),c("div",j,[o.show?(u(),c("div",J,[t("div",{class:F(["status",o.type])},p(o.message),3)])):z("",!0),t("main",O,[t("div",Q,[t("header",Y,[s[1]||(s[1]=t("h1",null,"🔑 Registration",-1)),t("p",q,p(R.value),1)]),d.value?(u(),c("section",W,[...s[2]||(s[2]=[t("div",{class:"section-body center"},[t("p",null,"Loading reset details…")],-1)])])):f.value?(u(),c("section",Z,[t("div",ee,[t("label",se,[s[3]||(s[3]=t("span",null,"👤 Name",-1)),K(t("input",{type:"text","onUpdate:modelValue":s[0]||(s[0]=a=>h.value=a),disabled:n.value,maxlength:"64",onKeyup:D(_,["enter"])},null,40,te),[[V,h.value]])]),t("button",{class:"btn-primary",disabled:n.value,onClick:_},p(n.value?"Registering…":"Register Passkey"),9,ae)])])):(u(),c("section",X,[t("div",{class:"section-body center"},[t("div",{class:"button-row center",style:{"justify-content":"center"}},[t("button",{class:"btn-secondary",onClick:k},"Return to sign-in")])])]))])])]))}},oe=M(ne,[["__scopeId","data-v-4830d223"]]);L(oe).mount("#app");U();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as p,c as h,o as m,y as l,d as f,J as w,K as k}from"./_plugin-vue_export-helper-D2l53SUz.js";import{R as y}from"./RestrictedAuth-BSusdAfp.js";import"./pow-2N9bxgAo.js";const _={__name:"RestrictedApi",setup(g){const o=p(null);function c(){const e=window.location.pathname.match(/\/auth\/([^/]+)$/);if(e){const r=e[1],s=r.split(".");if(s.length===5&&s.every(d=>d.length>0))return r}return null}const i=h(()=>{const e=new URLSearchParams(window.location.hash.slice(1)).get("mode");return e==="reauth"?"reauth":e==="forbidden"?"forbidden":"login"});function n(t){window.parent&&window.parent!==window&&window.parent.postMessage(t,"*")}function u(t){n({type:"auth-success",authenticated:!0,sessionToken:t.session_token})}function a(){n({type:"auth-back"})}return m(()=>{o.value=c(),n({type:"auth-ready"}),window.addEventListener("keydown",t=>{t.key==="Escape"&&a()})}),(t,e)=>(f(),l(y,{mode:i.value,"remote-auth-token":o.value,onAuthenticated:u,onBack:a},null,8,["mode","remote-auth-token"]))}};w(_).mount("#app");k();
|
paskia-0.10.0.dist-info/RECORD
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
paskia/__init__.py,sha256=6eopO87IOFA2zfOuqt8Jj8Tdtp93HBMOgUBtTzMRweM,57
|
|
2
|
-
paskia/_version.py,sha256=XS8OMho0YiZyQ_qDeRsy__m_nWUzYVEJw-NLk1VtDQU,706
|
|
3
|
-
paskia/authsession.py,sha256=7TGZuJw4RLsRJ-pemii6zRXTR-wdLx3nFVItytKFz5s,1259
|
|
4
|
-
paskia/bootstrap.py,sha256=FShAMvLmLxQ4HfE9yz1ZB6EO9fC-lQroesU4dC58VO8,3875
|
|
5
|
-
paskia/config.py,sha256=BdGzQ3Ja1enSTHmkDkBDGQk_JluT3VaK3Y7AqB5xMlk,723
|
|
6
|
-
paskia/globals.py,sha256=ip03kLoS_27cNIgXTVcXNoeQDjTAC_IILuXaHKShTws,1712
|
|
7
|
-
paskia/remoteauth.py,sha256=IyC1Z9YTYjPi4h8B0UwwoWfxaheEgyfksbKraOrAcqA,12418
|
|
8
|
-
paskia/sansio.py,sha256=LQRdV1kW_aGwDWC8fhyEvqWPwKZVx_8qzQv65et6utg,9727
|
|
9
|
-
paskia/aaguid/__init__.py,sha256=I5HMkAwiyLKKlkZOb9z5s2xGApXIbhbBuuX3IhW2y8E,1047
|
|
10
|
-
paskia/aaguid/combined_aaguid.json,sha256=CaZ96AiwdAjBnyVZnJ1eolAHxUQMB2H6mDgZkorYg_A,4124722
|
|
11
|
-
paskia/db/__init__.py,sha256=BGiCFZFX4xMsFn6aKvuV7X7VL-NoA-URdl2493EfRXE,3220
|
|
12
|
-
paskia/db/background.py,sha256=hj3hXoEpneVWhrAHZvoL09DVVaqOTqe-n9RIJZbbEos,3546
|
|
13
|
-
paskia/db/jsonl.py,sha256=1uHBSTtLEc6CChoRJx2zYjFrMcPkGCZN_8MQpHCohFw,9959
|
|
14
|
-
paskia/db/logging.py,sha256=ENCHdrlUz27hjWPFLezpF9bpO-pnrkgO6bNnfCyHcJ4,11017
|
|
15
|
-
paskia/db/migrations.py,sha256=XHHC0LbxXBN6gldiKm4PhDVqEqroMN1E8tz0LEqGPbQ,957
|
|
16
|
-
paskia/db/operations.py,sha256=rCKDNwEfcQz-5DUtZHZECcE9syX50LOFIrmZw9iUink,26443
|
|
17
|
-
paskia/db/structs.py,sha256=G6udtoomKmB8wijO6x1AObX9Oas66gBmJ_YxIiDLO6E,14060
|
|
18
|
-
paskia/fastapi/__init__.py,sha256=NFsTX1qytoyZKiur7RDTa2fxiOWHrop5CAAx8rqK9E0,58
|
|
19
|
-
paskia/fastapi/__main__.py,sha256=DADaKS27BoDqTtfP_p1qbatUL1URjAy9wyJBgjhAQIA,8032
|
|
20
|
-
paskia/fastapi/admin.py,sha256=8raj__JkNTYuvjdZejnK4BhaZBl219qjobmUafQMRkI,30343
|
|
21
|
-
paskia/fastapi/api.py,sha256=RTRhhn6d44aE3MNrepgLBWIPgDPCNr6dHLKSEja_sgU,9240
|
|
22
|
-
paskia/fastapi/auth_host.py,sha256=Y5w9Mz6jyq0hj7SX8LfwebaesUOLGcWzGW9lsmw5WOo,3242
|
|
23
|
-
paskia/fastapi/authz.py,sha256=ui87Ii4hsy0V8f68wGSYft2D7OHAD2l2tsHqokAgBt8,3322
|
|
24
|
-
paskia/fastapi/logging.py,sha256=xP7dxwy8bfKRft3jZPBdsNQk8eQ3nIHB8BUyz7A7sI0,8840
|
|
25
|
-
paskia/fastapi/mainapp.py,sha256=bW7dVxgZfrPtmASri4X7mD5P4sHOmIq3AmoAj37-e8M,5057
|
|
26
|
-
paskia/fastapi/remote.py,sha256=0hsJj8qK89h1U7-5nJFCk9cTte2tvh02b510v-_TGxU,17789
|
|
27
|
-
paskia/fastapi/reset.py,sha256=MuZqhOF68P9kGq5zKPV19FjTIvhZQ423YowzHKcVjlc,3573
|
|
28
|
-
paskia/fastapi/response.py,sha256=gTPNJtS92HfQYey2DMMN8oM1YazNSj6tjBBuFJuuBhc,611
|
|
29
|
-
paskia/fastapi/session.py,sha256=BRnlgR8pTY7o0f7qFnkdyepS2fKEAgqwT9Hj951sZJM,1479
|
|
30
|
-
paskia/fastapi/user.py,sha256=1vi1usiH8IFqqmLkwq2CLoy-x46VTlUnsiNglndajV8,4599
|
|
31
|
-
paskia/fastapi/ws.py,sha256=iY8CVO0W117Vln0DW2xHxiCk__KI29oTMOB2BZEwv34,3581
|
|
32
|
-
paskia/fastapi/wschat.py,sha256=qbEY6AlDlvjeUoIGac3K3DH41MPxPCYuiaFOnz9gxMU,3699
|
|
33
|
-
paskia/fastapi/wsutil.py,sha256=JMPSSWDzMJr7cVobWTFM0HwJrSj_tfKmoO7JkfewuAE,2898
|
|
34
|
-
paskia/frontend-build/auth/index.html,sha256=FO5wXmc7WTTzOZXOKyvO9XrHsk0c931_j_Z3I2xYLes,936
|
|
35
|
-
paskia/frontend-build/auth/admin/index.html,sha256=XTbO2ag2Sojpx7K49vXjNylKmlj0VrqKbNiIhPt4rWc,862
|
|
36
|
-
paskia/frontend-build/auth/assets/AccessDenied-C29NZI95.css,sha256=lJ7TS_wxvrvF_5I8BIDZ23-A-4iusm6WKF4XseT_zuo,7945
|
|
37
|
-
paskia/frontend-build/auth/assets/AccessDenied-DAdzg_MJ.js,sha256=i0hIbfiTnRmRFFWEW7-vLj7v7IQ_cPcP3sIfZWlNcNQ,51889
|
|
38
|
-
paskia/frontend-build/auth/assets/RestrictedAuth-BOdNrlQB.css,sha256=6r_Kf-Q7sueSICtQt8-zufZc1U6qbs084JW-IxUdOoM,5401
|
|
39
|
-
paskia/frontend-build/auth/assets/RestrictedAuth-BSusdAfp.js,sha256=6d9HZzXsmO93ZSUaPd42jp1zJG5ZsZBc2kcvX9RY7bc,9761
|
|
40
|
-
paskia/frontend-build/auth/assets/_plugin-vue_export-helper-D2l53SUz.js,sha256=kuJt8utYB9pLXerrxDEXc0Ytx9jgoT98p4FcObciLSU,86296
|
|
41
|
-
paskia/frontend-build/auth/assets/_plugin-vue_export-helper-DYJ24FZK.css,sha256=5RqRAI3OVX7hxpNlUQvBqYzARmW2piqbcI2NU_PDW_s,12272
|
|
42
|
-
paskia/frontend-build/auth/assets/admin-BeFvGyD6.js,sha256=UJd2bEl4L0KNslnbM-EEX_6stf9MoZGP7sueZcnjKy4,41123
|
|
43
|
-
paskia/frontend-build/auth/assets/admin-CmNtuH3s.css,sha256=Jg_QeSPAOGf2dFCi7FDe71KQ0qma5Dbom70WEE-mNb0,7601
|
|
44
|
-
paskia/frontend-build/auth/assets/auth-BKq4T2K2.css,sha256=lfYJTjXr3iM8YDMHxtBN4jY6JrLE7yjR1nWEGbN_1uE,4333
|
|
45
|
-
paskia/frontend-build/auth/assets/auth-DvHf8hgy.js,sha256=uQHMfl0n3LbWgyy4ldBSfQnKIW26OdUgxDzb05WFVdI,25267
|
|
46
|
-
paskia/frontend-build/auth/assets/forward-C86Jm_Uq.js,sha256=GeqWr3Z7kDwdgiE5S1ojjjud71bS2TtEdhHoNRIZB2E,782
|
|
47
|
-
paskia/frontend-build/auth/assets/helpers-DzjFIx78.js,sha256=w_IsCBn3QwidsuwQhVRycd8Fa53lvbgRGGojTBXVlUc,940
|
|
48
|
-
paskia/frontend-build/auth/assets/pow-2N9bxgAo.js,sha256=7AfzW5lcTefPI6YGXrYao1b56L7v5Bon9Y9N40yHsaE,9447
|
|
49
|
-
paskia/frontend-build/auth/assets/reset-B8PlNXuP.css,sha256=19f4h_GGjADzWvaYag9lnwrmttNXvwVYYHcGGy5X61E,238
|
|
50
|
-
paskia/frontend-build/auth/assets/reset-D71FG0VL.js,sha256=ZccTsQHP5YMoQznz7JBfO-1sZ3UouiulnzhMaIzsnzs,3981
|
|
51
|
-
paskia/frontend-build/auth/assets/restricted-CW0drE_k.js,sha256=l8Qxc8N6RYlJdHTqOPX9zEdgBs0SR5ou5Y-My-IRCnA,1023
|
|
52
|
-
paskia/frontend-build/auth/restricted/index.html,sha256=N_1KkcLd52Un6pVCVpGeXnsacR5FVU6jjcO9CQ_4zkc,785
|
|
53
|
-
paskia/frontend-build/int/forward/index.html,sha256=ur0I53vLzasQM3KOvmhVEK0SC5stL56p7040Vmmdz5I,870
|
|
54
|
-
paskia/frontend-build/int/reset/index.html,sha256=Jx0m9XzYeEwhNddsJAUihL3JiW_rvRxBixNjfAzcg94,612
|
|
55
|
-
paskia/migrate/__init__.py,sha256=r2s99mbHfvlzQJ1V3xnxZOwIyMEMxEXDtFqFj7sJC2U,9916
|
|
56
|
-
paskia/migrate/sql.py,sha256=5HNEUnPP0kqis69URJ5keE4JNbwqWe8oYXwf-zKheLI,14333
|
|
57
|
-
paskia-0.10.0.dist-info/METADATA,sha256=TNP_cx3lJEFqNg6H-ZQMojA75zJlIa1YJuddqW4RTsY,4262
|
|
58
|
-
paskia-0.10.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
59
|
-
paskia-0.10.0.dist-info/entry_points.txt,sha256=vvx6RYetgd61I2ODqQPHqrKHgCfuo08w_T35yDlHenE,93
|
|
60
|
-
paskia-0.10.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|