1
0
mirror of https://github.com/donaldzou/WGDashboard.git synced 2024-11-22 07:10:09 +01:00

Adjusted router to dynamic import

This commit is contained in:
Donald Zou 2024-11-03 18:35:21 +08:00
parent eaac12ddc8
commit b97fc16ad9
44 changed files with 427 additions and 101 deletions

8
src/static/app/dist/assets/browser.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{_ as r,c as i,b as o,w as e,e as _,o as t,h as l,g as n,i as u,S as d}from"./index.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(h,x,k,w,$,g){const a=_("RouterView");return t(),i("div",p,[o(a,null,{default:e(({Component:s,route:c})=>[o(l,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),n(d,null,{default:e(()=>[(t(),n(u(s),{key:c.path}))]),_:2},1024))]),_:2},1024)]),_:1})])}const y=r(m,[["render",f]]);export{y as default};

View File

@ -0,0 +1 @@
.fade-enter-active[data-v-a85a04a5]{transition-delay:var(--1d5189b2)!important}.configurationListTitle{.btn[data-v-790c086d]{border-radius:50%!important}}@media screen and (max-width: 768px){.configurationListTitle{&[data-v-790c086d]{flex-direction:column;gap:.5rem}h3 span[data-v-790c086d]{margin-left:auto!important}.btn[data-v-790c086d]{width:100%}}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
src/static/app/dist/assets/index2.css vendored Normal file
View File

@ -0,0 +1 @@
@media screen and (max-width: 768px){.navbar-container[data-v-461d2bae]{position:absolute;z-index:1000;animation-duration:.4s;animation-fill-mode:both;display:none;animation-timing-function:cubic-bezier(.82,.58,.17,.9)}.navbar-container.active[data-v-461d2bae]{animation-direction:normal;display:block!important;animation-name:zoomInFade-461d2bae}}.navbar-container[data-v-461d2bae]{height:100vh}@supports (height: 100dvh){@media screen and (max-width: 768px){.navbar-container[data-v-461d2bae]{height:calc(100dvh - 50px)}}}@keyframes zoomInFade-461d2bae{0%{opacity:0;transform:translateY(60px);filter:blur(3px)}to{opacity:1;transform:translateY(0);filter:blur(0px)}}.messageCentre[data-v-93734089]{top:1rem;right:1rem;width:calc(100% - 2rem)}main[data-v-93734089]{height:100vh}@supports (height: 100dvh){@media screen and (max-width: 768px){main[data-v-93734089]{height:calc(100dvh - 50px)}}}

1
src/static/app/dist/assets/index2.js vendored Normal file

File diff suppressed because one or more lines are too long

1
src/static/app/dist/assets/index3.js vendored Normal file
View File

@ -0,0 +1 @@
function f(e){return e.includes(":")?6:e.includes(".")?4:0}function b(e){const i=f(e);if(!i)throw new Error(`Invalid IP address: ${e}`);let n=0n,o=0n;const r=Object.create(null);if(i===4)for(const s of e.split(".").map(BigInt).reverse())n+=s*2n**o,o+=8n;else{if(e.includes(".")&&(r.ipv4mapped=!0,e=e.split(":").map(t=>{if(t.includes(".")){const[c,l,d,a]=t.split(".").map($=>Number($).toString(16).padStart(2,"0"));return`${c}${l}:${d}${a}`}else return t}).join(":")),e.includes("%")){let t;[,e,t]=/(.+)%(.+)/.exec(e)||[],r.scopeid=t}const s=e.split(":"),u=s.indexOf("");if(u!==-1)for(;s.length<8;)s.splice(u,0,"");for(const t of s.map(c=>BigInt(parseInt(c||"0",16))).reverse())n+=t*2n**o,o+=16n}return r.number=n,r.version=i,r}const p={4:32,6:128},I=e=>e.includes("/")?f(e):0;function m(e){const i=I(e),n=Object.create(null);if(i)n.cidr=e,n.version=i;else{const a=f(e);if(a)n.cidr=`${e}/${p[a]}`,n.version=a;else throw new Error(`Network is not a CIDR or IP: ${e}`)}const[o,r]=n.cidr.split("/");if(!/^[0-9]+$/.test(r))throw new Error(`Network is not a CIDR or IP: ${e}`);n.prefix=r,n.single=r===String(p[n.version]);const{number:s,version:u}=b(o),t=p[u],c=s.toString(2).padStart(t,"0"),l=Number(t-r),d=c.substring(0,t-l);return n.start=BigInt(`0b${d}${"0".repeat(l)}`),n.end=BigInt(`0b${d}${"1".repeat(l)}`),n}export{m as p};

View File

@ -0,0 +1 @@
import{_ as t,G as e,t as o}from"./index.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return e(this.t)}}};function a(c,r,n,p,_,i){return o(this.getLocaleText)}const x=t(s,[["render",a]]);export{x as L};

View File

@ -0,0 +1 @@
.message[data-v-f50b8f0c]{width:100%}@media screen and (min-width: 576px){.message[data-v-f50b8f0c]{width:400px}}

1
src/static/app/dist/assets/message.js vendored Normal file
View File

@ -0,0 +1 @@
import{L as c}from"./localeText.js";import{d as n}from"./dayjs.min.js";import{_ as d,o as r,c as m,a as s,b as i,d as t,t as e,n as l,e as _}from"./index.js";const p={name:"message",methods:{dayjs:n},components:{LocaleText:c},props:{message:Object},mounted(){setTimeout(()=>{this.message.show=!1},5e3)}},g=["id"],h={class:"card-body"},f={class:"d-flex"},x={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},u={class:"ms-auto"};function b(y,v,w,T,L,a){const o=_("LocaleText");return r(),m("div",{class:l(["card shadow rounded-3 position-relative message ms-auto",{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"}]),id:this.message.id},[s("div",h,[s("div",f,[s("small",x,[i(o,{t:"FROM "}),t(" "+e(this.message.from),1)]),s("small",u,e(a.dayjs().format("hh:mm A")),1)]),t(" "+e(this.message.content),1)])],10,g)}const M=d(p,[["render",b],["__scopeId","data-v-f50b8f0c"]]);export{M};

File diff suppressed because one or more lines are too long

1
src/static/app/dist/assets/osmap.css vendored Normal file

File diff suppressed because one or more lines are too long

10
src/static/app/dist/assets/osmap.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.list-move[data-v-6d5fc831],.list-enter-active[data-v-6d5fc831],.list-leave-active[data-v-6d5fc831]{transition:all .3s ease}.list-enter-from[data-v-6d5fc831],.list-leave-to[data-v-6d5fc831]{opacity:0;transform:translateY(10px)}.list-leave-active[data-v-6d5fc831]{position:absolute}.peerSettingContainer[data-v-17eb547c]{background-color:#00000060;z-index:9998}div[data-v-17eb547c]{transition:.2s ease-in-out}.inactiveField[data-v-17eb547c]{opacity:.4}.card[data-v-17eb547c]{max-height:100%}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

18
src/static/app/dist/assets/peerList.js vendored Normal file

File diff suppressed because one or more lines are too long

1
src/static/app/dist/assets/ping.css vendored Normal file
View File

@ -0,0 +1 @@
.pingPlaceholder[data-v-a08ce97e]{width:100%;height:79.98px}.ping-move[data-v-a08ce97e],.ping-enter-active[data-v-a08ce97e],.ping-leave-active[data-v-a08ce97e]{transition:all .4s cubic-bezier(.82,.58,.17,.9)}.ping-leave-active[data-v-a08ce97e]{position:absolute;width:100%}.ping-enter-from[data-v-a08ce97e],.ping-leave-to[data-v-a08ce97e]{opacity:0;filter:blur(3px)}

1
src/static/app/dist/assets/ping.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.dropdownIcon[data-v-626f1988]{transition:all .2s ease-in-out}.dropdownIcon.active[data-v-626f1988]{transform:rotate(180deg)}.steps{&[data-v-e5d78cfb]{transition:all .3s ease-in-out;opacity:.3}&.active[data-v-e5d78cfb]{opacity:1}}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
@media screen and (max-width: 992px){.apiKey-card-body{&[data-v-a76253c8]{flex-direction:column!important;align-items:start!important}div.ms-auto[data-v-a76253c8]{margin-left:0!important}div[data-v-a76253c8]{width:100%;align-items:start!important}small[data-v-a76253c8]{margin-right:auto}}}.apiKey-move[data-v-100ee9f9],.apiKey-enter-active[data-v-100ee9f9],.apiKey-leave-active[data-v-100ee9f9]{transition:all .5s ease}.apiKey-enter-from[data-v-100ee9f9],.apiKey-leave-to[data-v-100ee9f9]{opacity:0;transform:translateY(30px) scale(.9)}.apiKey-leave-active[data-v-100ee9f9]{position:absolute;width:100%}.dropdown-menu[data-v-0f26916d]{width:100%}.list-group{&[data-v-4aa2aed9]:first-child{border-top-left-radius:var(--bs-border-radius-lg);border-top-right-radius:var(--bs-border-radius-lg)}&[data-v-4aa2aed9]:last-child{border-bottom-left-radius:var(--bs-border-radius-lg);border-bottom-right-radius:var(--bs-border-radius-lg)}}

File diff suppressed because one or more lines are too long

1
src/static/app/dist/assets/setup.js vendored Normal file
View File

@ -0,0 +1 @@
import{_ as u,D as m,m as p,c as r,a as e,b as o,d as c,t as h,j as f,k as l,p as d,o as i,e as w}from"./index.js";import{L as g}from"./localeText.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:m()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,p("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},$={for:"confirmPassword",class:"mb-1 text-muted"},q=["disabled"],A={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=w("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=c(" 😊"))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):f("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",$,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",A,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,q)])])])],8,_)}const W=u(b,[["render",B]]);export{W as default};

