summaryrefslogtreecommitdiffstats
path: root/kio/misc/kpac/script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kio/misc/kpac/script.cpp')
-rw-r--r--kio/misc/kpac/script.cpp465
1 files changed, 0 insertions, 465 deletions
diff --git a/kio/misc/kpac/script.cpp b/kio/misc/kpac/script.cpp
deleted file mode 100644
index 55faef8a1..000000000
--- a/kio/misc/kpac/script.cpp
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- Copyright (c) 2003 Malte Starostik <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-
-#include <cstdlib>
-#include <vector>
-#include <algorithm>
-#include <ctime>
-#include <cstring>
-
-#include <netdb.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-
-#include <tqregexp.h>
-#include <tqstring.h>
-
-#include <kurl.h>
-#include <kjs/object.h>
-#include <kresolver.h>
-
-#include "script.h"
-
-using namespace KJS;
-
-TQString UString::qstring() const
-{
- return TQString( reinterpret_cast< const TQChar* >( data() ), size() );
-}
-
-UString::UString( const TQString &s )
-{
- UChar* data = new UChar[ s.length() ];
- std::memcpy( data, s.unicode(), s.length() * sizeof( UChar ) );
- rep = Rep::create( data, s.length() );
-}
-
-namespace
-{
- class Address
- {
- public:
- struct Error {};
- static Address resolve( const UString& host )
- { return Address( host.qstring(), false ); }
- static Address parse( const UString& ip )
- { return Address( ip.qstring(), true ); }
-
- operator in_addr_t() const {
- const sockaddr_in* sin = m_address;
- return sin->sin_addr.s_addr;
- }
-
- operator String() const { return String( m_address.ipAddress().toString() ); }
-
- private:
- Address( const TQString& host, bool numeric )
- {
- int flags = 0;
-
- if ( numeric )
- flags = KNetwork::KResolver::NoResolve;
-
- KNetwork::KResolverResults addresses =
- KNetwork::KResolver::resolve( host, TQString::null, flags,
- KNetwork::KResolver::IPv4Family );
-
- if ( addresses.isEmpty() )
- throw Error();
-
- m_address = addresses.first().address().asInet();
- }
-
- KNetwork::KInetSocketAddress m_address;
- };
-
- struct Function : public ObjectImp
- {
- struct ResolveError {};
-
- virtual bool implementsCall() const { return true; }
-
- static int findString( const UString& s, const char* const* values )
- {
- int index = 0;
- UString lower = s.toLower();
- for ( const char* const* p = values; *p; ++p, ++index )
- if ( lower == *p ) return index;
- return -1;
- }
-
- static const tm* getTime( ExecState* exec, const List& args )
- {
- time_t now = std::time( 0 );
- if ( args[ args.size() - 1 ].toString( exec ).toLower() == "gmt" )
- return std::gmtime( &now );
- else return std::localtime( &now );
- }
-
- Boolean checkRange( int value, int min, int max )
- {
- return ( min <= max && value >= min && value <= max ) ||
- ( min > max && ( value <= min || value >= max ) );
- }
- };
-
- // isPlainHostName( host )
- // @returns true if @p host doesn't contains a domain part
- struct IsPlainHostName : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 1 ) return Undefined();
- return Boolean( args[ 0 ].toString( exec ).find( "." ) == -1 );
- }
- };
-
- // dnsDomainIs( host, domain )
- // @returns true if the domain part of @p host matches @p domain
- struct DNSDomainIs : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 2 ) return Undefined();
- TQString host = args[ 0 ].toString( exec ).qstring().lower();
- TQString domain = args[ 1 ].toString( exec ).qstring().lower();
- return Boolean( host.endsWith( domain ) );
- }
- };
-
- // localHostOrDomainIs( host, fqdn )
- // @returns true if @p host is unqualified or equals @p fqdn
- struct LocalHostOrDomainIs : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 2 ) return Undefined();
- UString host = args[ 0 ].toString( exec ).toLower();
- if ( host.find( "." ) == -1 ) return Boolean( true );
- UString fqdn = args[ 1 ].toString( exec ).toLower();
- return Boolean( host == fqdn );
- }
- };
-
- // isResolvable( host )
- // @returns true if host can be resolved via DNS
- struct IsResolvable : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 1 ) return Undefined();
- try { ::Address::resolve( args[ 0 ].toString( exec ) ); }
- catch ( const Address::Error& ) { return Boolean( false ); }
- return Boolean( true );
- }
- };
-
- // isInNet( host, subnet, mask )
- // @returns true if @p host is within the IP subnet
- // specified via @p subnet and @p mask
- struct IsInNet : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 3 ) return Undefined();
- try
- {
- in_addr_t host = Address::resolve( args[ 0 ].toString( exec ) );
- in_addr_t subnet = Address::parse( args[ 1 ].toString( exec ) );
- in_addr_t mask = Address::parse( args[ 2 ].toString( exec ) );
- return Boolean( ( host & mask ) == ( subnet & mask ) );
- }
- catch ( const Address::Error& )
- {
- return Undefined();
- }
- }
- };
-
- // dnsResolve( host )
- // @returns the IP address of @p host in dotted quad notation
- struct DNSResolve : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 1 ) return Undefined();
- try { return String(Address::resolve( args[ 0 ].toString( exec ))); }
- catch ( const Address::Error& ) { return Undefined(); }
- }
- };
-
- // myIpAddress()
- // @returns the local machine's IP address in dotted quad notation
- struct MyIpAddress : public Function
- {
- virtual Value call( ExecState*, Object&, const List& args )
- {
- if ( args.size() ) return Undefined();
- char hostname[ 256 ];
- gethostname( hostname, 255 );
- hostname[ 255 ] = 0;
- try { return String(Address::resolve( hostname )); }
- catch ( const Address::Error& ) { return Undefined(); }
- }
- };
-
- // dnsDomainLevels( host )
- // @returns the number of dots ('.') in @p host
- struct DNSDomainLevels : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 1 ) return Undefined();
- UString host = args[ 0 ].toString( exec );
- if ( host.isNull() ) return Number( 0 );
- return Number( std::count(
- host.data(), host.data() + host.size(), '.' ) );
- }
- };
-
- // shExpMatch( str, pattern )
- // @returns true if @p str matches the shell @p pattern
- struct ShExpMatch : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() != 2 ) return Undefined();
- TQRegExp pattern( args[ 1 ].toString( exec ).qstring(), true, true );
- return Boolean( pattern.exactMatch(args[ 0 ].toString( exec ).qstring()) );
- }
- };
-
- // weekdayRange( day [, "GMT" ] )
- // weekdayRange( day1, day2 [, "GMT" ] )
- // @returns true if the current day equals day or between day1 and day2 resp.
- // If the last argument is "GMT", GMT timezone is used, otherwise local time
- struct WeekdayRange : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() < 1 || args.size() > 3 ) return Undefined();
- static const char* const days[] =
- { "sun", "mon", "tue", "wed", "thu", "fri", "sat", 0 };
- int d1 = findString( args[ 0 ].toString( exec ), days );
- if ( d1 == -1 ) return Undefined();
-
- int d2 = findString( args[ 1 ].toString( exec ), days );
- if ( d2 == -1 ) d2 = d1;
- return checkRange( getTime( exec, args )->tm_wday, d1, d2 );
- }
- };
-
- // dateRange( day [, "GMT" ] )
- // dateRange( day1, day2 [, "GMT" ] )
- // dateRange( month [, "GMT" ] )
- // dateRange( month1, month2 [, "GMT" ] )
- // dateRange( year [, "GMT" ] )
- // dateRange( year1, year2 [, "GMT" ] )
- // dateRange( day1, month1, day2, month2 [, "GMT" ] )
- // dateRange( month1, year1, month2, year2 [, "GMT" ] )
- // dateRange( day1, month1, year1, day2, month2, year2 [, "GMT" ] )
- // @returns true if the current date (GMT or local time according to
- // presence of "GMT" as last argument) is within the given range
- struct DateRange : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() < 1 || args.size() > 7 ) return Undefined();
- static const char* const months[] =
- { "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "nov", "dec", 0 };
-
- std::vector< int > values;
- for ( int i = 0; i < args.size(); ++i )
- {
- int value = -1;
- if ( args[ i ].isA( NumberType ) )
- value = args[ i ].toInteger( exec );
- else value = findString( args[ i ].toString( exec ), months );
- if ( value >= 0 ) values.push_back( value );
- else break;
- }
-
- const tm* now = getTime( exec, args );
-
- // day1, month1, year1, day2, month2, year2
- if ( values.size() == 6 )
- return checkRange( ( now->tm_year + 1900 ) * 372 + now->tm_mon * 31 + now->tm_mday,
- values[ 2 ] * 372 + values[ 1 ] * 31 + values[ 0 ],
- values[ 5 ] * 372 + values[ 4 ] * 31 + values[ 3 ] );
-
- // day1, month1, day2, month2
- else if ( values.size() == 4 &&
- values[ 1 ] < 12 &&
- values[ 3 ] < 12 )
- return checkRange( now->tm_mon * 31 + now->tm_mday,
- values[ 1 ] * 31 + values[ 0 ],
- values[ 3 ] * 31 + values[ 2 ] );
-
- // month1, year1, month2, year2
- else if ( values.size() == 4 )
- return checkRange( ( now->tm_year + 1900 ) * 12 + now->tm_mon,
- values[ 1 ] * 12 + values[ 0 ],
- values[ 3 ] * 12 + values[ 2 ] );
-
- // year1, year2
- else if ( values.size() == 2 &&
- values[ 0 ] >= 1000 &&
- values[ 1 ] >= 1000 )
- return checkRange( now->tm_year + 1900, values[ 0 ], values[ 1 ] );
-
- // day1, day2
- else if ( values.size() == 2 &&
- args[ 0 ].isA( NumberType ) &&
- args[ 1 ].isA( NumberType ) )
- return checkRange( now->tm_mday, values[ 0 ], values[ 1 ] );
-
- // month1, month2
- else if ( values.size() == 2 )
- return checkRange( now->tm_mon, values[ 0 ], values[ 1 ] );
-
- // year
- else if ( values.size() == 1 && values[ 0 ] >= 1000 )
- return checkRange( now->tm_year + 1900, values[ 0 ], values[ 0 ] );
-
- // day
- else if ( values.size() == 1 && args[ 0 ].isA( NumberType ) )
- return checkRange( now->tm_mday, values[ 0 ], values[ 0 ] );
-
- // month
- else if ( values.size() == 1 )
- return checkRange( now->tm_mon, values[ 0 ], values[ 0 ] );
-
- else return Undefined();
- }
- };
-
- // timeRange( hour [, "GMT" ] )
- // timeRange( hour1, hour2 [, "GMT" ] )
- // timeRange( hour1, min1, hour2, min2 [, "GMT" ] )
- // timeRange( hour1, min1, sec1, hour2, min2, sec2 [, "GMT" ] )
- // @returns true if the current time (GMT or local based on presence
- // of "GMT" argument) is within the given range
- struct TimeRange : public Function
- {
- virtual Value call( ExecState* exec, Object&, const List& args )
- {
- if ( args.size() < 1 || args.size() > 7 ) return Undefined();
-
- std::vector< int > values;
- for ( int i = 0; i < args.size(); ++i )
- if ( args[ i ].isA( NumberType ) )
- values.push_back( args[ i ].toInteger( exec ) );
- else break;
-
- const tm* now = getTime( exec, args );
-
- // hour1, min1, sec1, hour2, min2, sec2
- if ( values.size() == 6 )
- return checkRange( now->tm_hour * 3600 + now->tm_min * 60 + now->tm_sec,
- values[ 0 ] * 3600 + values[ 1 ] * 60 + values[ 2 ],
- values[ 3 ] * 3600 + values[ 4 ] * 60 + values[ 5 ] );
-
- // hour1, min1, hour2, min2
- else if ( values.size() == 4 )
- return checkRange( now->tm_hour * 60 + now->tm_min,
- values[ 0 ] * 60 + values[ 1 ],
- values[ 2 ] * 60 + values[ 3 ] );
-
- // hour1, hour2
- else if ( values.size() == 2 )
- return checkRange( now->tm_hour, values[ 0 ], values[ 1 ] );
-
- // hour
- else if ( values.size() == 1 )
- return checkRange( now->tm_hour, values[ 0 ], values[ 0 ] );
-
- else return Undefined();
- }
- };
-
- void registerFunctions( ExecState* exec, Object& global )
- {
- global.put( exec, "isPlainHostName",
- Object( new IsPlainHostName ) );
- global.put( exec, "dnsDomainIs",
- Object( new DNSDomainIs ) );
- global.put( exec, "localHostOrDomainIs",
- Object( new LocalHostOrDomainIs ) );
- global.put( exec, "isResolvable",
- Object( new IsResolvable ) );
- global.put( exec, "isInNet",
- Object( new IsInNet ) );
- global.put( exec, "dnsResolve",
- Object( new DNSResolve ) );
- global.put( exec, "myIpAddress",
- Object( new MyIpAddress ) );
- global.put( exec, "dnsDomainLevels",
- Object( new DNSDomainLevels ) );
- global.put( exec, "shExpMatch",
- Object( new ShExpMatch ) );
- global.put( exec, "weekdayRange",
- Object( new WeekdayRange ) );
- global.put( exec, "dateRange",
- Object( new DateRange ) );
- global.put( exec, "timeRange",
- Object( new TimeRange ) );
- }
-}
-
-namespace KPAC
-{
- Script::Script( const TQString& code )
- {
- ExecState* exec = m_interpreter.globalExec();
- Object global = m_interpreter.globalObject();
- registerFunctions( exec, global );
-
- Completion result = m_interpreter.evaluate( code );
- if ( result.complType() == Throw )
- throw Error( result.value().toString( exec ).qstring() );
- }
-
- TQString Script::evaluate( const KURL& url )
- {
- ExecState *exec = m_interpreter.globalExec();
- Value findFunc = m_interpreter.globalObject().get( exec, "FindProxyForURL" );
- Object findObj = Object::dynamicCast( findFunc );
- if (!findObj.isValid() || !findObj.implementsCall())
- throw Error( "No such function FindProxyForURL" );
-
- Object thisObj;
- List args;
- args.append(String(url.url()));
- args.append(String(url.host()));
- Value retval = findObj.call( exec, thisObj, args );
-
- if ( exec->hadException() ) {
- Value ex = exec->exception();
- exec->clearException();
- throw Error( ex.toString( exec ).qstring() );
- }
-
- return retval.toString( exec ).qstring();
- }
-}
-
-// vim: ts=4 sw=4 et