@luminati-io/luminati-proxy
Version:
A configurable local proxy for brightdata.com
269 lines (261 loc) • 9.76 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint react:true, es6:true*/
import React from 'react';
import Pure_component from '/www/util/pub/pure_component.js';
import $ from 'jquery';
import setdb from '../../../util/setdb.js';
import conv from '../../../util/conv.js';
import {T} from '../common/i18n.js';
import {with_www_api, Note} from '../common.js';
import {Config, Tab_context} from './common.js';
import Users_modal from './users_modal.js';
import Bw_limit_modal from './bw_limit_modal.js';
const route_err_opt = [
{key: 'pass_dyn (default)', value: 'pass_dyn'},
{key: 'block', value: 'block'},
];
const yes_no_select_opt = [
{key: 'Yes', value: 'full'},
{key: 'No', value: 'none'},
];
const tls_lib_opt = [
{key: 'OpenSSL (default)', value: 'open_ssl'},
{key: 'BoringSSL', value: 'flex_tls'},
];
const render_zones = ['unblocker', 'serp'];
const Limit_zagent_note = with_www_api(({www_api, prefix='This option'})=>{
const path = '/cp/zones/lpm';
const href = www_api+path;
const display_url = new URL(www_api).hostname+path;
return <T>{t=>
<Note>
<span>{t(prefix+' is available only in the Cloud Proxy '
+'Manager, read more on')}</span>{' '}
<a className="link" href={href} target="_blank"
rel="noopener noreferrer">{display_url}</a>
</Note>
}</T>;
});
const Limit_zone_note = ({zones})=>{
return <T>{t=>
<Note>
<span>
{t(`This option is available only for ${zones.join(' or ')} zone`)}
</span>
</Note>
}</T>;
};
export default class General extends Pure_component {
state = {defaults: {}};
get_curr_plan = setdb.get('head.proxy_edit.get_curr_plan');
set_field = setdb.get('head.proxy_edit.set_field');
proxy_connection_type_opt(t){
return this.state.defaults.proxy_connection_type=='https' ? [
{key: t('HTTPS (default)'), value: 'https'},
{key: 'HTTP', value: 'http'}
] : [
{key: t('HTTP (default)'), value: 'http'},
{key: 'HTTPS', value: 'https'}
];
}
componentDidMount(){
this.setdb_on('head.defaults',
defaults=>this.setState({defaults: defaults||{}}));
this.setdb_on('head.proxy_edit.form', form=>{
form && this.setState({form});
});
this.setdb_on('head.consts', consts=>{
consts && consts.proxy && this.setState({proxy: consts.proxy});
});
this.setdb_on('head.settings', settings=>{
settings && this.setState({settings});
});
this.setdb_on('head.proxy_edit.form.bw_limit', ()=>this.forceUpdate());
}
multiply_users_changed = val=>{
if (val)
this.open_users_modal();
};
bw_limit_changed = val=>{
if (val)
return this.open_bw_limit_modal();
this.set_field('bw_limit', false);
};
bw_limit_hide = ()=>{
if (this.state.form.bw_limit!==true)
return;
this.set_field('bw_limit', false);
};
multiply_static_changed = val=>{
const {form} = this.state;
const size = Math.max(form.ips.length, form.vips.length);
if (val)
{
this.set_field('pool_size', 1);
this.set_field('multiply', size);
this.open_static_modal();
return;
}
this.set_field('pool_size', size);
this.set_field('multiply', 1);
};
ssl_changed = val=>{
if (val)
return;
this.set_field('tls_lib', 'open_ssl');
this.set_field('av_check', false);
};
open_static_modal = ()=>$('#allocated_ips').modal('show');
open_users_modal = ()=>$('#users_modal').modal('show');
open_bw_limit_modal = ()=>$('#bw_limit_modal').modal('show');
render(){
if (!this.state.form || !this.state.proxy || !this.state.settings)
return null;
const {zagent, av_server} = this.state.settings;
// XXX krzysztof: cleanup type (index.js rotation.js general.js)
const curr_plan = this.get_curr_plan();
const is_render_plan = curr_plan.type=='unblocker' || !!curr_plan.serp;
let type;
if (curr_plan && (curr_plan.type||'').startsWith('static'))
type = 'ips';
else if (curr_plan && !!curr_plan.vip)
type = 'vips';
const form = this.state.form;
const note_ips = form.multiply_ips ?
<a className="link" onClick={this.open_static_modal}>
Select IPs
</a> : null;
const note_vips = form.multiply_vips ?
<a className="link" onClick={this.open_static_modal}>
Select gIPs
</a> : null;
const disabled_wl = (this.state.settings.fixed_whitelist_ips||[])
.concat(this.state.settings.whitelist_ips);
const note_users = form.multiply_users ?
<a className="link" onClick={this.open_users_modal}>
<T>Select users</T>
</a> : null;
const get_bw_limit_str = ({bytes, days}={})=>{
if (!+bytes || !+days)
return '';
return conv.scaled_bytes(bytes)+'B/'
+(days>1 ? `${days} days` : 'day');
};
const bw_limit_str = get_bw_limit_str(form.bw_limit);
const bw_limit_prefix = zagent && bw_limit_str ?
<span className="bw_limit_str"><T>{bw_limit_str}</T></span> : null;
const note_bw_limit = form.bw_limit ?
<a className="link" onClick={this.open_bw_limit_modal}>
<T>Set limit</T>
</a> : null;
// XXX platon: use docs url from server_conf
return <div className="general">
<Tab_context.Provider value="general">
<Users_modal form={this.state.form}/>
<Bw_limit_modal form={this.state.form} on_hide={this.bw_limit_hide}
bw_limit_webhook_url={this.state.settings.bw_limit_webhook_url}
bw_th_webhook_url={this.state.settings.bw_th_webhook_url}
/>
<Config type="text" id="internal_name"/>
<Config type="number" id="port"/>
<Config
type="pins"
id="whitelist_ips"
disabled_ips={disabled_wl}
no_any={zagent}
faq={{url: 'https://docs.brightdata.com/proxy-networks/'
+'proxy-manager/security#block-unwanted-sources-from-using-'
+'the-proxy-managers-ports'}}
/>
<T>{t=><Config type="select"
disabled={zagent}
data={this.proxy_connection_type_opt(t)}
id="proxy_connection_type"
faq={{url: 'https://docs.brightdata.com/proxy-networks/'
+'proxy-manager/faqs#how-to-connect-to-superproxy-via-https'}}
/>}</T>
<Config
type="yes_no"
id="ssl"
on_change={this.ssl_changed}
faq={{url: 'https://docs.brightdata.com/general/account/'
+'ssl-certificate#how-does-ssl-analyzing-works'}}
/>
{form.ssl &&
<Config
type="select"
id="tls_lib"
disabled={!zagent}
note={!zagent && <Limit_zagent_note prefix='Boring SSL'/>}
data={tls_lib_opt}
/>
}
{form.ssl && av_server &&
<Config
type="yes_no"
id="av_check"
note={!zagent && <Limit_zagent_note/>}
disabled={!zagent}
/>
}
<Config type="select" data={route_err_opt} id="route_err"/>
<Config type="select_number" id="multiply"
data={[0, 5, 20, 100, 500]}/>
{type=='ips' &&
<Config
type="yes_no"
id="multiply_ips"
on_change={this.multiply_static_changed}
note={note_ips}
/>
}
{type=='vips' &&
<Config
type="yes_no"
id="multiply_vips"
on_change={this.multiply_static_changed}
note={note_vips}
/>
}
<Config
type="yes_no"
id="multiply_users"
on_change={this.multiply_users_changed}
note={note_users}
/>
<Config
type="select"
id="iface"
data={this.state.proxy.iface.values}
/>
<Config type="pins" id="smtp" exact no_any/>
<Config
type="select"
id="debug"
data={yes_no_select_opt}
faq={{url: 'https://docs.brightdata.com/proxy-networks/'
+'proxy-manager/faqs#how-can-i-view-my-request-details'}}
/>
<Config type="select" id="lpm_auth" data={yes_no_select_opt}/>
<Config type="yes_no" id="const" />
<Config
type="yes_no"
id="bw_limit"
on_change={this.bw_limit_changed}
prefix={bw_limit_prefix}
disabled={!zagent}
note={!zagent && <Limit_zagent_note/> || note_bw_limit}
skip_save={true}
/>
<Config
type="yes_no"
id="render"
disabled={!is_render_plan}
note={!is_render_plan && <Limit_zone_note zones={render_zones}/>}
/>
<Config type="yes_no" id="follow_redirect" />
<Config type="yes_no" id="new_proxy_port" />
</Tab_context.Provider>
</div>;
}
}