File: /www/server/panel/BTPanel/static/js/index377.js
import{c as V,e as L,_ as I,k as _,w as S,M as v,m as T,d3 as z,cZ as G}from"./utils-lib.js?v=1777008528";import{aI as M,aJ as H,r as u,H as U,e as P,bc as Y,c as Z,j as y,k as f,q as c,p as o,s as w,x as b,v as C,F as K,B as Q,L as X,z as ee}from"./base-lib.js?v=1777008528";import{u as te,v as A,n as ae,w as se,x as ne,y as ie,z as x,A as B,B as oe,C as re,D as le,E as ue,G as ce}from"./useStore15.js?v=1777008528";import{g as q,k as de}from"./index3.js?v=1777008528";const _e=H("FTP_LOGS_ANALYSIS",()=>{const e=u(),a=u({scanStatus:!1,autoScanText:"定时自动扫描",btn:"立即扫描",data:[]}),t=u({login_error:!0,time:!0,area:!0,anonymous:!0,upload_shell:!0,day:7,otherDay:1,user:"all",userList:[],cycle:1,channel:[],option:{},config:{login_error:5,time:{start_time:0,end_time:24},area:{country:[],city:[]},upload_shell:[],login_error_des:"超过5次",time_des:"0点至24点范围外",area_des:"非地区",upload_shell_des:"未配置"},search:"",status:!0}),s=u([]),d=u(null),i=u([]),g=u(),r=u(!1),l=u(),p=u([]),W=u();return{ftpAnalysisList:a,ftpScanTable:e,ruleForm:t,whiteTableData:i,ip:g,setScanInfo:d,addFtpInfo:W,isAutoScan:l,userOptions:p,isLoading:r,areaOptions:s}}),j=()=>M(_e()),{payment:pe}=V(),{isRefreshFtpList:J}=te(),{ftpAnalysisList:m,ruleForm:n,whiteTableData:ge,ip:O,setScanInfo:me,addFtpInfo:ve,isAutoScan:F,userOptions:D,isLoading:E,areaOptions:ye}=j(),fe=async({ip:e})=>{await S({icon:"warning-filled",title:"IP封禁",content:"封禁【"+e+"】后,将不再允许此IP访问服务器,是否继续操作?"});const a=JSON.stringify({choose:"address",address:e,domain:"",types:"drop",brief:"FTP日志分析点击IP拉黑"});(await _({loading:"正在封禁IP,请稍后...",request:se({data:a}),data:{status:Boolean},message:!0})).status&&h()},he=async({user:e,id:a})=>{if(a===0)return v.error("匿名用户不可删除"),!1;await S({icon:"warning-filled",title:"删除FTP用户",content:"删除选中的FTP用户后,该FTP用户将彻底失去访问和操作权限,是否继续操作?"}),(await _({loading:"正在删除FTP用户,请稍后...",request:ne({id:a,username:e}),data:{status:Boolean},message:!0})).status&&(h(),J.value=!0)},Se=async({user:e,id:a})=>{if(a===0)return v.error("匿名用户不可停用");await S({icon:"warning-filled",title:"停用FTP用户",content:"停用【"+e+"】后,该FTP用户将失去访问权限,是否继续操作?"});const t=await _({loading:"正在停用FTP用户,请稍后...",request:ie({id:a,username:e,status:0}),data:{status:Boolean},message:!0});t!=null&&t.status&&(h(),J.value=!0)},we=async({ip:e})=>{await S({icon:"warning-filled",title:"忽略IP",content:"忽略【"+e+"】后,该IP将加入白名单中,FTP日志分析将不在记录该IP的数据,是否继续操作?"}),(await _({loading:"正在忽略IP,请稍后...",request:x({ip:e,type:"add"}),data:{status:Boolean},message:!0})).status&&h()},h=async(e={search:n.value.search,day:n.value.day==="other"?Number(n.value.otherDay):Number(n.value.day),user:n.value.user==="all"?"[]":JSON.stringify(n.value.userList)})=>{try{const a=await B(e);if(a.status){m.value.data=[];for(const t in a.data){const s=a.data[t];m.value.data.push({time:s.exec_time,type:s.type,user:s.user,ip:t,id:s.id})}}}catch(a){}},be=()=>{m.value={scanStatus:!1,autoScanText:"定时自动扫描",btn:"立即扫描",data:[]},n.value={login_error:!0,time:!0,area:!0,anonymous:!0,upload_shell:!0,day:7,otherDay:1,user:"all",userList:[],cycle:1,channel:[],option:{},config:{login_error:5,time:{start_time:0,end_time:24},area:{country:[],city:[]},upload_shell:[],login_error_des:"超过5次",time_des:"0点至24点范围外",area_des:"非地区",upload_shell_des:"未配置"},search:"",status:!0}},Ye=U({login_error:[{validator:(e,a,t)=>{a>0?t():t("请输入大于0的整数")},trigger:["change"]}],se_time:[{validator:(e,a,t)=>{!n.value.config.start_time||!n.value.config.end_time?t("开始时间和结束时间不能为空"):t()},trigger:["blur"]}]}),Ze=e=>{n.value.config.start_time=e},Ke=e=>{n.value.config.end_time=e},Pe=(e=n.value.config)=>({time:JSON.stringify({start_time:Number(e.start_time.split(":")[0]),end_time:Number(e.end_time.split(":")[0])}),area:JSON.stringify({country:e.area.country,city:[]}),upload_shell:JSON.stringify(e.upload_shell_br.split("\n")),login_error:e.login_error}),Qe=async e=>{await me.value.validate();const a=Pe();(await _({loading:"正在提交中数据,请稍候...",request:le(a),message:!0})).status&&(k(),e&&e())},Te=()=>{const e=["美国","中国","印度","日本","德国","英国","法国","俄罗斯","巴西","加拿大","意大利","澳大利亚","韩国","墨西哥","印度尼西亚","沙特阿拉伯","南非","阿根廷","土耳其","西班牙"];ye.value=e.map(a=>({label:a,value:a}))},Fe=async e=>{(await _({loading:"正在删除白名单IP,请稍后...",request:x({ip:e,type:"del"}),data:{status:Boolean},message:!0})).status&&(R(),h())},Xe=[{label:"IP",render:e=>P("span",null,[e])},q([{onClick:Fe,title:"删除"}])],et=async(e={ip:O.value,type:"add"})=>{if(!e.ip){v.error("请输入ip地址");return}if(!/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.test(e.ip)){v.error("请输入正确的ip地址");return}await _({loading:"正在添加白名单IP,请稍后...",request:x(e),data:{status:Boolean},message:!0,success:a=>{a.status&&(O.value="",R(),h())}})},R=async()=>{await _({loading:"正在获取白名单列表,请稍后...",request:oe(),data:{ip:[Array,ge]}})},tt=Y({otherDay:[{validator:(e,a,t)=>{n.value.day==="other"&&(a<1||!Number.isInteger(parseFloat(a)))?t(new Error("天数必须大于0的整数")):t()},trigger:["change"]}],userList:[{validator:(e,a,t)=>{n.value.user==="other"&&a.length===0?t("请选择指定用户"):t()},trigger:["change"]}],risk:[{validator:(e,a,t)=>{n.value.login_error||n.value.time||n.value.area||n.value.anonymous||n.value.upload_shell?t():t("请至少选择一个安全风险")},trigger:["change"]}],channel:[{type:"array",required:!0,message:"请至少选择一个告警方式",trigger:"change"}]}),Le=e=>{const{country:a,city:t}=e,s=T(a)?a.join(","):"",d=T(t)?t.join(","):"";return"非".concat(s).concat(s&&d?",":"").concat(d,"地区")},k=async()=>{E.value=!0;try{const{data:e}=await ue(),{area:a,cron_task_status:t,time:s,login_error:d,upload_shell:i,cron_task:g}=e;if(n.value.config={...e,login_error_des:"超过".concat(d,"次"),time_des:"".concat(s.start_time,"点至").concat(s.end_time,"点范围外"),area_des:Le(a),upload_shell_des:T(i)?i.join(","):""},F.value&&t){const{task_type:r,cycle:l,channel:p}=g;Object.assign(n.value,{anonymous:r.anonymous,area:r.area,login_error:r.login_error,time:r.time,upload_shell:r.upload_shell,cycle:l,channel:p?p.split(","):[],status:!!t})}else Object.assign(n.value,{anonymous:!0,area:!0,login_error:!0,time:!0,upload_shell:!0})}catch(e){}finally{E.value=!1}},at=()=>{L({title:"扫描触发条件",area:[50,34],btn:["保存","取消"],component:()=>I(()=>import("./scan.js?v=1777008528"),__vite__mapDeps([]),import.meta.url)})},st=e=>{n.value.user=e,e==="other"&&(n.value.anonymous=!1)},Ie=async()=>{try{const{data:e}=await ce();T(e)&&(D.value=[],e.forEach(a=>{D.value.push({label:a,value:a})}),n.value.userList=e.length>0?[e[0]]:[])}catch(e){}},xe=(e=n.value,a=F.value)=>{let t={};const s=JSON.stringify({anonymous:e.anonymous,area:e.area,login_error:e.login_error,time:e.time,upload_shell:e.upload_shell});return a?t={task_type:s,cycle:1,channel:e.channel.join(","),status:e.status?1:0}:t={search:s,day:e.day==="other"?Number(e.otherDay):e.day,username:e.user==="all"?"[]":JSON.stringify(e.userList)},t},nt=async e=>{await ve.value.validate();let a;try{a=v.load("扫描中...");const t=xe();if(n.value.search=(t==null?void 0:t.search)||(t==null?void 0:t.task_type),F.value){const s=await re(t);v.request(s),s.status&&k(),e()}else{const s=await B(t);if(v.request({status:s.status,msg:s.status?"扫描成功":"扫描失败",time:500}),s.status){m.value.data=[];for(const d in s.data){const i=s.data[d];m.value.data.push({time:i.exec_time,type:i.type,user:i.user,ip:d,id:i.id}),m.value.data.sort((g,r)=>{var l,p;return new Date((l=r.time)==null?void 0:l.replace(/-/g,"/")).getTime()-new Date((p=g.time)==null?void 0:p.replace(/-/g,"/")).getTime()})}m.value.btn="重新扫描",m.value.scanStatus=!0,e()}}}catch(t){}finally{a==null||a.close()}},it=()=>{n.value.config={login_error:5,time:{start_time:0,end_time:24},area:{country:[],city:[]},upload_shell:[],login_error_des:"超过5次",time_des:"0点至24点范围外",area_des:"非地区",upload_shell_des:"未配置"},Ie(),k()},ot=()=>{const e=n.value.config;Object.assign(n.value.config,{...e,start_time:e.time.start_time<10?"0".concat(e.time.start_time,":00"):"".concat(e.time.start_time,":00"),end_time:e.time.end_time<10?"0".concat(e.time.end_time,":00"):"".concat(e.time.end_time,":00"),upload_shell_br:e.upload_shell.join("\n")}),Te()},ke=[{label:"类型",prop:"type",minWidth:100},{label:"用户名",prop:"user",minWidth:60},{label:"IP",prop:"ip"},{label:"操作时间",prop:"time"},q([{onClick:fe,title:"IP拉黑",width:50},{onClick:he,title:"删除账号",width:60},{onClick:Se,title:"停用账号",width:60},{onClick:we,title:"忽略"}])],Ce=()=>L({title:"FTP日志白名单",area:[70,45],component:()=>I(()=>import("./whitelist.js?v=1777008528"),__vite__mapDeps([]),import.meta.url)}),N=e=>{L({title:"FTP日志".concat(e?"分析条件":"自动分析推送"),area:e?[66,30]:[70],btn:e?"立即扫描":"保存配置",component:()=>I(()=>import("./timed-scan.js?v=1777008528"),__vite__mapDeps([]),import.meta.url)})},$=async e=>{if(F.value=!e,pe.value.authType==="ltd"){const{status:a,msg:t}=await _({loading:"正在获取日志服务状态,请稍后...",request:A({exec_name:"getlog"}),data:{status:Boolean,msg:String}});if(!a||t==="stop"){await S({icon:"warning-filled",title:"开启FTP日志服务",content:"FTP日志服务未启动,无法记录访问日志,是否启动日志服务?"});const s=await _({loading:"正在开启FTP日志服务,请稍后...",request:A({exec_name:"start"}),data:{status:Boolean},message:!0});s!=null&&s.status&&N(e)}N(e)}else v.error("企业版专享功能!"),await de({sourceId:ae.value?260:220})},Ae=[{icon:"user",title:"多次登录失败"},{icon:"login-address",title:"登录地区异常"},{icon:"shell-file",title:"上传脚本文件"},{icon:"anonymous",title:"匿名用户登录"},{icon:"login-time",title:"登录时间异常"}],rt=[{label:"7天",value:7},{label:"30天",value:30},{label:"自定义",value:"other"}],lt=[{label:"全部",value:"all"},{label:"指定用户",value:"other"}],Oe={class:"ftp-log-scan"},De={class:"scan-header"},Ee={class:"scan-header-left"},Ne={class:"scan-header-title"},$e={key:0},Be={key:1},qe={class:"scan-content"},je={key:0,class:"scan-content-preview"},Je={class:"scan-content-preview-list"},Re={class:"text-small"},We={key:1},Ve=Z({__name:"index",setup(e,{expose:a}){const{ftpAnalysisList:t,ftpScanTable:s}=j();return a(be),(d,i)=>{const g=ee,r=z;return y(),f("div",Oe,[c("div",De,[c("div",Ee,[i[4]||(i[4]=c("i",{class:"svgtofont-icon-ftp-log !text-large54 text-tertiary mr-16px"},null,-1)),c("div",Ne,[o(t).scanStatus?(y(),f("div",Be,"扫描完成,"+w(o(t).data.length?"共扫描出"+o(t).data.length+"条风险记录":"未扫描出风险记录"),1)):(y(),f("div",$e,"FTP日志扫描,快速扫描当前FTP的安全详情")),c("p",null,[i[2]||(i[2]=b(" 推荐定期自动扫描功能,定期扫描生成分析结果并发送通知【 ",-1)),c("span",{class:"bt-link",onClick:i[0]||(i[0]=l=>o($)(0))},w(o(t).autoScanText),1),i[3]||(i[3]=b(" 】 ",-1))])])]),P(g,{class:"scan-header-btn",type:"primary",title:o(t).btn,onClick:i[1]||(i[1]=l=>o($)(1))},{default:C(()=>[b(w(o(t).btn),1)]),_:1},8,["title"])]),c("div",qe,[o(t).scanStatus?(y(),f("div",We,[P(g,{class:"!mb-[1rem]",onClick:o(Ce)},{default:C(()=>[...i[6]||(i[6]=[b(" 白名单 ",-1)])]),_:1},8,["onClick"]),P(r,{ref_key:"ftpScanTable",ref:s,"max-height":"310",column:o(ke),data:o(t).data,description:"扫描列表为空"},null,8,["column","data"])])):(y(),f("div",je,[i[5]||(i[5]=c("div",null,"支持以下FTP日志安全风险扫描:",-1)),c("div",Je,[(y(!0),f(K,null,Q(o(Ae),(l,p)=>(y(),f("div",{class:"preview-list-item",key:p},[c("i",{class:X("svgtofont-icon-".concat(l.icon," text-extraLarge mr-4px text-tertiary"))},null,2),c("span",Re,w(l.title),1)]))),128))])]))])])}}}),ze=G(Ve,[["__scopeId","data-v-f6e94919"]]),ut=Object.freeze(Object.defineProperty({__proto__:null,default:ze},Symbol.toStringTag,{value:"Module"}));export{et as a,it as b,nt as c,at as d,Ke as e,rt as f,R as g,lt as h,ot as i,st as j,ut as k,Qe as o,Ye as r,Ze as s,tt as t,j as u,Xe as w};
function __vite__mapDeps(indexes) {
if (!__vite__mapDeps.viteFileDeps) {
__vite__mapDeps.viteFileDeps = []
}
return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
}