hfs 0.1.6 → 0.26.1
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.
- package/LICENSE.txt +674 -0
- package/README.md +102 -8
- package/admin/assets/index.5c49e66e.js +282 -0
- package/admin/assets/index.f7794ceb.css +1 -0
- package/admin/assets/sha512.393af749.js +8 -0
- package/admin/index.html +17 -0
- package/admin/logo.svg +36 -0
- package/frontend/assets/index.0f8e459c.js +85 -0
- package/frontend/assets/index.ee805a6c.css +1 -0
- package/frontend/assets/sha512.f2fc2d0b.js +8 -0
- package/frontend/fontello.css +77 -0
- package/frontend/fontello.woff2 +0 -0
- package/frontend/index.html +18 -0
- package/package.json +91 -28
- package/plugins/antibrute/plugin.js +38 -0
- package/plugins/download-counter/plugin.js +47 -0
- package/plugins/download-counter/public/hits.js +5 -0
- package/plugins/updater-disabled/plugin.js +44 -0
- package/plugins/vhosting/plugin.js +42 -0
- package/src/QuickZipStream.js +285 -0
- package/src/ThrottledStream.js +93 -0
- package/src/adminApis.js +169 -0
- package/src/api.accounts.js +59 -0
- package/src/api.auth.js +130 -0
- package/src/api.file_list.js +103 -0
- package/src/api.helpers.js +32 -0
- package/src/api.monitor.js +102 -0
- package/src/api.plugins.js +125 -0
- package/src/api.vfs.js +164 -0
- package/src/apiMiddleware.js +136 -0
- package/src/block.js +33 -0
- package/src/commands.js +105 -0
- package/src/config.js +172 -0
- package/src/connections.js +57 -0
- package/src/const.js +82 -0
- package/src/crypt.js +21 -0
- package/src/debounceAsync.js +48 -0
- package/src/events.js +9 -0
- package/src/frontEndApis.js +38 -0
- package/src/github.js +102 -0
- package/src/index.js +53 -0
- package/src/listen.js +226 -0
- package/src/log.js +137 -0
- package/src/middlewares.js +154 -0
- package/src/misc.js +160 -0
- package/src/pbkdf2.js +74 -0
- package/src/perm.js +176 -0
- package/src/plugins.js +338 -0
- package/src/serveFile.js +104 -0
- package/src/serveGuiFiles.js +113 -0
- package/src/sse.js +29 -0
- package/src/throttler.js +91 -0
- package/src/update.js +69 -0
- package/src/util-files.js +141 -0
- package/src/util-generators.js +30 -0
- package/src/util-http.js +30 -0
- package/src/vfs.js +227 -0
- package/src/watchLoad.js +73 -0
- package/src/zip.js +69 -0
- package/.npmignore +0 -19
- package/admin-server.js +0 -212
- package/cli.js +0 -33
- package/file-server.js +0 -100
- package/lib/common.js +0 -10
- package/lib/extending.js +0 -158
- package/lib/mime.js +0 -19
- package/lib/misc.js +0 -75
- package/lib/serving.js +0 -81
- package/lib/vfs.js +0 -403
- package/main.js +0 -24
- package/note.txt +0 -104
- package/speedtest.js +0 -21
- package/static/backend.css +0 -14
- package/static/backend.html +0 -32
- package/static/backend.js +0 -694
- package/static/extending.js +0 -187
- package/static/frontend.css +0 -29
- package/static/frontend.html +0 -23
- package/static/frontend.js +0 -230
- package/static/icons/files/archive.png +0 -0
- package/static/icons/files/audio.png +0 -0
- package/static/icons/files/file.png +0 -0
- package/static/icons/files/folder.png +0 -0
- package/static/icons/files/image.png +0 -0
- package/static/icons/files/link.png +0 -0
- package/static/icons/files/video.png +0 -0
- package/static/jquery.js +0 -4
- package/static/jquery.rule-1.0.2.js +0 -273
- package/static/misc.js +0 -194
- package/static/tpl.js +0 -17
- package/todo.txt +0 -25
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg: #fff;--text: #555;--faint-contrast: #0002;--mild-contrast: #0005;--good-contrast: #000a;--button-bg: #68a;--button-text: #fff;--focus-color: #468}:root .theme-dark{--bg: #000;--text: #999;--faint-contrast: #fff2;--mild-contrast: #fff5;--good-contrast: #fffa;--button-bg: #345;--button-text: #999}:root .theme-dark a{color:#8ac}:root .theme-dark .dialog-closer{background:#633}:root .theme-dark .dialog-icon{color:#ccc}:root .theme-dark .dialog-backdrop{background:rgba(51,51,51,.7333333333)}body{background:var(--bg);margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,button,select,input{font-size:12pt}#root{max-width:50em;margin:auto;min-height:100vh;display:flex;flex-direction:column}body,input{color:var(--text)}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}input,select{padding:.3em .4em;border-radius:.5em;background:var(--bg);border-color:var(--mild-contrast);color:var(--good-contrast);max-width:100%;box-sizing:border-box}input[type=checkbox]{margin:0 1.3em 0 .8em;transform:scale(1.7);accent-color:var(--button-bg)}.hidden{display:none!important}.icon{font-size:1.2em}.icon.mirror:before{transform:scaleX(-1)}a{text-decoration:none;color:#57a}button{background-color:var(--button-bg);color:var(--button-text);padding:.5em 1em;border:transparent;text-decoration:none;border-radius:.3em;vertical-align:middle;cursor:pointer}button.toggled{opacity:.6}button:focus-visible,.breadcrumb:focus-visible{outline:3px solid var(--focus-color)}input:focus-visible,select:focus-visible,ul a:focus-visible{border-radius:.3em;border-color:transparent;outline:2px solid var(--focus-color)}.error-msg{background-color:#faa;color:#833}header{position:sticky;top:0;background:var(--bg);padding:.2em;z-index:1}.ani-working{animation:1s blink infinite}@keyframes blink{0%{opacity:1}50%{opacity:.2}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.spinner,.icon.spinner:before{animation:1.5s spin infinite linear}.icon.emoji.spinner{display:inline-block}.breadcrumb{padding:.1em .6em .2em;line-height:1.8em;border-radius:.7em;background-color:var(--button-bg);color:var(--button-text);border-top:1px solid #666;margin-right:-.1em}.breadcrumb:nth-child(-n+3) .icon{padding:0 .2em}#folder-stats{font-size:90%;margin:.4em 0 0 .5em;float:right}#folder-stats .icon{margin-right:.3em}header input{width:100%;margin:.2em auto;box-sizing:border-box}#filter-bar{display:flex;gap:.3em;margin:.5em 0}#filter-bar input{flex:1}#filter-bar button{padding:0 .5em}ul.dir{flex:1;padding:0;margin:0;clear:both}ul.dir li{display:block;list-style-type:none;margin-bottom:.3em;padding:.3em;border-top:1px solid var(--button-bg)}ul.dir li a{word-break:break-word;padding-right:.3em}ul.dir li a .icon{margin-right:.3em}ul.dir li a.container-folder:hover{text-decoration:underline}ul.dir li .entry-props{float:right;font-size:90%;margin-left:12px;margin-top:.2em}ul.dir li .entry-props .icon{margin:0 .3em}ul.dir li .entry-props .entry-size{display:inline-block}#menu-panel{margin-bottom:.2em}#menu-bar{display:flex;justify-content:space-evenly;flex-wrap:wrap}#menu-bar>*{flex:auto;margin:.1em}#menu-bar button{padding-left:0;padding-right:0}#menu-bar>a>button{width:100%}#searched{margin:.2em}#user-panel{display:flex;flex-direction:column;gap:1em}#user-panel a>button{width:100%}button label{cursor:inherit;margin-left:.5em}.dialog-backdrop.working{font-size:5em;animation:1s fade-in}.dialog-content{padding:.2em}.dialog-confirm,.dialog-prompt{--color: var(--button-bg)}#paging{display:flex;position:sticky;bottom:0;background:var(--bg);gap:.5em;overflow-x:auto}#paging>button{flex:1;background:var(--button-bg);text-align:center}*{scrollbar-width:thin;scrollbar-color:var(--button-bg) var(--faint-contrast)}*::-webkit-scrollbar{width:12px}*::-webkit-scrollbar-track{background:var(--faint-contrast)}*::-webkit-scrollbar-thumb{background-color:var(--button-bg);border-radius:20px;border:1px solid var(--faint-contrast)}@media (max-width: 42em){body,button,select{font-size:14pt}#menu-bar button label{display:none}#filter-bar{margin:.2em 0}#filter-bar label{display:none}#filter-bar button{width:17.6vw;height:2.3em}.breadcrumb{word-break:break-all}.breadcrumb .icon{font-size:24px}}.dialog-backdrop{position:fixed;inset:0;background:#888a;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog{background:#fff;background:var(--bg);padding:max(.5em,1vw);border-radius:1em;position:relative;margin:0 3vw;overflow:hidden;max-height:calc(100vh - 2em)}.dialog-icon{color:#fff;background-color:var(--color);position:absolute;top:0;width:1.8em;height:1.7em;text-align:center;border-radius:.8em 0}.dialog-closer{border-radius:0 .8em;right:0;padding:0;background-color:#c99}.dialog-icon~.dialog-content{margin-top:1.3em}.dialog-type{left:0;top:0;overflow:hidden;line-height:1.7em}.dialog-content{overflow:auto;max-height:calc(100vh - 4em)}.dialog-content p{white-space:pre-wrap;margin:.5em 0}.dialog-confirm .dialog-content button{margin-top:1em}.dialog-alert-info{--color: #282 }.dialog-alert-warning{--color: #c91 }.dialog-alert-error{--color: #822}@media (max-width: 50em){.dialog-closer{font-size:120%}.dialog-icon~.dialog-content{margin-top:2em}}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{c as SF}from"./index.0f8e459c.js";function OF(sF,hF){for(var eF=0;eF<hF.length;eF++){const tF=hF[eF];if(typeof tF!="string"&&!Array.isArray(tF)){for(const w in tF)if(w!=="default"&&!(w in sF)){const lF=Object.getOwnPropertyDescriptor(tF,w);lF&&Object.defineProperty(sF,w,lF.get?lF:{enumerable:!0,get:()=>tF[w]})}}}return Object.freeze(Object.defineProperty(sF,Symbol.toStringTag,{value:"Module"}))}var yF={exports:{}};/*
|
|
2
|
+
* [js-sha512]{@link https://github.com/emn178/js-sha512}
|
|
3
|
+
*
|
|
4
|
+
* @version 0.8.0
|
|
5
|
+
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
|
6
|
+
* @copyright Chen, Yi-Cyuan 2014-2018
|
|
7
|
+
* @license MIT
|
|
8
|
+
*/(function(sF){(function(){var hF="input is invalid type",eF="finalize already called",tF=typeof window=="object",w=tF?window:{};w.JS_SHA512_NO_WINDOW&&(tF=!1);var lF=!tF&&typeof self=="object",_F=!w.JS_SHA512_NO_NODE_JS&&typeof process=="object"&&process.versions&&process.versions.node;_F?w=SF:lF&&(w=self);var bF=!w.JS_SHA512_NO_COMMON_JS&&!0&&sF.exports,aF=!w.JS_SHA512_NO_ARRAY_BUFFER&&typeof ArrayBuffer!="undefined",F="0123456789abcdef".split(""),wF=[-2147483648,8388608,32768,128],xF=[24,16,8,0],iF=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],fF=["hex","array","digest","arrayBuffer"],C=[];(w.JS_SHA512_NO_NODE_JS||!Array.isArray)&&(Array.isArray=function(x){return Object.prototype.toString.call(x)==="[object Array]"}),aF&&(w.JS_SHA512_NO_ARRAY_BUFFER_IS_VIEW||!ArrayBuffer.isView)&&(ArrayBuffer.isView=function(x){return typeof x=="object"&&x.buffer&&x.buffer.constructor===ArrayBuffer});var vF=function(x,r){return function(e){return new v(r,!0).update(e)[x]()}},nF=function(x){var r=vF("hex",x);r.create=function(){return new v(x)},r.update=function(B){return r.create().update(B)};for(var e=0;e<fF.length;++e){var o=fF[e];r[o]=vF(o,x)}return r},dF=function(x,r){return function(e,o){return new rF(e,r,!0).update(o)[x]()}},oF=function(x){var r=dF("hex",x);r.create=function(B){return new rF(B,x)},r.update=function(B,l){return r.create(B).update(l)};for(var e=0;e<fF.length;++e){var o=fF[e];r[o]=dF(o,x)}return r};function v(x,r){r?(C[0]=C[1]=C[2]=C[3]=C[4]=C[5]=C[6]=C[7]=C[8]=C[9]=C[10]=C[11]=C[12]=C[13]=C[14]=C[15]=C[16]=C[17]=C[18]=C[19]=C[20]=C[21]=C[22]=C[23]=C[24]=C[25]=C[26]=C[27]=C[28]=C[29]=C[30]=C[31]=C[32]=0,this.blocks=C):this.blocks=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],x==384?(this.h0h=3418070365,this.h0l=3238371032,this.h1h=1654270250,this.h1l=914150663,this.h2h=2438529370,this.h2l=812702999,this.h3h=355462360,this.h3l=4144912697,this.h4h=1731405415,this.h4l=4290775857,this.h5h=2394180231,this.h5l=1750603025,this.h6h=3675008525,this.h6l=1694076839,this.h7h=1203062813,this.h7l=3204075428):x==256?(this.h0h=573645204,this.h0l=4230739756,this.h1h=2673172387,this.h1l=3360449730,this.h2h=596883563,this.h2l=1867755857,this.h3h=2520282905,this.h3l=1497426621,this.h4h=2519219938,this.h4l=2827943907,this.h5h=3193839141,this.h5l=1401305490,this.h6h=721525244,this.h6l=746961066,this.h7h=246885852,this.h7l=2177182882):x==224?(this.h0h=2352822216,this.h0l=424955298,this.h1h=1944164710,this.h1l=2312950998,this.h2h=502970286,this.h2l=855612546,this.h3h=1738396948,this.h3l=1479516111,this.h4h=258812777,this.h4l=2077511080,this.h5h=2011393907,this.h5l=79989058,this.h6h=1067287976,this.h6l=1780299464,this.h7h=286451373,this.h7l=2446758561):(this.h0h=1779033703,this.h0l=4089235720,this.h1h=3144134277,this.h1l=2227873595,this.h2h=1013904242,this.h2l=4271175723,this.h3h=2773480762,this.h3l=1595750129,this.h4h=1359893119,this.h4l=2917565137,this.h5h=2600822924,this.h5l=725511199,this.h6h=528734635,this.h6l=4215389547,this.h7h=1541459225,this.h7l=327033209),this.bits=x,this.block=this.start=this.bytes=this.hBytes=0,this.finalized=this.hashed=!1}v.prototype.update=function(x){if(this.finalized)throw new Error(eF);var r,e=typeof x;if(e!=="string"){if(e==="object"){if(x===null)throw new Error(hF);if(aF&&x.constructor===ArrayBuffer)x=new Uint8Array(x);else if(!Array.isArray(x)&&(!aF||!ArrayBuffer.isView(x)))throw new Error(hF)}else throw new Error(hF);r=!0}for(var o,B=0,l,c=x.length,s=this.blocks;B<c;){if(this.hashed&&(this.hashed=!1,s[0]=this.block,s[1]=s[2]=s[3]=s[4]=s[5]=s[6]=s[7]=s[8]=s[9]=s[10]=s[11]=s[12]=s[13]=s[14]=s[15]=s[16]=s[17]=s[18]=s[19]=s[20]=s[21]=s[22]=s[23]=s[24]=s[25]=s[26]=s[27]=s[28]=s[29]=s[30]=s[31]=s[32]=0),r)for(l=this.start;B<c&&l<128;++B)s[l>>2]|=x[B]<<xF[l++&3];else for(l=this.start;B<c&&l<128;++B)o=x.charCodeAt(B),o<128?s[l>>2]|=o<<xF[l++&3]:o<2048?(s[l>>2]|=(192|o>>6)<<xF[l++&3],s[l>>2]|=(128|o&63)<<xF[l++&3]):o<55296||o>=57344?(s[l>>2]|=(224|o>>12)<<xF[l++&3],s[l>>2]|=(128|o>>6&63)<<xF[l++&3],s[l>>2]|=(128|o&63)<<xF[l++&3]):(o=65536+((o&1023)<<10|x.charCodeAt(++B)&1023),s[l>>2]|=(240|o>>18)<<xF[l++&3],s[l>>2]|=(128|o>>12&63)<<xF[l++&3],s[l>>2]|=(128|o>>6&63)<<xF[l++&3],s[l>>2]|=(128|o&63)<<xF[l++&3]);this.lastByteIndex=l,this.bytes+=l-this.start,l>=128?(this.block=s[32],this.start=l-128,this.hash(),this.hashed=!0):this.start=l}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this},v.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var x=this.blocks,r=this.lastByteIndex;x[32]=this.block,x[r>>2]|=wF[r&3],this.block=x[32],r>=112&&(this.hashed||this.hash(),x[0]=this.block,x[1]=x[2]=x[3]=x[4]=x[5]=x[6]=x[7]=x[8]=x[9]=x[10]=x[11]=x[12]=x[13]=x[14]=x[15]=x[16]=x[17]=x[18]=x[19]=x[20]=x[21]=x[22]=x[23]=x[24]=x[25]=x[26]=x[27]=x[28]=x[29]=x[30]=x[31]=x[32]=0),x[30]=this.hBytes<<3|this.bytes>>>29,x[31]=this.bytes<<3,this.hash()}},v.prototype.hash=function(){var x=this.h0h,r=this.h0l,e=this.h1h,o=this.h1l,B=this.h2h,l=this.h2l,c=this.h3h,s=this.h3l,E=this.h4h,D=this.h4l,d=this.h5h,_=this.h5l,b=this.h6h,S=this.h6l,O=this.h7h,U=this.h7l,y=this.blocks,A,z,P,H,I,h,t,i,a,EF,CF,cF,DF,uF,pF,AF,BF,Z,q,f,n,u,p,Q,FF;for(A=32;A<160;A+=2)f=y[A-30],n=y[A-29],z=(f>>>1|n<<31)^(f>>>8|n<<24)^f>>>7,P=(n>>>1|f<<31)^(n>>>8|f<<24)^(n>>>7|f<<25),f=y[A-4],n=y[A-3],H=(f>>>19|n<<13)^(n>>>29|f<<3)^f>>>6,I=(n>>>19|f<<13)^(f>>>29|n<<3)^(n>>>6|f<<26),f=y[A-32],n=y[A-31],u=y[A-14],p=y[A-13],h=(p&65535)+(n&65535)+(P&65535)+(I&65535),t=(p>>>16)+(n>>>16)+(P>>>16)+(I>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(z&65535)+(H&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(z>>>16)+(H>>>16)+(i>>>16),y[A]=a<<16|i&65535,y[A+1]=t<<16|h&65535;var J=x,M=r,g=e,R=o,j=B,N=l,T=c,K=s,m=E,V=D,W=d,k=_,Y=b,X=S,$=O,G=U;for(AF=g&j,BF=R&N,A=0;A<160;A+=8)z=(J>>>28|M<<4)^(M>>>2|J<<30)^(M>>>7|J<<25),P=(M>>>28|J<<4)^(J>>>2|M<<30)^(J>>>7|M<<25),H=(m>>>14|V<<18)^(m>>>18|V<<14)^(V>>>9|m<<23),I=(V>>>14|m<<18)^(V>>>18|m<<14)^(m>>>9|V<<23),EF=J&g,CF=M&R,Z=EF^J&j^AF,q=CF^M&N^BF,Q=m&W^~m&Y,FF=V&k^~V&X,f=y[A],n=y[A+1],u=iF[A],p=iF[A+1],h=(p&65535)+(n&65535)+(FF&65535)+(I&65535)+(G&65535),t=(p>>>16)+(n>>>16)+(FF>>>16)+(I>>>16)+(G>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(Q&65535)+(H&65535)+($&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(Q>>>16)+(H>>>16)+($>>>16)+(i>>>16),f=a<<16|i&65535,n=t<<16|h&65535,h=(q&65535)+(P&65535),t=(q>>>16)+(P>>>16)+(h>>>16),i=(Z&65535)+(z&65535)+(t>>>16),a=(Z>>>16)+(z>>>16)+(i>>>16),u=a<<16|i&65535,p=t<<16|h&65535,h=(K&65535)+(n&65535),t=(K>>>16)+(n>>>16)+(h>>>16),i=(T&65535)+(f&65535)+(t>>>16),a=(T>>>16)+(f>>>16)+(i>>>16),$=a<<16|i&65535,G=t<<16|h&65535,h=(p&65535)+(n&65535),t=(p>>>16)+(n>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(i>>>16),T=a<<16|i&65535,K=t<<16|h&65535,z=(T>>>28|K<<4)^(K>>>2|T<<30)^(K>>>7|T<<25),P=(K>>>28|T<<4)^(T>>>2|K<<30)^(T>>>7|K<<25),H=($>>>14|G<<18)^($>>>18|G<<14)^(G>>>9|$<<23),I=(G>>>14|$<<18)^(G>>>18|$<<14)^($>>>9|G<<23),cF=T&J,DF=K&M,Z=cF^T&g^EF,q=DF^K&R^CF,Q=$&m^~$&W,FF=G&V^~G&k,f=y[A+2],n=y[A+3],u=iF[A+2],p=iF[A+3],h=(p&65535)+(n&65535)+(FF&65535)+(I&65535)+(X&65535),t=(p>>>16)+(n>>>16)+(FF>>>16)+(I>>>16)+(X>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(Q&65535)+(H&65535)+(Y&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(Q>>>16)+(H>>>16)+(Y>>>16)+(i>>>16),f=a<<16|i&65535,n=t<<16|h&65535,h=(q&65535)+(P&65535),t=(q>>>16)+(P>>>16)+(h>>>16),i=(Z&65535)+(z&65535)+(t>>>16),a=(Z>>>16)+(z>>>16)+(i>>>16),u=a<<16|i&65535,p=t<<16|h&65535,h=(N&65535)+(n&65535),t=(N>>>16)+(n>>>16)+(h>>>16),i=(j&65535)+(f&65535)+(t>>>16),a=(j>>>16)+(f>>>16)+(i>>>16),Y=a<<16|i&65535,X=t<<16|h&65535,h=(p&65535)+(n&65535),t=(p>>>16)+(n>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(i>>>16),j=a<<16|i&65535,N=t<<16|h&65535,z=(j>>>28|N<<4)^(N>>>2|j<<30)^(N>>>7|j<<25),P=(N>>>28|j<<4)^(j>>>2|N<<30)^(j>>>7|N<<25),H=(Y>>>14|X<<18)^(Y>>>18|X<<14)^(X>>>9|Y<<23),I=(X>>>14|Y<<18)^(X>>>18|Y<<14)^(Y>>>9|X<<23),uF=j&T,pF=N&K,Z=uF^j&J^cF,q=pF^N&M^DF,Q=Y&$^~Y&m,FF=X&G^~X&V,f=y[A+4],n=y[A+5],u=iF[A+4],p=iF[A+5],h=(p&65535)+(n&65535)+(FF&65535)+(I&65535)+(k&65535),t=(p>>>16)+(n>>>16)+(FF>>>16)+(I>>>16)+(k>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(Q&65535)+(H&65535)+(W&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(Q>>>16)+(H>>>16)+(W>>>16)+(i>>>16),f=a<<16|i&65535,n=t<<16|h&65535,h=(q&65535)+(P&65535),t=(q>>>16)+(P>>>16)+(h>>>16),i=(Z&65535)+(z&65535)+(t>>>16),a=(Z>>>16)+(z>>>16)+(i>>>16),u=a<<16|i&65535,p=t<<16|h&65535,h=(R&65535)+(n&65535),t=(R>>>16)+(n>>>16)+(h>>>16),i=(g&65535)+(f&65535)+(t>>>16),a=(g>>>16)+(f>>>16)+(i>>>16),W=a<<16|i&65535,k=t<<16|h&65535,h=(p&65535)+(n&65535),t=(p>>>16)+(n>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(i>>>16),g=a<<16|i&65535,R=t<<16|h&65535,z=(g>>>28|R<<4)^(R>>>2|g<<30)^(R>>>7|g<<25),P=(R>>>28|g<<4)^(g>>>2|R<<30)^(g>>>7|R<<25),H=(W>>>14|k<<18)^(W>>>18|k<<14)^(k>>>9|W<<23),I=(k>>>14|W<<18)^(k>>>18|W<<14)^(W>>>9|k<<23),AF=g&j,BF=R&N,Z=AF^g&T^uF,q=BF^R&K^pF,Q=W&Y^~W&$,FF=k&X^~k&G,f=y[A+6],n=y[A+7],u=iF[A+6],p=iF[A+7],h=(p&65535)+(n&65535)+(FF&65535)+(I&65535)+(V&65535),t=(p>>>16)+(n>>>16)+(FF>>>16)+(I>>>16)+(V>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(Q&65535)+(H&65535)+(m&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(Q>>>16)+(H>>>16)+(m>>>16)+(i>>>16),f=a<<16|i&65535,n=t<<16|h&65535,h=(q&65535)+(P&65535),t=(q>>>16)+(P>>>16)+(h>>>16),i=(Z&65535)+(z&65535)+(t>>>16),a=(Z>>>16)+(z>>>16)+(i>>>16),u=a<<16|i&65535,p=t<<16|h&65535,h=(M&65535)+(n&65535),t=(M>>>16)+(n>>>16)+(h>>>16),i=(J&65535)+(f&65535)+(t>>>16),a=(J>>>16)+(f>>>16)+(i>>>16),m=a<<16|i&65535,V=t<<16|h&65535,h=(p&65535)+(n&65535),t=(p>>>16)+(n>>>16)+(h>>>16),i=(u&65535)+(f&65535)+(t>>>16),a=(u>>>16)+(f>>>16)+(i>>>16),J=a<<16|i&65535,M=t<<16|h&65535;h=(r&65535)+(M&65535),t=(r>>>16)+(M>>>16)+(h>>>16),i=(x&65535)+(J&65535)+(t>>>16),a=(x>>>16)+(J>>>16)+(i>>>16),this.h0h=a<<16|i&65535,this.h0l=t<<16|h&65535,h=(o&65535)+(R&65535),t=(o>>>16)+(R>>>16)+(h>>>16),i=(e&65535)+(g&65535)+(t>>>16),a=(e>>>16)+(g>>>16)+(i>>>16),this.h1h=a<<16|i&65535,this.h1l=t<<16|h&65535,h=(l&65535)+(N&65535),t=(l>>>16)+(N>>>16)+(h>>>16),i=(B&65535)+(j&65535)+(t>>>16),a=(B>>>16)+(j>>>16)+(i>>>16),this.h2h=a<<16|i&65535,this.h2l=t<<16|h&65535,h=(s&65535)+(K&65535),t=(s>>>16)+(K>>>16)+(h>>>16),i=(c&65535)+(T&65535)+(t>>>16),a=(c>>>16)+(T>>>16)+(i>>>16),this.h3h=a<<16|i&65535,this.h3l=t<<16|h&65535,h=(D&65535)+(V&65535),t=(D>>>16)+(V>>>16)+(h>>>16),i=(E&65535)+(m&65535)+(t>>>16),a=(E>>>16)+(m>>>16)+(i>>>16),this.h4h=a<<16|i&65535,this.h4l=t<<16|h&65535,h=(_&65535)+(k&65535),t=(_>>>16)+(k>>>16)+(h>>>16),i=(d&65535)+(W&65535)+(t>>>16),a=(d>>>16)+(W>>>16)+(i>>>16),this.h5h=a<<16|i&65535,this.h5l=t<<16|h&65535,h=(S&65535)+(X&65535),t=(S>>>16)+(X>>>16)+(h>>>16),i=(b&65535)+(Y&65535)+(t>>>16),a=(b>>>16)+(Y>>>16)+(i>>>16),this.h6h=a<<16|i&65535,this.h6l=t<<16|h&65535,h=(U&65535)+(G&65535),t=(U>>>16)+(G>>>16)+(h>>>16),i=(O&65535)+($&65535)+(t>>>16),a=(O>>>16)+($>>>16)+(i>>>16),this.h7h=a<<16|i&65535,this.h7l=t<<16|h&65535},v.prototype.hex=function(){this.finalize();var x=this.h0h,r=this.h0l,e=this.h1h,o=this.h1l,B=this.h2h,l=this.h2l,c=this.h3h,s=this.h3l,E=this.h4h,D=this.h4l,d=this.h5h,_=this.h5l,b=this.h6h,S=this.h6l,O=this.h7h,U=this.h7l,y=this.bits,A=F[x>>28&15]+F[x>>24&15]+F[x>>20&15]+F[x>>16&15]+F[x>>12&15]+F[x>>8&15]+F[x>>4&15]+F[x&15]+F[r>>28&15]+F[r>>24&15]+F[r>>20&15]+F[r>>16&15]+F[r>>12&15]+F[r>>8&15]+F[r>>4&15]+F[r&15]+F[e>>28&15]+F[e>>24&15]+F[e>>20&15]+F[e>>16&15]+F[e>>12&15]+F[e>>8&15]+F[e>>4&15]+F[e&15]+F[o>>28&15]+F[o>>24&15]+F[o>>20&15]+F[o>>16&15]+F[o>>12&15]+F[o>>8&15]+F[o>>4&15]+F[o&15]+F[B>>28&15]+F[B>>24&15]+F[B>>20&15]+F[B>>16&15]+F[B>>12&15]+F[B>>8&15]+F[B>>4&15]+F[B&15]+F[l>>28&15]+F[l>>24&15]+F[l>>20&15]+F[l>>16&15]+F[l>>12&15]+F[l>>8&15]+F[l>>4&15]+F[l&15]+F[c>>28&15]+F[c>>24&15]+F[c>>20&15]+F[c>>16&15]+F[c>>12&15]+F[c>>8&15]+F[c>>4&15]+F[c&15];return y>=256&&(A+=F[s>>28&15]+F[s>>24&15]+F[s>>20&15]+F[s>>16&15]+F[s>>12&15]+F[s>>8&15]+F[s>>4&15]+F[s&15]),y>=384&&(A+=F[E>>28&15]+F[E>>24&15]+F[E>>20&15]+F[E>>16&15]+F[E>>12&15]+F[E>>8&15]+F[E>>4&15]+F[E&15]+F[D>>28&15]+F[D>>24&15]+F[D>>20&15]+F[D>>16&15]+F[D>>12&15]+F[D>>8&15]+F[D>>4&15]+F[D&15]+F[d>>28&15]+F[d>>24&15]+F[d>>20&15]+F[d>>16&15]+F[d>>12&15]+F[d>>8&15]+F[d>>4&15]+F[d&15]+F[_>>28&15]+F[_>>24&15]+F[_>>20&15]+F[_>>16&15]+F[_>>12&15]+F[_>>8&15]+F[_>>4&15]+F[_&15]),y==512&&(A+=F[b>>28&15]+F[b>>24&15]+F[b>>20&15]+F[b>>16&15]+F[b>>12&15]+F[b>>8&15]+F[b>>4&15]+F[b&15]+F[S>>28&15]+F[S>>24&15]+F[S>>20&15]+F[S>>16&15]+F[S>>12&15]+F[S>>8&15]+F[S>>4&15]+F[S&15]+F[O>>28&15]+F[O>>24&15]+F[O>>20&15]+F[O>>16&15]+F[O>>12&15]+F[O>>8&15]+F[O>>4&15]+F[O&15]+F[U>>28&15]+F[U>>24&15]+F[U>>20&15]+F[U>>16&15]+F[U>>12&15]+F[U>>8&15]+F[U>>4&15]+F[U&15]),A},v.prototype.toString=v.prototype.hex,v.prototype.digest=function(){this.finalize();var x=this.h0h,r=this.h0l,e=this.h1h,o=this.h1l,B=this.h2h,l=this.h2l,c=this.h3h,s=this.h3l,E=this.h4h,D=this.h4l,d=this.h5h,_=this.h5l,b=this.h6h,S=this.h6l,O=this.h7h,U=this.h7l,y=this.bits,A=[x>>24&255,x>>16&255,x>>8&255,x&255,r>>24&255,r>>16&255,r>>8&255,r&255,e>>24&255,e>>16&255,e>>8&255,e&255,o>>24&255,o>>16&255,o>>8&255,o&255,B>>24&255,B>>16&255,B>>8&255,B&255,l>>24&255,l>>16&255,l>>8&255,l&255,c>>24&255,c>>16&255,c>>8&255,c&255];return y>=256&&A.push(s>>24&255,s>>16&255,s>>8&255,s&255),y>=384&&A.push(E>>24&255,E>>16&255,E>>8&255,E&255,D>>24&255,D>>16&255,D>>8&255,D&255,d>>24&255,d>>16&255,d>>8&255,d&255,_>>24&255,_>>16&255,_>>8&255,_&255),y==512&&A.push(b>>24&255,b>>16&255,b>>8&255,b&255,S>>24&255,S>>16&255,S>>8&255,S&255,O>>24&255,O>>16&255,O>>8&255,O&255,U>>24&255,U>>16&255,U>>8&255,U&255),A},v.prototype.array=v.prototype.digest,v.prototype.arrayBuffer=function(){this.finalize();var x=this.bits,r=new ArrayBuffer(x/8),e=new DataView(r);return e.setUint32(0,this.h0h),e.setUint32(4,this.h0l),e.setUint32(8,this.h1h),e.setUint32(12,this.h1l),e.setUint32(16,this.h2h),e.setUint32(20,this.h2l),e.setUint32(24,this.h3h),x>=256&&e.setUint32(28,this.h3l),x>=384&&(e.setUint32(32,this.h4h),e.setUint32(36,this.h4l),e.setUint32(40,this.h5h),e.setUint32(44,this.h5l)),x==512&&(e.setUint32(48,this.h6h),e.setUint32(52,this.h6l),e.setUint32(56,this.h7h),e.setUint32(60,this.h7l)),r},v.prototype.clone=function(){var x=new v(this.bits,!1);return this.copyTo(x),x},v.prototype.copyTo=function(x){var r=0,e=["h0h","h0l","h1h","h1l","h2h","h2l","h3h","h3l","h4h","h4l","h5h","h5l","h6h","h6l","h7h","h7l","start","bytes","hBytes","finalized","hashed","lastByteIndex"];for(r=0;r<e.length;++r)x[e[r]]=this[e[r]];for(r=0;r<this.blocks.length;++r)x.blocks[r]=this.blocks[r]};function rF(x,r,e){var o,B=typeof x;if(B!=="string"){if(B==="object"){if(x===null)throw new Error(hF);if(aF&&x.constructor===ArrayBuffer)x=new Uint8Array(x);else if(!Array.isArray(x)&&(!aF||!ArrayBuffer.isView(x)))throw new Error(hF)}else throw new Error(hF);o=!0}var l=x.length;if(!o){for(var c=[],l=x.length,s=0,E,D=0;D<l;++D)E=x.charCodeAt(D),E<128?c[s++]=E:E<2048?(c[s++]=192|E>>6,c[s++]=128|E&63):E<55296||E>=57344?(c[s++]=224|E>>12,c[s++]=128|E>>6&63,c[s++]=128|E&63):(E=65536+((E&1023)<<10|x.charCodeAt(++D)&1023),c[s++]=240|E>>18,c[s++]=128|E>>12&63,c[s++]=128|E>>6&63,c[s++]=128|E&63);x=c}x.length>128&&(x=new v(r,!0).update(x).array());for(var d=[],_=[],D=0;D<128;++D){var b=x[D]||0;d[D]=92^b,_[D]=54^b}v.call(this,r,e),this.update(_),this.oKeyPad=d,this.inner=!0,this.sharedMemory=e}rF.prototype=new v,rF.prototype.finalize=function(){if(v.prototype.finalize.call(this),this.inner){this.inner=!1;var x=this.array();v.call(this,this.bits,this.sharedMemory),this.update(this.oKeyPad),this.update(x),v.prototype.finalize.call(this)}},rF.prototype.clone=function(){var x=new rF([],this.bits,!1);this.copyTo(x),x.inner=this.inner;for(var r=0;r<this.oKeyPad.length;++r)x.oKeyPad[r]=this.oKeyPad[r];return x};var L=nF(512);L.sha512=L,L.sha384=nF(384),L.sha512_256=nF(256),L.sha512_224=nF(224),L.sha512.hmac=oF(512),L.sha384.hmac=oF(384),L.sha512_256.hmac=oF(256),L.sha512_224.hmac=oF(224),bF?sF.exports=L:(w.sha512=L.sha512,w.sha384=L.sha384,w.sha512_256=L.sha512_256,w.sha512_224=L.sha512_224)})()})(yF);const UF=yF.exports,RF=OF({__proto__:null,default:UF},[yF.exports]);export{RF as s};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: 'fontello';
|
|
3
|
+
src: url('fontello.woff2?13171865') format('woff2');
|
|
4
|
+
font-weight: normal;
|
|
5
|
+
font-style: normal;
|
|
6
|
+
}
|
|
7
|
+
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
|
|
8
|
+
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
|
|
9
|
+
/*
|
|
10
|
+
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
|
11
|
+
@font-face {
|
|
12
|
+
font-family: 'fontello';
|
|
13
|
+
src: url('../font/fontello.svg?13171865#fontello') format('svg');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
*/
|
|
17
|
+
[class^="fa-"]:before, [class*=" fa-"]:before {
|
|
18
|
+
font-family: "fontello";
|
|
19
|
+
font-style: normal;
|
|
20
|
+
font-weight: normal;
|
|
21
|
+
speak: never;
|
|
22
|
+
|
|
23
|
+
display: inline-block;
|
|
24
|
+
text-decoration: inherit;
|
|
25
|
+
width: 1em;
|
|
26
|
+
margin-right: .2em;
|
|
27
|
+
text-align: center;
|
|
28
|
+
/* opacity: .8; */
|
|
29
|
+
|
|
30
|
+
/* For safety - reset parent styles, that can break glyph codes*/
|
|
31
|
+
font-variant: normal;
|
|
32
|
+
text-transform: none;
|
|
33
|
+
|
|
34
|
+
/* fix buttons height, for twitter bootstrap */
|
|
35
|
+
line-height: 1em;
|
|
36
|
+
|
|
37
|
+
/* Animation center compensation - margins should be symmetric */
|
|
38
|
+
/* remove if not needed */
|
|
39
|
+
margin-left: .2em;
|
|
40
|
+
|
|
41
|
+
/* you can be more comfortable with increased icons size */
|
|
42
|
+
/* font-size: 120%; */
|
|
43
|
+
|
|
44
|
+
/* Font smoothing. That was taken from TWBS */
|
|
45
|
+
-webkit-font-smoothing: antialiased;
|
|
46
|
+
-moz-osx-font-smoothing: grayscale;
|
|
47
|
+
|
|
48
|
+
/* Uncomment for 3D effect */
|
|
49
|
+
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.fa-cog:before { content: '\e800'; } /* '' */
|
|
53
|
+
.fa-check-circled:before { content: '\e801'; } /* '' */
|
|
54
|
+
.fa-doc:before { content: '\e802'; } /* '' */
|
|
55
|
+
.fa-stop:before { content: '\e803'; } /* '' */
|
|
56
|
+
.fa-download:before { content: '\e804'; } /* '' */
|
|
57
|
+
.fa-upload:before { content: '\e805'; } /* '' */
|
|
58
|
+
.fa-cancel:before { content: '\e806'; } /* '' */
|
|
59
|
+
.fa-edit:before { content: '\e807'; } /* '' */
|
|
60
|
+
.fa-check:before { content: '\e808'; } /* '' */
|
|
61
|
+
.fa-folder:before { content: '\e809'; } /* '' */
|
|
62
|
+
.fa-user:before { content: '\e80a'; } /* '' */
|
|
63
|
+
.fa-home:before { content: '\e80b'; } /* '' */
|
|
64
|
+
.fa-key:before { content: '\e80c'; } /* '' */
|
|
65
|
+
.fa-retweet:before { content: '\e80f'; } /* '' */
|
|
66
|
+
.fa-cancel-circled:before { content: '\e811'; } /* '' */
|
|
67
|
+
.fa-search:before { content: '\e813'; } /* '' */
|
|
68
|
+
.fa-logout:before { content: '\e814'; } /* '' */
|
|
69
|
+
.fa-spin6:before { content: '\e839'; } /* '' */
|
|
70
|
+
.fa-crown:before { content: '\e844'; } /* '' */
|
|
71
|
+
.fa-filter:before { content: '\f0b0'; } /* '' */
|
|
72
|
+
.fa-menu:before { content: '\f0c9'; } /* '' */
|
|
73
|
+
.fa-quote-left:before { content: '\f10d'; } /* '' */
|
|
74
|
+
.fa-unlink:before { content: '\f127'; } /* '' */
|
|
75
|
+
.fa-level-up:before { content: '\f148'; } /* '' */
|
|
76
|
+
.fa-file-archive:before { content: '\f1c6'; } /* '' */
|
|
77
|
+
.fa-trash:before { content: '\f1f8'; } /* '' */
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=0" />
|
|
6
|
+
<link href="fontello.css" rel="stylesheet" />
|
|
7
|
+
<script>SESSION = _HFS_SESSION_</script>
|
|
8
|
+
<title>File Server</title>
|
|
9
|
+
<script type="module" crossorigin src="/assets/index.0f8e459c.js"></script>
|
|
10
|
+
<link rel="stylesheet" href="/assets/index.ee805a6c.css">
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<div hidden>_HFS_PLUGINS_</div>
|
|
14
|
+
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
15
|
+
|
|
16
|
+
<div id="root"></div>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,44 +1,107 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hfs",
|
|
3
|
+
"version": "0.26.1",
|
|
3
4
|
"description": "HTTP File Server",
|
|
4
5
|
"keywords": [
|
|
5
6
|
"file server",
|
|
6
7
|
"http server"
|
|
7
8
|
],
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"author": "Massimo Melina <a@rejetto.com>
|
|
9
|
+
"homepage": "https://rejetto.com/hfs",
|
|
10
|
+
"license": "GPL-3.0",
|
|
11
|
+
"author": "Massimo Melina <a@rejetto.com>",
|
|
12
|
+
"workspaces": [ "admin", "frontend", "shared", "mui-grid-form" ],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"watch-server": "cross-env DEV=1 nodemon --ignore tests/ --watch src -e ts,tsx --exec ts-node src",
|
|
15
|
+
"watch-server-proxied": "cross-env FRONTEND_PROXY=3005 ADMIN_PROXY=3006 npm run watch-server",
|
|
16
|
+
"watch-shared": "cd shared && tsc --watch",
|
|
17
|
+
"watch-form": "cd mui-grid-form && tsc --watch",
|
|
18
|
+
"start-frontend": "npm run start --workspace=frontend",
|
|
19
|
+
"start-admin": "npm run start --workspace=admin",
|
|
20
|
+
"build-all": "npm audit --omit=dev && rm -rf dist && npm i && npm run build-shared && npm run build-server && npm run build-form && npm run build-frontend && npm run build-admin && echo COMPLETED",
|
|
21
|
+
"build-server": "rm -rf dist/src dist/plugins && tsc --target es2018 && touch package.json && cp -v -r package.json README* LICENSE* plugins dist && find dist -name .DS_Store -delete",
|
|
22
|
+
"build-frontend": "npm run build --workspace=frontend",
|
|
23
|
+
"build-admin": "npm run build --workspace=admin",
|
|
24
|
+
"build-shared": "npm run build --workspace=shared",
|
|
25
|
+
"build-form": "npm run build --workspace=mui-grid-form",
|
|
26
|
+
"server-for-test": "node dist/src --cwd . --config tests",
|
|
27
|
+
"test": "mocha -r ts-node/register 'tests/**/*.ts'",
|
|
28
|
+
"pub": "cd dist && npm publish",
|
|
29
|
+
"dist": "npm run build-all && npm run dist-bin",
|
|
30
|
+
"dist-bin": "npm run dist-modules && cd dist && pkg . -C gzip && mv -f hfs-win.exe hfs.exe && zip hfs-windows.zip hfs.exe -r plugins && cp -f hfs-linux hfs && zip hfs-linux.zip hfs -r plugins && cp -f hfs-macos hfs && zip hfs-mac.zip hfs -r plugins && rm hfs",
|
|
31
|
+
"dist-modules": "cp package*.json dist && cd dist && npm ci --omit=dev && npm i -f --no-save --omit=dev @node-rs/crc32-win32-x64-msvc && rm package-lock.json && cd .. && node prune_modules",
|
|
32
|
+
"dist-win": "npm run dist-modules && pkg . -C gzip -t node16-win && cd dist && zip hfs-windows.zip hfs.exe -r plugins",
|
|
33
|
+
"dist-node": "npm run dist-modules && cd dist && zip hfs-node.zip -r * -x *.zip *.exe hfs-* *.log logs"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=16.13.0"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"README*",
|
|
40
|
+
"LICENSE*",
|
|
41
|
+
"@(src|admin|frontend|plugins)/*"
|
|
42
|
+
],
|
|
11
43
|
"repository": {
|
|
12
44
|
"type": "git",
|
|
13
|
-
"url": "https://github.com/rejetto/hfs"
|
|
45
|
+
"url": "https://github.com/rejetto/hfs/"
|
|
14
46
|
},
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"url": "http://www.rejetto.com/forum/index.php/board,28.0.html"
|
|
47
|
+
"bin": {
|
|
48
|
+
"hfs": "src/index.js"
|
|
18
49
|
},
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
|
|
50
|
+
"pkg": {
|
|
51
|
+
"assets": [
|
|
52
|
+
"admin/**/*",
|
|
53
|
+
"frontend/**/*"
|
|
54
|
+
],
|
|
55
|
+
"targets": [
|
|
56
|
+
"node16-win",
|
|
57
|
+
"node16-mac",
|
|
58
|
+
"node16-linux"
|
|
59
|
+
]
|
|
22
60
|
},
|
|
23
|
-
"main": "./main.js",
|
|
24
61
|
"dependencies": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
62
|
+
"@koa/router": "^10.1.1",
|
|
63
|
+
"@node-rs/crc32": "^1.5.1",
|
|
64
|
+
"basic-auth": "^2.0.1",
|
|
65
|
+
"buffer-crc32": "^0.2.13",
|
|
66
|
+
"cidr-tools": "^4.3.0",
|
|
67
|
+
"fast-glob": "^3.2.7",
|
|
68
|
+
"find-process": "^1.4.7",
|
|
69
|
+
"koa": "^2.13.4",
|
|
70
|
+
"koa-compress": "^5.1.0",
|
|
71
|
+
"koa-mount": "^4.0.0",
|
|
72
|
+
"koa-session": "^6.2.0",
|
|
73
|
+
"limiter": "^2.1.0",
|
|
74
|
+
"lodash": "^4.17.21",
|
|
75
|
+
"minimist": "^1.2.6",
|
|
76
|
+
"open": "^8.4.0",
|
|
77
|
+
"tssrp6a": "^3.0.0",
|
|
78
|
+
"yaml": "^2.0.0-10",
|
|
79
|
+
"unzip-stream": "^0.3.1"
|
|
28
80
|
},
|
|
29
|
-
"bundleDependencies": [
|
|
30
|
-
],
|
|
31
81
|
"devDependencies": {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
82
|
+
"@types/archiver": "^5.1.1",
|
|
83
|
+
"@types/basic-auth": "^1.1.3",
|
|
84
|
+
"@types/koa": "^2.13.4",
|
|
85
|
+
"@types/koa__router": "^8.0.11",
|
|
86
|
+
"@types/koa-compress": "^4.0.3",
|
|
87
|
+
"@types/koa-mount": "^4.0.1",
|
|
88
|
+
"@types/koa-session": "^5.10.4",
|
|
89
|
+
"@types/lodash": "^4.14.178",
|
|
90
|
+
"@types/micromatch": "^4.0.2",
|
|
91
|
+
"@types/mime-types": "^2.1.1",
|
|
92
|
+
"@types/minimist": "^1.2.2",
|
|
93
|
+
"@types/mocha": "^9.0.0",
|
|
94
|
+
"@types/node": "^16.11.12",
|
|
95
|
+
"@types/unzipper": "^0.10.5",
|
|
96
|
+
"axios": "^0.24.0",
|
|
97
|
+
"axios-cookiejar-support": "^4.0.1",
|
|
98
|
+
"tough-cookie": "^4.0.0",
|
|
99
|
+
"@types/tough-cookie": "^4.0.2",
|
|
100
|
+
"koa-better-http-proxy": "^0.2.9",
|
|
101
|
+
"mocha": "^9.1.3",
|
|
102
|
+
"nm-prune": "^5.0.0",
|
|
103
|
+
"nodemon": "^2.0.15",
|
|
104
|
+
"pkg": "^5.7.0",
|
|
105
|
+
"ts-node": "^10.4.0"
|
|
106
|
+
}
|
|
44
107
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
exports.version = 2
|
|
2
|
+
exports.description = "Introduce increasing delays between login attempts."
|
|
3
|
+
exports.apiRequired = 3 // log
|
|
4
|
+
|
|
5
|
+
exports.config = {
|
|
6
|
+
increment: { type: 'number', min: 1, defaultValue: 5, helperText: "Seconds to add to the delay for each login attempt" },
|
|
7
|
+
max: { type: 'number', min: 1, defaultValue: 60, helperText: "Max seconds to delay before next login is allowed" },
|
|
8
|
+
}
|
|
9
|
+
exports.configDialog = {
|
|
10
|
+
maxWidth: 'sm',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const byIp = {}
|
|
14
|
+
|
|
15
|
+
exports.init = api => {
|
|
16
|
+
const LOGIN_URI = api.const.API_URI + 'loginSrp1'
|
|
17
|
+
const { getOrSet } = api.require('./misc')
|
|
18
|
+
return {
|
|
19
|
+
async middleware(ctx) {
|
|
20
|
+
if (ctx.path !== LOGIN_URI) return
|
|
21
|
+
const { ip } = ctx
|
|
22
|
+
const now = Date.now()
|
|
23
|
+
const rec = getOrSet(byIp, ip, () => ({ delay: 0, next: now }))
|
|
24
|
+
const wait = rec.next - now
|
|
25
|
+
const max = api.getConfig('max') * 1000
|
|
26
|
+
const inc = api.getConfig('increment') * 1000
|
|
27
|
+
rec.delay = Math.min(max, rec.delay + inc)
|
|
28
|
+
rec.next += rec.delay
|
|
29
|
+
clearTimeout(rec.timer)
|
|
30
|
+
if (wait > 0) {
|
|
31
|
+
api.log('delaying', ip, 'for', Math.round(wait / 1000))
|
|
32
|
+
ctx.set('x-anti-brute-force', wait)
|
|
33
|
+
await new Promise(resolve => setTimeout(resolve, wait))
|
|
34
|
+
}
|
|
35
|
+
rec.timer = setTimeout(() => delete byIp[ip], rec.delay * 10) // no memory leak
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
exports.description = "Counts downloads for each file, and displays the total in the list"
|
|
2
|
+
exports.version = 2 // comply to new async init/unload
|
|
3
|
+
exports.apiRequired = 3
|
|
4
|
+
|
|
5
|
+
exports.init = async api => {
|
|
6
|
+
const _ = api.require('lodash')
|
|
7
|
+
const yaml = api.require('yaml')
|
|
8
|
+
const { writeFile, readFile } = api.require('fs/promises')
|
|
9
|
+
const { debounceAsync } = api.require('./misc')
|
|
10
|
+
|
|
11
|
+
const countersFile = 'counters.yaml'
|
|
12
|
+
|
|
13
|
+
let counters = {}
|
|
14
|
+
const save = debounceAsync(async () => {
|
|
15
|
+
await writeFile(countersFile, yaml.stringify(counters))
|
|
16
|
+
console.debug('counters saved')
|
|
17
|
+
}, 5_000, { maxWait:30_000 })
|
|
18
|
+
|
|
19
|
+
// load previous stats
|
|
20
|
+
try {
|
|
21
|
+
const data = await readFile(countersFile, 'utf8')
|
|
22
|
+
counters = yaml.parse(data) || {}
|
|
23
|
+
console.debug('counters loaded')
|
|
24
|
+
}
|
|
25
|
+
catch(err) {
|
|
26
|
+
if (err.code !== 'ENOENT')
|
|
27
|
+
console.debug(countersFile, err)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
frontend_js: 'hits.js',
|
|
32
|
+
unload: () => save.flush(), // we may have pending savings
|
|
33
|
+
middleware: (ctx) =>
|
|
34
|
+
() => { // execute after other middlewares are done
|
|
35
|
+
if (ctx.status >= 300 || !ctx.vfsNode) return
|
|
36
|
+
const { path } = ctx
|
|
37
|
+
counters[path] = counters[path] + 1 || 1
|
|
38
|
+
save()
|
|
39
|
+
},
|
|
40
|
+
onDirEntry: ({ entry, listPath }) => {
|
|
41
|
+
const path = listPath + entry.n
|
|
42
|
+
const n = counters[path]
|
|
43
|
+
if (n)
|
|
44
|
+
entry.hits = n
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
this plugin is currently experimental and working only with exe version.
|
|
3
|
+
Its capability is to offer automatic restart when an update is available in the form of hfs.exe-new file.
|
|
4
|
+
*/
|
|
5
|
+
exports.version = 0.1
|
|
6
|
+
exports.description = "automatic restart when an update is available in the form of hfs.exe-new file"
|
|
7
|
+
exports.apiRequired = 3 // api.log
|
|
8
|
+
|
|
9
|
+
const NEW = 'hfs.exe-new'
|
|
10
|
+
const BATCH_NAME = 'run-updater.bat'
|
|
11
|
+
const BATCH = `@echo off
|
|
12
|
+
:loop
|
|
13
|
+
setlocal
|
|
14
|
+
SET hfs_updater=1
|
|
15
|
+
hfs
|
|
16
|
+
endlocal
|
|
17
|
+
if exist hfs.exe-new (
|
|
18
|
+
move /y hfs.exe hfs.exe-old
|
|
19
|
+
move /y ${NEW} hfs.exe
|
|
20
|
+
goto loop
|
|
21
|
+
)
|
|
22
|
+
`
|
|
23
|
+
|
|
24
|
+
exports.init = async api => {
|
|
25
|
+
const fs = api.require('fs')
|
|
26
|
+
fs.writeFile(BATCH_NAME, BATCH, err =>
|
|
27
|
+
err && api.log("couldn't write", BATCH_NAME))
|
|
28
|
+
if (!process.env.hfs_updater)
|
|
29
|
+
return api.log("run", BATCH_NAME, "to have restart-on-update")
|
|
30
|
+
|
|
31
|
+
api.log("ready")
|
|
32
|
+
const timer = setInterval(() => {
|
|
33
|
+
fs.access(NEW, fs.constants.W_OK, err => {
|
|
34
|
+
if (err) return
|
|
35
|
+
api.log("exiting for update")
|
|
36
|
+
process.exit(0)
|
|
37
|
+
})
|
|
38
|
+
}, 5000)
|
|
39
|
+
return {
|
|
40
|
+
unload() {
|
|
41
|
+
clearInterval(timer)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
exports.description = "If you want to have different home folders, based on domain"
|
|
2
|
+
exports.version = 2 // added config.mandatory
|
|
3
|
+
exports.apiRequired = 2 // 2 is for the config 'array'
|
|
4
|
+
|
|
5
|
+
exports.config = {
|
|
6
|
+
hosts: {
|
|
7
|
+
label: '',
|
|
8
|
+
type: 'array',
|
|
9
|
+
fields: {
|
|
10
|
+
host: { label: "Domain" },
|
|
11
|
+
root: { helperText: "Root path in VFS" },
|
|
12
|
+
},
|
|
13
|
+
defaultValue: [],
|
|
14
|
+
height: 300,
|
|
15
|
+
},
|
|
16
|
+
mandatory: {
|
|
17
|
+
label: "Block requests that are not using any of the domains above",
|
|
18
|
+
type: 'boolean',
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
exports.init = api => ({
|
|
23
|
+
middleware(ctx) {
|
|
24
|
+
let toModify = ctx
|
|
25
|
+
if (ctx.path.startsWith(api.const.SPECIAL_URI)) { // special uris should be excluded...
|
|
26
|
+
toModify = ctx.request.query
|
|
27
|
+
if (toModify.path === undefined) // ...unless they carry a path in the query. In that case we'll work that.
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
const hosts = api.getConfig('hosts')
|
|
31
|
+
if (!hosts?.length) return
|
|
32
|
+
for (const row of hosts)
|
|
33
|
+
if (ctx.host === row.host) {
|
|
34
|
+
toModify.path = row.root + toModify.path
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
if (api.getConfig('mandatory')) {
|
|
38
|
+
ctx.socket.destroy()
|
|
39
|
+
return true
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
})
|