@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
111 lines (103 loc) • 3.97 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint react:true, es6:true*/
import React from 'react';
import ajax from '../../../util/ajax.js';
import {Chrome_table} from '../chrome_widgets.js';
import Pure_component from '/www/util/pub/pure_component.js';
import {Note, Ext_tooltip} from '../common.js';
import moment from 'moment';
import {withRouter, Switch, Route, Redirect} from 'react-router-dom';
import Har_viewer from '../har_viewer.js';
import setdb from '../../../util/setdb.js';
import {Nav_tabs, Nav_tab} from '../common/nav_tabs.js';
import Tooltip from '../common/tooltip.js';
import {T} from '../common/i18n.js';
moment.relativeTimeThreshold('ss', 60);
moment.relativeTimeThreshold('s', 50);
const Logs = withRouter(class Logs extends Pure_component {
set_tab = id=>{
const port = this.props.match.params.port;
const pathname = `/proxy/${port}/logs/${id}`;
this.props.history.push({pathname});
};
render(){
const path = this.props.match.path;
return <div className="in_logs vbox"
style={{height: '100%', width: '100%'}}>
<Nav set_tab={this.set_tab}/>
<div className="window_wrapper vbox">
<Switch>
<Route path={`${path}/banned_ips`} component={Banned_ips}/>
<Route path={`${path}/har`} component={Har_viewer}/>
<Route exact path={path} component={({location})=>
<Redirect to={`${location.pathname}/har`}/>}/>
</Switch>
</div>
</div>;
}
});
export default Logs;
const Nav = ({set_tab, cur_tab})=>
<Nav_tabs narrow set_tab={set_tab} cur_tab={cur_tab}>
<Nav_tab id="har" title="HAR viewer"/>
<Nav_tab id="banned_ips" title="lpm_banned_ip"/>
</Nav_tabs>;
const banned_ips_cols = [
{id: 'unban', width: 25},
{id: 'ip', title: 'IP'},
{id: 'domain', title: 'Domain'},
{id: 'ms', title: 'Expire'},
];
const Banned_ips = withRouter(class Banned_ips extends Pure_component {
state = {ips: [], unbanning: false};
componentDidMount(){
this.fetch_ips_data();
}
fetch_ips_data = ()=>{
const _this = this;
return this.etask(function*(){
const port = _this.props.match.params.port;
const url = `/api/banlist/${port}?full=true`;
const data = yield ajax.json({url});
_this.setState({ips: data.ips});
});
};
unbanip = (ip, domain)=>{
const _this = this;
this.setState({unbanning: true});
return this.etask(function*(){
this.on('finally', ()=>_this.setState({unbanning: false}));
const port = _this.props.match.params.port;
const data = yield ajax.json({
url: `/api/proxies/${port}/unbanip`,
method: 'POST',
data: {ip, domain},
});
_this.setState({ips: data.ips});
});
};
render(){
const {ips, unbanning} = this.state;
if (setdb.get('head.proxy_edit.form.ext_proxies'))
return <Note><Ext_tooltip/></Note>;
return <Chrome_table
title={<T>{t=>t('lpm_banned_ip')+` (${ips.length})`}</T>}
cols={banned_ips_cols} class_name="banned_ips_panel">
{ips.map(d=>
<tr key={`${d.ip}-${d.domain}`}>
<td>
<Tooltip title="Unban IP">
<button className="btn_unban" disabled={unbanning}
onClick={()=>this.unbanip(d.ip, d.domain)}>
<i className="chrome_icon return"/>
</button>
</Tooltip>
</td>
<td>{d.ip}</td>
<td>{d.domain||' - '}</td>
<td>{d.to ? moment(d.to).fromNow() : ' - '}</td>
</tr>
)}
</Chrome_table>;
}
});