1
src/static/app/dist/assets/share.css vendored Normal file
View File

@ -0,0 +1 @@
.animate__fadeInUp[data-v-1b44aacd]{animation-timing-function:cubic-bezier(.42,0,.22,1)}

1
src/static/app/dist/assets/share.js vendored Normal file
View File

@ -0,0 +1 @@
import{_,q as r,D as p,f as u,c as m,a as t,b as c,X as h,o as f,e as b}from"./index.js";import{b as v}from"./browser.js";import{L as y}from"./localeText.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=h(),e=r(!1),i=p(),n=r(""),s=r(void 0),l=r(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(s.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(s.value=d.data,l.value=new Blob([s.value.file],{type:"text/plain"})):s.value=void 0,e.value=!0}),{store:i,theme:n,peerConfiguration:s,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),i=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=i,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},w=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},I={class:"m-auto"},L={key:1,class:"d-flex align-items-center flex-column gap-3"},B={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},k={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},q={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},D=["download","href"];function R(o,e,i,n,s,l){const a=b("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",x,[this.peerConfiguration?(f(),m("div",L,[t("div",B,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",k,null,512),t("p",q,[c(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),c(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)]),8,D)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",I,[c(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,w)}const N=_(g,[["render",R],["__scopeId","data-v-1b44aacd"]]);export{N as default};

