PageSourceSearch

https://ac-foto.com/build/chunk.Ci4DSl1y.js

js ac-foto.com collected 2026-10-06 09:07:28 UTC 17,569 bytes, 1 lines download raw bytes

1import{r as D,a1 as pe,s as v,G as H,u as Q,o as a,h as i,a as x,f as d,m as fe,w as L,b as e,n as m,t as n,i as r,F as f,j as S,p as E,e as _,B as M,d as X,v as R,A as ge,q as P}from"./chunk.f52SVntd.js";import he from"./chunk.BKcIXQlW.js";import{_ as ve}from"./chunk.B9nsAKV-.js";import ke from"./chunk.BRNuKUCK.js";import{_ as Y}from"./chunk.B7ZFtgyd.js";import{_ as ye}from"./chunk.DYNb8CDf.js";import we from"./chunk.aexqeFPY.js";import{_ as xe}from"./chunk.DlAUqK2U.js";/* empty css              */import"./chunk.CojFA4kc.js";import"./chunk.a8QMAv--.js";const Se={class:"container-fluid px-3 pb-5 firewall-page"},Ee={class:"status-bar"},Re={class:"status-bar__main"},Ce={class:"status-title"},$e={class:"status-sub"},Fe={class:"d-flex gap-2 flex-wrap"},Ne=["disabled"],De={key:0,class:"alert alert-warning mt-3 mb-0"},Pe={class:"tab-bar"},Be=["onClick"],Ve={key:0,class:"tab-count"},je={key:1,class:"tab-count"},Ie={key:2,class:"tab-count"},Me={key:0,class:"empty-state"},Oe={class:"rule-grid"},Ae={class:"rule-card__top"},Ue={class:"rule-card__identity"},Te={class:"rule-card__title"},ze={key:0,class:"rule-card__description"},Le={class:"rule-card__state-label"},Ge={class:"rule-card__logic"},qe={key:0,class:"logic-joiner"},We={class:"cond__join"},Ze={class:"cond__body"},Je={class:"cond__subject"},Ke={class:"cond__operator"},He={key:0,class:"cond__value"},Qe={key:1,class:"cond__operator"},Xe={key:2,class:"cond__note"},Ye={class:"rule-card__outcome"},et={key:0,class:"outcome-detail"},tt={key:1,class:"outcome-detail"},lt={class:"rule-card__stats"},st={key:0,class:"rule-card__actions"},nt=["onClick"],at=["onClick"],it=["onClick"],ot={class:"panel"},rt={class:"table-responsive"},dt={class:"table table-dark table-hover align-middle mb-0"},ut={class:"text-nowrap"},ct={class:"font-monospace"},bt=["title"],_t=["title"],mt={key:0,class:"badge text-bg-info"},pt={key:1,class:"text-muted"},ft={key:0},gt={class:"row g-3"},ht={key:0,class:"col-xl-3"},vt={class:"panel h-100"},kt={class:"panel__body"},yt={key:0,class:"invalid-hint"},wt=["disabled"],xt={class:"panel"},St={class:"table-responsive"},Et={class:"table table-dark table-hover align-middle mb-0"},Rt={key:0},Ct={class:"font-monospace"},$t={class:"small"},Ft=["title"],Nt={class:"text-nowrap small"},Dt={key:0,class:"text-end"},Pt=["onClick"],Bt={key:0},Vt=["colspan"],jt={class:"panel"},It={class:"panel__body"},Mt={class:"col-12"},Ot={class:"form-check form-switch"},At=["disabled"],Ut={class:"form-text"},Tt={class:"col-lg-6"},zt=["disabled"],Lt={class:"col-lg-6"},Gt=["disabled"],qt={class:"col-lg-6"},Wt=["disabled"],Zt={key:0,class:"col-12"},Jt=["disabled"],Kt={class:"editor-modal__title"},Ht={__name:"Index",props:{rules:{type:Array,default:()=>[]},events:{type:Array,default:()=>[]},blocks:{type:Array,default:()=>[]},settings:{type:Object,required:!0},schema:{type:Object,required:!0},canEdit:{type:Boolean,default:!1}},setup(o){const c=o,ee=[{key:"rules",label:"Regeln"},{key:"events",label:"Auslösungen"},{key:"blocks",label:"Gesperrte IPs"},{key:"settings",label:"Einstellungen"}],y=D("rules"),B=()=>({id:null,name:"",description:"",enabled:!0,priority:100,match_type:"all",action:"block_ip",block_duration_minutes:"",notify_enabled:!1,notify_emails:"",notify_throttle_minutes:60,condition_groups:[{match_type:"all",conditions:[{type:"ip",operator:"equals",value:"",key:"",window:c.schema.defaultWindow,scope:"ip"}]}]}),C=D(null),$=D(!1),p=pe(B()),w=D({}),O=D(!1),A=v(()=>C.value==="new"),G=s=>{Object.assign(p,{...B(),...s,block_duration_minutes:s.block_duration_minutes??"",notify_emails:s.notify_emails??"",description:s.description??"",condition_groups:JSON.parse(JSON.stringify(s.condition_groups??B().condition_groups))})},q=()=>{G(B()),w.value={},C.value="new",$.value=!0},te=s=>{G(s),w.value={},C.value=s.id,$.value=!0},U=()=>{$.value=!1,C.value=null,w.value={}},W=()=>({...p,priority:Number(p.priority)||0,notify_throttle_minutes:Math.max(0,Number(p.notify_throttle_minutes)||0),block_duration_minutes:String(p.block_duration_minutes??"").trim()===""?null:Number(p.block_duration_minutes)}),le=()=>{O.value=!0,w.value={};const s={preserveScroll:!0,onSuccess:()=>U(),onError:l=>{w.value=l},onFinish:()=>{O.value=!1}};A.value?P.post(route("backend.firewall.rules.store"),W(),s):P.put(route("backend.firewall.rules.update",{firewallRule:C.value}),W(),s)},se=s=>{P.post(route("backend.firewall.rules.toggle",{firewallRule:s.id}),{},{preserveScroll:!0})};let F=null;const V=H({component:Y,attrs:{title:"Firewall-Regel löschen",text:"",buttonTextSubmit:"Löschen",onSubmit(){F&&P.delete(route("backend.firewall.rules.destroy",{firewallRule:F.id}),{preserveScroll:!0,onFinish:()=>{F=null,V.close()}})},onCancel(){F=null,V.close()}}}),ne=s=>{F=s,V.patchOptions({attrs:{text:`Soll die Regel "${s.name}" wirklich gelöscht werden?`}}),V.open()},b=Q({ip:"",reason:"",duration_minutes:""}),ae=()=>{b.transform(s=>({...s,duration_minutes:String(s.duration_minutes??"").trim()===""?null:Number(s.duration_minutes)})).post(route("backend.firewall.blocks.store"),{preserveScroll:!0,onSuccess:()=>b.reset()})};let N=null;const j=H({component:Y,attrs:{title:"Sperre aufheben",text:"",buttonTextSubmit:"Entsperren",onSubmit(){N&&P.delete(route("backend.firewall.blocks.destroy",{blockedIp:N.id}),{preserveScroll:!0,onFinish:()=>{N=null,j.close()}})},onCancel(){N=null,j.close()}}}),ie=s=>{N=s,j.patchOptions({attrs:{text:`Soll die Sperre für ${s.ip} aufgehoben werden?`}}),j.open()},u=Q({firewall_enabled:c.settings.firewall_enabled,firewall_ip_whitelist:c.settings.firewall_ip_whitelist,firewall_excluded_paths:c.settings.firewall_excluded_paths,firewall_notify_emails:c.settings.firewall_notify_emails}),Z=()=>{u.post(route("backend.firewall.settings.update"),{preserveScroll:!0})},oe=()=>{u.firewall_enabled=!u.firewall_enabled,Z()},re=v(()=>Object.fromEntries(c.schema.types.map(s=>[s.value,s.label]))),de=v(()=>Object.fromEntries(c.schema.types.flatMap(s=>
1s.operators.map(l=>[l.value,l.label])))),ue=v(()=>Object.fromEntries(c.schema.windows.map(s=>[s.value,s.label]))),ce=v(()=>Object.fromEntries(c.schema.scopes.map(s=>[s.value,s.label]))),g=s=>{const l=de.value[s.operator]??s.operator,t=s.type==="header"?`Header ${s.key}`:re.value[s.type]??s.type;return s.type==="request_count"?{subject:t,operator:l,value:String(s.value),suffix:ue.value[s.window]??`in ${s.window}s`,note:s.scope==="rule"?`zählt ${ce.value.rule}`:null}:["is_empty","is_not_empty"].includes(s.operator)?{subject:t,operator:l,value:null,suffix:null,note:null}:{subject:t,operator:l,value:String(s.value??""),suffix:null,note:null}},be=v(()=>c.rules.filter(s=>s.enabled).length),_e=v(()=>c.blocks.filter(s=>!s.expires_at||new Date(s.expires_at)>new Date).length),me=v(()=>c.blocks.filter(s=>s.source==="firewall").length),I=s=>s?new Date(s).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}):"–",J=s=>s.expires_at?new Date(s.expires_at)>new Date?{label:`bis ${I(s.expires_at)}`,className:"text-bg-warning"}:{label:"abgelaufen",className:"text-bg-dark"}:{label:"dauerhaft",className:"text-bg-secondary"},T=(s,l=70)=>{const t=String(s??"");return t.length>l?`${t.slice(0,l)}…`:t};return(s,l)=>(a(),i(f,null,[x(d(fe),{title:"Soft-Firewall"}),x(ve,{disableCertBanner:"",disableSideBanner:""},{content:L(()=>[x(he),x(ke,{heading:"Soft-Firewall"}),e("div",Se,[e("div",Ee,[e("div",Re,[e("span",{class:m(["status-dot",o.settings.firewall_enabled?"status-dot--on":"status-dot--off"])},null,2),e("div",null,[e("div",Ce,n(o.settings.firewall_enabled?"Firewall aktiv":"Firewall deaktiviert"),1),e("div",$e,n(be.value)+" von "+n(o.rules.length)+" Regeln aktiv · "+n(_e.value)+" aktive Sperren · "+n(me.value)+" davon automatisch",1)])]),e("div",Fe,[o.canEdit?(a(),i("button",{key:0,class:m(["btn btn-sm",o.settings.firewall_enabled?"btn-outline-danger":"btn-danger"]),disabled:d(u).processing,type:"button",onClick:oe},n(o.settings.firewall_enabled?"Firewall deaktivieren":"Firewall aktivieren"),11,Ne)):r("",!0),o.canEdit?(a(),i("button",{key:1,class:"btn btn-sm btn-danger",type:"button",onClick:q},"+ Neue Regel")):r("",!0)])]),o.settings.firewall_enabled?r("",!0):(a(),i("div",De,"Die Firewall ist deaktiviert. Regeln werden nicht ausgewertet und keine IPs automatisch gesperrt.")),e("div",Pe,[(a(),i(f,null,S(ee,t=>e("button",{key:t.key,class:m(["tab-button",{"tab-button--active":y.value===t.key}]),type:"button",onClick:k=>y.value=t.key},[E(n(t.label)+" ",1),t.key==="rules"?(a(),i("span",Ve,n(o.rules.length),1)):r("",!0),t.key==="events"?(a(),i("span",je,n(o.events.length),1)):r("",!0),t.key==="blocks"?(a(),i("span",Ie,n(o.blocks.length),1)):r("",!0)],10,Be)),64))]),_(e("div",null,[o.rules.length?r("",!0):(a(),i("div",Me,[l[9]||(l[9]=E(" Noch keine Regeln angelegt. ")),o.canEdit?(a(),i("button",{key:0,class:"btn btn-sm btn-danger ms-2",type:"button",onClick:q},"Erste Regel anlegen")):r("",!0)])),e("div",Oe,[(a(!0),i(f,null,S(o.rules,t=>(a(),i("article",{key:t.id,class:m(["rule-card",{"rule-card--off":!t.enabled}])},[e("div",Ae,[e("span",{class:m(["rule-state",t.enabled?"rule-state--on":"rule-state--off"])},null,2),e("div",Ue,[e("h3",Te,n(t.name),1),t.description?(a(),i("p",ze,n(t.description),1)):r("",!0)]),e("span",Le,n(t.enabled?"aktiv":"inaktiv"),1)]),e("div",Ge,[(a(!0),i(f,null,S(t.condition_groups,(k,z)=>(a(),i(f,{key:`${t.id}-${z}`},[z>0?(a(),i("div",qe,[e("span",null,n(t.match_type==="all"?"UND":"ODER"),1)])):r("",!0),(a(!0),i(f,null,S(k.conditions,(h,K)=>(a(),i("div",{key:`${t.id}-${z}-${K}`,class:"cond"},[e("span",We,n(K===0?"wenn":k.match_type==="all"?"und":"oder"),1),e("span",Ze,[e("span",Je,n(g(h).subject),1),e("span",Ke,n(g(h).operator),1),g(h).value?(a(),i("code",He,n(g(h).value),1)):r("",!0),g(h).suffix?(a(),i("span",Qe,n(g(h).suffix),1)):r("",!0),g(h).note?(a(),i("span",Xe,n(g(h).note),1)):r("",!0)])]))),128))],64))),128))]),e("div",Ye,[e("span",{class:m(["outcome-pill",t.action==="block_ip"?"outcome-pill--block":"outcome-pill--log"])},n(t.action==="block_ip"?"IP blockieren":t.action==="challenge"?"Browser prüfen":"nur protokollieren"),3),t.action==="block_ip"?(
1a(),i("span",et,n(t.block_duration_minutes?`${t.block_duration_minutes} min`:"dauerhaft"),1)):r("",!0),t.notify_enabled?(a(),i("span",tt,"E-Mail")):r("",!0)]),e("div",lt,[E(" Priorität "+n(t.priority)+" · "+n(t.trigger_count)+"× ausgelöst ",1),t.last_triggered_at?(a(),i(f,{key:0},[E("· zuletzt "+n(I(t.last_triggered_at)),1)],64)):r("",!0)]),o.canEdit?(a(),i("div",st,[e("button",{class:"btn btn-sm btn-outline-light",type:"button",onClick:k=>te(t)},"Bearbeiten",8,nt),e("button",{class:"btn btn-sm btn-outline-light",type:"button",onClick:k=>se(t)},n(t.enabled?"Deaktivieren":"Aktivieren"),9,at),e("button",{class:"btn btn-sm btn-outline-danger ms-auto",type:"button",onClick:k=>ne(t)},"Löschen",8,it)])):r("",!0)],2))),128))])],512),[[M,y.value==="rules"]]),_(e("div",ot,[l[12]||(l[12]=e("div",{class:"panel__header"},[e("h2",{class:"panel__title"},"Letzte Auslösungen"),e("span",{class:"panel__hint"},"Die 100 jüngsten Treffer")],-1)),e("div",rt,[e("table",dt,[l[11]||(l[11]=e("thead",null,[e("tr",null,[e("th",null,"Zeitpunkt"),e("th",null,"Regel"),e("th",null,"IP"),e("th",null,"Aktion"),e("th",null,"Request"),e("th",null,"User-Agent"),e("th",null,"Mail")])],-1)),e("tbody",null,[(a(!0),i(f,null,S(o.events,t=>(a(),i("tr",{key:t.id},[e("td",ut,n(I(t.occurred_at)),1),e("td",null,n(t.rule_name),1),e("td",ct,n(t.ip_address),1),e("td",null,[e("span",{class:m(["badge",t.action==="block_ip"?"text-bg-danger":"text-bg-secondary"])},n(t.action==="block_ip"?"blockiert":t.action==="challenge"?"Browser-Prüfung":"protokolliert"),3)]),e("td",{class:"small",title:t.url},n(t.method)+" "+n(T(t.url)),9,bt),e("td",{class:"small text-muted",title:t.user_agent},n(T(t.user_agent,45)),9,_t),e("td",null,[t.notified?(a(),i("span",mt,"gesendet")):(a(),i("span",pt,"–"))])]))),128)),o.events.length?r("",!0):(a(),i("tr",ft,l[10]||(l[10]=[e("td",{class:"text-muted",colspan:"7"},"Noch keine Auslösungen protokolliert.",-1)])))])])])],512),[[M,y.value==="events"]]),_(e("div",gt,[o.canEdit?(a(),i("div",ht,[e("div",vt,[l[16]||(l[16]=e("div",{class:"panel__header"},[e("h2",{class:"panel__title"},"IP manuell sperren")],-1)),e("div",kt,[e("form",{class:"d-grid gap-3",onSubmit:X(ae,["prevent"])},[e("div",null,[l[13]||(l[13]=e("label",{class:"form-label",for:"block-ip"},"IP oder Muster",-1)),_(e("input",{id:"block-ip","onUpdate:modelValue":l[0]||(l[0]=t=>d(b).ip=t),class:"form-control",placeholder:"92.92.92.* ",type:"text"},null,512),[[R,d(b).ip]]),d(b).errors.ip?(a(),i("div",yt,n(d(b).errors.ip),1)):r("",!0)]),e("div",null,[l[14]||(l[14]=e("label",{class:"form-label",for:"block-reason"},"Grund",-1)),_(e("input",{id:"block-reason","onUpdate:modelValue":l[1]||(l[1]=t=>d(b).reason=t),class:"form-control",type:"text"},null,512),[[R,d(b).reason]])]),e("div",null,[l[15]||(l[15]=e("label",{class:"form-label",for:"block-duration"},"Dauer in Minuten",-1)),_(e("input",{id:"block-duration","onUpdate:modelValue":l[2]||(l[2]=t=>d(b).duration_minutes=t),class:"form-control",inputmode:"numeric",placeholder:"leer = dauerhaft",type:"text"},null,512),[[R,d(b).duration_minutes]])]),e("button",{class:"btn btn-danger",disabled:d(b).processing,type:"submit"},"Sperren",8,wt)],32)])])])):r("",!0),e("div",{class:m(o.canEdit?"col-xl-9":"col-12")},[e("div",xt,[l[23]||(l[23]=e("div",{class:"panel__header"},[e("h2",{class:"panel__title"},"Gesperrte IPs"),e("span",{class:"panel__hint"},"Die 200 jüngsten Einträge")],-1)),e("div",St,[e("table",Et,[e("thead",null,[e("tr",null,[l[17]||(l[17]=e("th",null,"IP / Muster",-1)),l[18]||(l[18]=e("th",null,"Quelle",-1)),l[19]||(l[19]=e("th",null,"Regel",-1)),l[20]||(l[20]=e("th",null,"Gültigkeit",-1)),l[21]||(l[21]=e("th",null,"Grund",-1)),l[22]||(l[22]=e("th",null,"Seit",-1)),o.canEdit?(a(),i("th",Rt)):r("",!0)])]),e("tbody",null,[(a(!0),i(f,null,S(o.blocks,t=>(a(),i("tr",{key:t.id},[e("td",Ct,n(t.ip),1),e("td",null,[e("span",{class:m(["badge",t.source==="firewall"?"text-bg-danger":"text-bg-secondary"])},n(t.source==="firewall"?"Firewall":"manuell"),3)]),e("td",$t,n(t.firewall_rule?.name??"–"),1),e("td",null,[e("span",{class:m(["badge",J(t).className])},n(J(t).label),3)]),e("td",{class:"small text-muted",title:t.reason},n(T(t.reason,60)),9,Ft),e("td",Nt,n(I(t.created_at)),1),o.canEdit?(a(),i("td",Dt,[e("button",{class:"btn btn-sm btn-outline-secondary",type:"button",onClick:k=>ie(t)},"Entsperren",8,Pt)])):r("",!0)]))),128)),o.blocks.length?r("",!0):(a(),i("tr",Bt,[e("td",{class:"text-muted",colspan:o.canEdit?7:6},"Keine gesperrten IPs.",8,Vt)]))])])])])],2)],512),[[M,y.value==="blocks"]]),_(e("div",jt,[l[31]||(l[31]=e("div",{class:"panel__header"},[e("h2",{class:"panel__title"},"Einstellungen")],-1)),e("div",It,[e("form",{class:"row g-4",onSubmit:X(Z,["prevent"])},[e("div",Mt,[e("div",Ot,[_(e("input",{id:"firewall-enabled","onUpdate:modelValue":l[3]||(l[3]=t=>d(u).firewall_enabled=t),class:"form-check-input",disabled:!o.canEdit,type:"checkbox"},null,8,At),[[ge,d(u).firewall_enabled]]),l[24]||(l[24]=e("label",{class:"form-check-label",for:"firewall-enabled"},"Soft-Firewall aktivieren",-1))]),e("div",Ut,' Solange die Firewall aus ist, werden weder Regeln ausgewertet noch von der Firewall gesetzte Sperren durchgesetzt. Manuelle Sperren hängen weiterhin an der Einstellung „IP-Blocker aktivieren" (aktuell: '+n(o.settings.ip_blocker_enabled?"an":"aus")+"). ",1)]),e("div",Tt,[l[25]||(l[25]=e("label",{class:"form-label",for:"firewall-whitelist"},"IP-Whitelist",-1)),_(e("textarea",{id:"firewall-whitelist","onUpdate:modelValue":l[4]||(l[4]=t=>d(u).firewall_ip_whitelist=t),class:"form-control font-monospace",disabled:!o.canEdit,rows:"6"},null,8,zt),[[R,d(u).firewall_ip_whitelist]]),l[26]||(l[26]=e("div",{class:"form-text"},"Eine IP oder ein Muster (mit *) pro Zeile. Diese IPs werden nie geprüft oder gesperrt.",-1))]),e("div",Lt,[l[27]||(l[27]=e("label",{class:"form-label",for:"firewall-paths"},"Ausgenommene Pfade",-1)),_(e("textarea",{id:"firewall-paths","onUpdate:modelValue":l[5]||(l[5]=t=>d(u).firewall_excluded_paths=t),class:"form-control font-monospace",disabled:!o.canEdit,rows:"6"},null,8,Gt),[[R,d(u).firewall_excluded_paths]]),l[28]||(l[28]=e("div",{class:"form-text"},[E(" Ein Pfadmuster pro Zeile, ohne führenden Schrägstrich, z. B. "),e("code",null,"backend
1/*"),E(" . ")],-1))]),e("div",qt,[l[29]||(l[29]=e("label",{class:"form-label",for:"firewall-emails"},"Standard-Empfänger für Benachrichtigungen",-1)),_(e("input",{id:"firewall-emails","onUpdate:modelValue":l[6]||(l[6]=t=>d(u).firewall_notify_emails=t),class:"form-control",disabled:!o.canEdit,type:"text"},null,8,Wt),[[R,d(u).firewall_notify_emails]]),l[30]||(l[30]=e("div",{class:"form-text"},"Kommagetrennt. Wird verwendet, wenn eine Regel keine eigenen Empfänger hat.",-1))]),o.canEdit?(a(),i("div",Zt,[e("button",{class:"btn btn-danger",disabled:d(u).processing,type:"submit"},"Einstellungen speichern",8,Jt)])):r("",!0)],32)])],512),[[M,y.value==="settings"]]),x(ye,{modelValue:$.value,"onUpdate:modelValue":l[8]||(l[8]=t=>$.value=t),"click-to-close":!1,size:"xl",onClosed:U},{header:L(()=>[e("h2",Kt,n(A.value?"Neue Regel":`Regel bearbeiten: ${p.name}`),1)]),body:L(()=>[x(we,{modelValue:p,"onUpdate:modelValue":l[7]||(l[7]=t=>p=t),errors:w.value,"is-new":A.value,processing:O.value,schema:o.schema,onCancel:U,onSubmit:le},null,8,["modelValue","errors","is-new","processing","schema"])]),_:1},8,["modelValue"])])]),_:1})],64))}},rl=xe(Ht,[["__scopeId","data-v-87bacfa9"]]);export{rl as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.