1
src/static/app/dist/assets/signin.css vendored Normal file
View File

@ -0,0 +1 @@
.dot.inactive[data-v-ed7817c7]{background-color:#dc3545;box-shadow:0 0 0 .2rem #dc354545}.spin[data-v-ed7817c7]{animation:spin-ed7817c7 1s infinite cubic-bezier(.82,.58,.17,.9)}@keyframes spin-ed7817c7{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media screen and (max-width: 768px){.remoteServerContainer[data-v-ed7817c7]{flex-direction:column}.remoteServerContainer .button-group button[data-v-ed7817c7]{width:100%}}@media screen and (max-width: 768px){.login-box[data-v-95530d22]{width:100%!important}.login-box div[data-v-95530d22]{width:auto!important}}

1
src/static/app/dist/assets/signin.js vendored Normal file

File diff suppressed because one or more lines are too long

1
src/static/app/dist/assets/totp.js vendored Normal file
View File

@ -0,0 +1 @@
import{_ as h,D as m,f as p,m as f,c as b,a as t,b as i,t as _,k as v,p as g,g as d,w as r,e as c,o as n}from"./index.js";import{b as x}from"./browser.js";import{L as y}from"./localeText.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=m();let e="";return await p("/api/Welcome_GetTotpLink",{},a=>{a.status&&(e=a.data)}),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?f("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},L={class:"d-flex flex-column"},M={class:"dashboardLogo display-4"},C={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},D={for:"totp",class:"mb-2"},S={class:"text-muted"},q={class:"form-group mb-2"},A=["disabled"],E={class:"invalid-feedback"},F={class:"valid-feedback"},R={class:"d-flex gap-3 mt-5 flex-column"};function G(s,e,a,N,W,Q){const o=c("LocaleText"),l=c("RouterLink");return n(),b("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",w,[t("div",L,[t("div",null,[t("h1",M,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",C,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,_(this.l),1)],8,B)]),t("label",D,[t("small",S,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",q,[v(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,A),[[g,this.totp]]),t("div",E,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",F,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",R,[this.verified?(n(),d(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:r(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),d(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:r(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const z=h(T,[["render",G]]);export{z as default};

View File

@ -0,0 +1 @@
.pingPlaceholder[data-v-549eb223]{width:100%;height:40px}.ping-leave-active[data-v-549eb223]{position:absolute}table th[data-v-549eb223],table td[data-v-549eb223]{padding:.5rem}.table[data-v-549eb223]>:not(caption)>*>*{background-color:transparent!important}.ping-move[data-v-549eb223],.ping-enter-active[data-v-549eb223],.ping-leave-active[data-v-549eb223]{transition:all .4s cubic-bezier(.82,.58,.17,.9)}.ping-leave-active[data-v-549eb223]{position:absolute;width:100%}.ping-enter-from[data-v-549eb223],.ping-leave-to[data-v-549eb223]{opacity:0;filter:blur(3px)}

View File

@ -0,0 +1 @@
import{_ as h,W as b,f as g,c as o,a as t,b as n,k as y,p as f,z as v,w as r,h as c,o as a,d as x,F as u,r as m,n as k,y as T,t as i,j as A,e as _}from"./index.js";import{O as w}from"./osmap.js";import{L as R}from"./localeText.js";const M={name:"traceroute",components:{LocaleText:R,OSMap:w},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:b()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,g("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},S={class:"mt-md-5 mt-3 text-body"},$={class:"container-md"},C={class:"mb-3 text-body"},L={class:"d-flex gap-2 flex-column mb-5"},P={class:"mb-1 text-muted",for:"ipAddress"},V=["disabled"],N=["disabled"],O={key:0,class:"d-block"},z={key:1,class:"d-block"},B={class:"position-relative"},I={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={scope:"col"},K={scope:"col"},W={scope:"col"},j={scope:"col"},U={scope:"col"},q={key:0};function J(d,s,Q,X,Y,Z){const l=_("LocaleText"),p=_("OSMap");return a(),o("div",S,[t("div",$,[t("h3",C,[n(l,{t:"Traceroute"})]),t("div",L,[t("div",null,[t("label",P,[t("small",null,[n(l,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=v(e=>this.execute(),["enter"])),type:"text"},null,40,V),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 mt-3 position-relative",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(a(),o("span",z,s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)]))):(a(),o("span",O,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),x("Trace! ")])))]),_:1})],8,N)]),t("div",B,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(a(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(l,{t:"Hop"})]),t("th",H,[n(l,{t:"IP Address"})]),t("th",K,[n(l,{t:"Average RTT (ms)"})]),t("th",W,[n(l,{t:"Min RTT (ms)"})]),t("th",j,[n(l,{t:"Max RTT (ms)"})]),t("th",U,[n(l,{t:"Geolocation"})])])]),t("tbody",null,[(a(!0),o(u,null,m(this.tracerouteResult,(e,tt)=>(a(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,i(e.ip),1)]),t("td",null,[t("small",null,i(e.avg_rtt),1)]),t("td",null,[t("small",null,i(e.min_rtt),1)]),t("td",null,[t("small",null,i(e.max_rtt),1)]),t("td",null,[e.geo.city&&e.geo.country?(a(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):A("",!0)])]))),256))])])])])):(a(),o("div",I,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(a(),o(u,null,m(5,e=>t("div",{class:k(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:T({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const ot=h(M,[["render",J],["__scopeId","data-v-549eb223"]]);export{ot as default};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
/*! SPDX-License-Identifier: GPL-2.0
*
* Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
*/(function(){function c(n){var r=new Float64Array(16);if(n)for(var a=0;a<n.length;++a)r[a]=n[a];return r}function F(n,r){for(var a,e=c(),f=c(),t=0;t<16;++t)f[t]=r[t];b(f),b(f),b(f);for(var u=0;u<2;++u){e[0]=f[0]-65517;for(var t=1;t<15;++t)e[t]=f[t]-65535-(e[t-1]>>16&1),e[t-1]&=65535;e[15]=f[15]-32767-(e[14]>>16&1),a=e[15]>>16&1,e[14]&=65535,h(f,e,1-a)}for(var t=0;t<16;++t)n[2*t]=f[t]&255,n[2*t+1]=f[t]>>8}function b(n){for(var r=0;r<16;++r)n[(r+1)%16]+=(r<15?1:38)*Math.floor(n[r]/65536),n[r]&=65535}function h(n,r,a){for(var e,f=~(a-1),t=0;t<16;++t)e=f&(n[t]^r[t]),n[t]^=e,r[t]^=e}function g(n,r,a){for(var e=0;e<16;++e)n[e]=r[e]+a[e]|0}function i(n,r,a){for(var e=0;e<16;++e)n[e]=r[e]-a[e]|0}function v(n,r,a){for(var e=new Float64Array(31),f=0;f<16;++f)for(var t=0;t<16;++t)e[f+t]+=r[f]*a[t];for(var f=0;f<15;++f)e[f]+=38*e[f+16];for(var f=0;f<16;++f)n[f]=e[f];b(n),b(n)}function B(n,r){for(var a=c(),e=0;e<16;++e)a[e]=r[e];for(var e=253;e>=0;--e)v(a,a,a),e!==2&&e!==4&&v(a,a,r);for(var e=0;e<16;++e)n[e]=a[e]}function A(n){n[31]=n[31]&127|64,n[0]&=248}function m(n){for(var r,a=new Uint8Array(32),e=c([1]),f=c([9]),t=c(),u=c([1]),y=c(),U=c(),L=c([56129,1]),S=c([9]),d=0;d<32;++d)a[d]=n[d];A(a);for(var d=254;d>=0;--d)r=a[d>>>3]>>>(d&7)&1,h(e,f,r),h(t,u,r),g(y,e,t),i(e,e,t),g(t,f,u),i(f,f,u),v(u,y,y),v(U,e,e),v(e,t,e),v(t,f,y),g(y,e,t),i(e,e,t),v(f,e,e),i(t,u,U),v(e,t,L),g(e,e,u),v(t,t,e),v(e,u,U),v(u,f,S),v(f,y,y),h(e,f,r),h(t,u,r);return B(t,t),v(e,e,t),F(a,e),a}function K(){var n=new Uint8Array(32);return window.crypto.getRandomValues(n),n}function P(){var n=K();return A(n),n}function s(n,r){for(var a=Uint8Array.from([r[0]>>2&63,(r[0]<<4|r[1]>>4)&63,(r[1]<<2|r[2]>>6)&63,r[2]&63]),e=0;e<4;++e)n[e]=a[e]+65+(25-a[e]>>8&6)-(51-a[e]>>8&75)-(61-a[e]>>8&15)+(62-a[e]>>8&3)}function x(n){var r,a=new Uint8Array(44);for(r=0;r<32/3;++r)s(a.subarray(r*4),n.subarray(r*3));return s(a.subarray(r*4),Uint8Array.from([n[r*3+0],n[r*3+1],0])),a[43]=61,String.fromCharCode.apply(null,a)}function R(n){let r=window.atob(n),a=r.length,e=new Uint8Array(a);for(let t=0;t<a;t++)e[t]=r.charCodeAt(t);return new Uint8Array(e.buffer)}function l(n,r){n.push(r&255,r>>>8&255,r>>>16&255,r>>>24&255)}function o(n,r){n.push(r&255,r>>>8&255)}function w(n,r){for(var a=0;a<r.length;++a)n.push(r[a]&255)}function C(n){for(var r=unescape(encodeURIComponent(n)),a=new Uint8Array(r.length),e=0;e<r.length;++e)a[e]=r.charCodeAt(e);return a}function p(n){if(!p.table){p.table=[];for(var r=0,a=0;a<256;r=++a){for(var e=0;e<8;++e)r=r&1?3988292384^r>>>1:r>>>1;p.table[a]=r}}for(var f=-1,t=0;t<n.length;++t)f=f>>>8^p.table[(f^n[t])&255];return(f^-1)>>>0}function _(n){for(var r=[],a=[],e=0,f=0;f<n.length;++f){var t=C(n[f].fileName),u=C(n[f].file),y=p(u);l(r,67324752),o(r,20),o(r,0),o(r,0),o(r,0),o(r,0),l(r,y),l(r,u.length),l(r,u.length),o(r,t.length),o(r,0),w(r,t),w(r,u),l(a,33639248),o(a,0),o(a,20),o(a,0),o(a,0),o(a,0),o(a,0),l(a,y),l(a,u.length),l(a,u.length),o(a,t.length),o(a,0),o(a,0),o(a,0),o(a,0),l(a,32),l(a,e),w(a,t),e+=30+u.length+t.length}return w(r,a),l(r,101010256),o(r,0),o(r,0),o(r,n.length),o(r,n.length),l(r,a.length),l(r,e),o(r,0),Uint8Array.from(r)}window.wireguard={generateKeypair:function(){var n=P(),r=m(n),a=K();return{publicKey:x(r),privateKey:x(n),presharedKey:x(a)}},generatePublicKey:function(n){return n=R(n),x(m(n))},generateZipFiles:function(n,r){var a=n.data,e=_(a),f=new Blob([e],{type:"application/zip"}),t=document.createElement("a");t.download=r,t.href=URL.createObjectURL(f),t.style.display="none",document.body.appendChild(t),t.click(),document.body.removeChild(t)}}})();

View File

@ -1,22 +1,22 @@
import { createRouter, createWebHashHistory } from 'vue-router'
import {cookie} from "../utilities/cookie.js";
import Index from "@/views/index.vue"
import Signin from "@/views/signin.vue";
import ConfigurationList from "@/components/configurationList.vue";
// import Index from "@/views/index.vue"
// import Signin from "@/views/signin.vue";
// import ConfigurationList from "@/components/configurationList.vue";
import {fetchGet} from "@/utilities/fetch.js";
import Settings from "@/views/settings.vue";
// import Settings from "@/views/settings.vue";
import {WireguardConfigurationsStore} from "@/stores/WireguardConfigurationsStore.js";
import {DashboardConfigurationStore} from "@/stores/DashboardConfigurationStore.js";
import Setup from "@/views/setup.vue";
import NewConfiguration from "@/views/newConfiguration.vue";
import Configuration from "@/views/configuration.vue";
import PeerList from "@/components/configurationComponents/peerList.vue";
import PeerCreate from "@/components/configurationComponents/peerCreate.vue";
import Ping from "@/views/ping.vue";
import Traceroute from "@/views/traceroute.vue";
import Totp from "@/components/setupComponent/totp.vue";
import Share from "@/views/share.vue";
import RestoreConfiguration from "@/views/restoreConfiguration.vue";
// import Setup from "@/views/setup.vue";
// import NewConfiguration from "@/views/newConfiguration.vue";
// import Configuration from "@/views/configuration.vue";
// import PeerList from "@/components/configurationComponents/peerList.vue";
// import PeerCreate from "@/components/configurationComponents/peerCreate.vue";
// import Ping from "@/views/ping.vue";
// import Traceroute from "@/views/traceroute.vue";
// import Totp from "@/components/setupComponent/totp.vue";
// import Share from "@/views/share.vue";
// import RestoreConfiguration from "@/views/restoreConfiguration.vue";
const checkAuth = async () => {
let result = false
@ -39,7 +39,7 @@ const router = createRouter({
{
name: "Index",
path: '/',
component: Index,
component: () => import('@/views/index.vue'),
meta: {
requiresAuth: true,
},
@ -47,7 +47,7 @@ const router = createRouter({
{
name: "Configuration List",
path: '',
component: ConfigurationList,
component: () => import('@/components/configurationList.vue'),
meta: {
title: "WireGuard Configurations"
}
@ -55,7 +55,7 @@ const router = createRouter({
{
name: "Settings",
path: '/settings',
component: Settings,
component: () => import('@/views/settings.vue'),
meta: {
title: "Settings"
}
@ -63,17 +63,17 @@ const router = createRouter({
{
path: '/ping',
name: "Ping",
component: Ping,
component: () => import('@/views/ping.vue'),
},
{
path: '/traceroute',
name: "Traceroute",
component: Traceroute,
component: () => import('@/views/traceroute.vue'),
},
{
name: "New Configuration",
path: '/new_configuration',
component: NewConfiguration,
component: () => import('@/views/newConfiguration.vue'),
meta: {
title: "New Configuration"
}
@ -81,7 +81,7 @@ const router = createRouter({
{
name: "Restore Configuration",
path: '/restore_configuration',
component: RestoreConfiguration,
component: () => import('@/views/restoreConfiguration.vue'),
meta: {
title: "Restore Configuration"
}
@ -89,7 +89,7 @@ const router = createRouter({
{
name: "Configuration",
path: '/configuration/:id',
component: Configuration,
component: () => import('@/views/configuration.vue'),
meta: {
title: "Configuration"
},
@ -97,12 +97,12 @@ const router = createRouter({
{
name: "Peers List",
path: 'peers',
component: PeerList
component: () => import('@/components/configurationComponents/peerList.vue')
},
{
name: "Peers Create",
path: 'create',
component: PeerCreate
component: () => import('@/components/configurationComponents/peerCreate.vue')
},
]
},
@ -110,27 +110,31 @@ const router = createRouter({
]
},
{
path: '/signin', component: Signin,
path: '/signin',
component: () => import('@/views/signin.vue'),
meta: {
title: "Sign In"
}
},
{
path: '/welcome', component: Setup,
path: '/welcome',
component: () => import("@/views/setup.vue"),
meta: {
requiresAuth: true,
title: "Welcome to WGDashboard"
},
},
{
path: '/2FASetup', component: Totp,
path: '/2FASetup',
component: () => import("@/components/setupComponent/totp.vue"),
meta: {
requiresAuth: true,
title: "Multi-Factor Authentication Setup"
},
},
{
path: '/share', component: Share,
path: '/share',
component: () => import("@/views/share.vue"),
meta: {
title: "Share"
}

View File

@ -8,8 +8,7 @@ export const GetLocale = (key) => {
const match = reg.filter(x => {
return key.match(new RegExp('^' + x + '$', 'gi')) !== null
})
if (match.length === 0 || match.length > 1){
// console.log(`[Translation Needed] Language: ${store.Configuration.Server.dashboard_language} \nKey: ${key}`)
if (match.length === 0 || match.length > 1 || store.Locale[match[0]].length === 0){
return key
}
return key.replace(new RegExp(match[0], 'gi'), store.Locale[match[0]])

View File

@ -246,7 +246,7 @@ export default {
width: 100%;
height: 79.98px;
}
.ping-move, /* apply transition to moving elements */
.ping-move,
.ping-enter-active,
.ping-leave-active {
transition: all 0.4s cubic-bezier(0.82, 0.58, 0.17, 0.9);
@ -259,7 +259,6 @@ export default {
.ping-enter-from,
.ping-leave-to {
opacity: 0;
//transform: scale(1.1);
filter: blur(3px);
}
</style>

View File

@ -166,12 +166,9 @@ export default {
.ping-enter-from,
.ping-leave-to {
opacity: 0;
//transform: scale(1.1);
filter: blur(3px);
}
/* ensure leaving items are taken out of layout flow so that moving
animations can be calculated correctly. */
.ping-leave-active {
position: absolute;
}
@ -184,7 +181,7 @@ table th, table td{
background-color: transparent !important;
}
.ping-move, /* apply transition to moving elements */
.ping-move,
.ping-enter-active,
.ping-leave-active {
transition: all 0.4s cubic-bezier(0.82, 0.58, 0.17, 0.9);
@ -197,7 +194,6 @@ table th, table td{
.ping-enter-from,
.ping-leave-to {
opacity: 0;
//transform: scale(1.1);
filter: blur(3px);
}
</style>

View File

@ -236,5 +236,76 @@
"IP Address": "IP-Adresse",
"Enter IP Address / Hostname": "IP-Adresse/Hostnamen eingeben",
"IP Address / Hostname": "IP-Adresse/Hostnamen",
"Count": "Zählen"
"Count": "Zählen",
"Geolocation": "",
"Is Alive": "",
"Average / Min / Max Round Trip Time": "",
"Sent / Received / Lost Package": "",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "",
"Restore Configuration": "",
"Step (.*)": "",
"Select a backup you want to restore": "",
"Click to change a backup": "",
"Selected Backup": "",
"You don't have any configuration to restore": "",
"Help": "",
"Backup": "",
"([0-9].*) Backups?": "",
"Yes": "",
"No": "",
"Backup not selected": "",
"Confirm \\& edit restore information": "",
"(.*) Available IP Address": "",
"Database File": "",
"Contain": "",
"Restricted Peers?": "",
"Restore": "",
"Restoring": "",
"WGDashboard Settings": "",
"Peers Settings": "",
"WireGuard Configuration Settings": "",
"Appearance": "",
"Theme": "",
"Language": "",
"Account Settings": "",
"Peer Default Settings": "",
"Toggle When Start Up": "",
"Other Settings": "",
"Select Peers": "",
"Backup & Restore": "",
"Delete Configuration": "",
"Create Backup": "",
"No backup yet, click the button above to create backup\\.": "",
"Are you sure to delete this backup\\?": "",
"Are you sure to restore this backup?\\": "",
"Backup Date": "",
"File": "",
"Are you sure to delete this configuration\\?": "",
"Once you deleted this configuration\\:": "",
"All connected peers will get disconnected": "",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "",
"Checking backups...": "",
"This configuration have ([0-9].*) backups": "",
"This configuration have no backup": "",
"If you're sure, please type in the configuration name below and click Delete": "",
"Select All": "",
"Clear Selection": "",
"([0-9].*) Peers?": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
"Are you sure to delete": "",
"Are you sure to delete this peer\\?": "",
"Configuration deleted": "",
"Configuration saved": "",
"WGDashboard language update failed": "",
"Configuration restored": "",
"Allowed IP already taken by another peer": "",
"Failed to allow access of peer (.*)": "",
"Failed to save configuration through WireGuard": "",
"Allow access successfully": "",
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": ""
}

View File

@ -232,5 +232,81 @@
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Il nome della configurazione può contenere solo 15 lettere tra minuscole/maiuscole, numeri, segno '_', segno '=', segno '>', punto e virgola.",
"Invalid Port": "Porta non valida",
"Save Configuration": "Salva la configurazione",
"IP Address/CIDR is invalid": "L'indirizzo IP/CIDR non è valido"
"IP Address/CIDR is invalid": "L'indirizzo IP/CIDR non è valido",
"IP Address": "",
"Enter IP Address / Hostname": "",
"IP Address / Hostname": "",
"Dashboard IP Address \\& Listen Port": "",
"Count": "",
"Geolocation": "",
"Is Alive": "",
"Average / Min / Max Round Trip Time": "",
"Sent / Received / Lost Package": "",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "",
"Restore Configuration": "",
"Step (.*)": "",
"Select a backup you want to restore": "",
"Click to change a backup": "",
"Selected Backup": "",
"You don't have any configuration to restore": "",
"Help": "",
"Backup": "",
"([0-9].*) Backups?": "",
"Yes": "",
"No": "",
"Backup not selected": "",
"Confirm \\& edit restore information": "",
"(.*) Available IP Address": "",
"Database File": "",
"Contain": "",
"Restricted Peers?": "",
"Restore": "",
"Restoring": "",
"WGDashboard Settings": "",
"Peers Settings": "",
"WireGuard Configuration Settings": "",
"Appearance": "",
"Theme": "",
"Language": "",
"Account Settings": "",
"Peer Default Settings": "",
"Toggle When Start Up": "",
"Other Settings": "",
"Select Peers": "",
"Backup & Restore": "",
"Delete Configuration": "",
"Create Backup": "",
"No backup yet, click the button above to create backup\\.": "",
"Are you sure to delete this backup\\?": "",
"Are you sure to restore this backup?\\": "",
"Backup Date": "",
"File": "",
"Are you sure to delete this configuration\\?": "",
"Once you deleted this configuration\\:": "",
"All connected peers will get disconnected": "",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "",
"Checking backups...": "",
"This configuration have ([0-9].*) backups": "",
"This configuration have no backup": "",
"If you're sure, please type in the configuration name below and click Delete": "",
"Select All": "",
"Clear Selection": "",
"([0-9].*) Peers?": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
"Are you sure to delete": "",
"Are you sure to delete this peer\\?": "",
"Configuration deleted": "",
"Configuration saved": "",
"WGDashboard language update failed": "",
"Configuration restored": "",
"Allowed IP already taken by another peer": "",
"Failed to allow access of peer (.*)": "",
"Failed to save configuration through WireGuard": "",
"Allow access successfully": "",
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": ""
}

View File

@ -236,6 +236,76 @@
"IP Address": "IP-адрес",
"Enter IP Address / Hostname": "Введите IP-адрес/имя хоста",
"IP Address / Hostname": "IP-адрес/имя хоста",
"Count": "Считать"
"Count": "Считать",
"Geolocation": "",
"Is Alive": "",
"Average / Min / Max Round Trip Time": "",
"Sent / Received / Lost Package": "",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "",
"Restore Configuration": "",
"Step (.*)": "",
"Select a backup you want to restore": "",
"Click to change a backup": "",
"Selected Backup": "",
"You don't have any configuration to restore": "",
"Help": "",
"Backup": "",
"([0-9].*) Backups?": "",
"Yes": "",
"No": "",
"Backup not selected": "",
"Confirm \\& edit restore information": "",
"(.*) Available IP Address": "",
"Database File": "",
"Contain": "",
"Restricted Peers?": "",
"Restore": "",
"Restoring": "",
"WGDashboard Settings": "",
"Peers Settings": "",
"WireGuard Configuration Settings": "",
"Appearance": "",
"Theme": "",
"Language": "",
"Account Settings": "",
"Peer Default Settings": "",
"Toggle When Start Up": "",
"Other Settings": "",
"Select Peers": "",
"Backup & Restore": "",
"Delete Configuration": "",
"Create Backup": "",
"No backup yet, click the button above to create backup\\.": "",
"Are you sure to delete this backup\\?": "",
"Are you sure to restore this backup?\\": "",
"Backup Date": "",
"File": "",
"Are you sure to delete this configuration\\?": "",
"Once you deleted this configuration\\:": "",
"All connected peers will get disconnected": "",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "",
"Checking backups...": "",
"This configuration have ([0-9].*) backups": "",
"This configuration have no backup": "",
"If you're sure, please type in the configuration name below and click Delete": "",
"Select All": "",
"Clear Selection": "",
"([0-9].*) Peers?": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
"Are you sure to delete": "",
"Are you sure to delete this peer\\?": "",
"Configuration deleted": "",
"Configuration saved": "",
"WGDashboard language update failed": "",
"Configuration restored": "",
"Allowed IP already taken by another peer": "",
"Failed to allow access of peer (.*)": "",
"Failed to save configuration through WireGuard": "",
"Allow access successfully": "",
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": ""
}

View File

@ -236,6 +236,76 @@
"IP Address": "IP-адреса",
"Enter IP Address / Hostname": "Введіть IP-адресу / ім’я хоста",
"IP Address / Hostname": "IP-адресу / ім’я хоста",
"Count": "Граф"
"Count": "Граф",
"Geolocation": "",
"Is Alive": "",
"Average / Min / Max Round Trip Time": "",
"Sent / Received / Lost Package": "",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "",
"Restore Configuration": "",
"Step (.*)": "",
"Select a backup you want to restore": "",
"Click to change a backup": "",
"Selected Backup": "",
"You don't have any configuration to restore": "",
"Help": "",
"Backup": "",
"([0-9].*) Backups?": "",
"Yes": "",
"No": "",
"Backup not selected": "",
"Confirm \\& edit restore information": "",
"(.*) Available IP Address": "",
"Database File": "",
"Contain": "",
"Restricted Peers?": "",
"Restore": "",
"Restoring": "",
"WGDashboard Settings": "",
"Peers Settings": "",
"WireGuard Configuration Settings": "",
"Appearance": "",
"Theme": "",
"Language": "",
"Account Settings": "",
"Peer Default Settings": "",
"Toggle When Start Up": "",
"Other Settings": "",
"Select Peers": "",
"Backup & Restore": "",
"Delete Configuration": "",
"Create Backup": "",
"No backup yet, click the button above to create backup\\.": "",
"Are you sure to delete this backup\\?": "",
"Are you sure to restore this backup?\\": "",
"Backup Date": "",
"File": "",
"Are you sure to delete this configuration\\?": "",
"Once you deleted this configuration\\:": "",
"All connected peers will get disconnected": "",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "",
"Checking backups...": "",
"This configuration have ([0-9].*) backups": "",
"This configuration have no backup": "",
"If you're sure, please type in the configuration name below and click Delete": "",
"Select All": "",
"Clear Selection": "",
"([0-9].*) Peers?": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
"Are you sure to delete": "",
"Are you sure to delete this peer\\?": "",
"Configuration deleted": "",
"Configuration saved": "",
"WGDashboard language update failed": "",
"Configuration restored": "",
"Allowed IP already taken by another peer": "",
"Failed to allow access of peer (.*)": "",
"Failed to save configuration through WireGuard": "",
"Allow access successfully": "",
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": ""
}