diff --git a/src/warden-server/lib/Warden.t b/src/warden-server/lib/Warden.t index 956f3f69b8afa06ce35dc1bfb8769e5ad42bbe1c..7f0ecc3ec03f5943b0be6148454b9ee2fcab3692 100644 --- a/src/warden-server/lib/Warden.t +++ b/src/warden-server/lib/Warden.t @@ -5,76 +5,140 @@ use warnings; use DBI; use DBD::mysql; +use Data::Dumper; -use Test::More tests => 2; -#use Test::Exception; +use Test::More tests => 18; +use Test::MockModule; +use Test::Exception; use lib '..'; use Warden; # Fake $ENV values BEGIN { - $ENV{'SSL_CLIENT_S_DN_CN'} = '?'; - $ENV{'SSL_CLIENT_CERT'} = '?'; - $ENV{'REMOTE_ADDR'} = '?'; + $ENV{'SSL_CLIENT_S_DN_CN'} = 'warden-dev.cesnet.cz'; + $ENV{'SSL_CLIENT_CERT'} = '-----BEGIN CERTIFICATE----- +MIIEZzCCA0+gAwIBAgIRAKV1flST9dLTKDnQZsgWFmQwDQYJKoZIhvcNAQEFBQAw +NjELMAkGA1UEBhMCTkwxDzANBgNVBAoTBlRFUkVOQTEWMBQGA1UEAxMNVEVSRU5B +IFNTTCBDQTAeFw0xMTA4MTgwMDAwMDBaFw0xMzA4MTcyMzU5NTlaMD0xCzAJBgNV +BAYTAkNaMQ8wDQYDVQQKEwZDRVNORVQxHTAbBgNVBAMTFHdhcmRlbi1kZXYuY2Vz +bmV0LmN6MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxIzyexCL/CB6 +COj691JLEWYEVkBLhROqbENk0ka/LbTtS5oNS3WDJVOK7aoHO3yluAdg1VocfFeY +hTgZGAzC82IuNLc+873XTfO2bzotbJL31CBUwpz2QhEAjGgjdvSx++VZAlbDKIa7 +RnRcp9AsxPgqlUokVZbmR55sRO7QPaFqBUO061rj56uKzZocXy9RB+vVBQFUR5CF +GKOJhsiRU3GtHpEshKpOGX6jiC5OkUkcVr61Fb4BgKPFFptiiuwTuHUM40PLAdC/ +B2lWdt4qPZqeiDFOVAQJH2tpi0Bhn2dmS1ttU76qpfP4RCPXZFxdxqxWgMjGq7Fp +ON3G3ySb3QIDAQABo4IBZzCCAWMwHwYDVR0jBBgwFoAUDL2TaAzz3qujSWsrN1dH +6pDjue0wHQYDVR0OBBYEFMfGqZzdRFP42/ewN/5kPQoI83hxMA4GA1UdDwEB/wQE +AwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjAYBgNVHSAEETAPMA0GCysGAQQBsjEBAgIdMDoGA1UdHwQzMDEwL6AtoCuGKWh0 +dHA6Ly9jcmwudGNzLnRlcmVuYS5vcmcvVEVSRU5BU1NMQ0EuY3JsMG0GCCsGAQUF +BwEBBGEwXzA1BggrBgEFBQcwAoYpaHR0cDovL2NydC50Y3MudGVyZW5hLm9yZy9U +RVJFTkFTU0xDQS5jcnQwJgYIKwYBBQUHMAGGGmh0dHA6Ly9vY3NwLnRjcy50ZXJl +bmEub3JnMB8GA1UdEQQYMBaCFHdhcmRlbi1kZXYuY2VzbmV0LmN6MA0GCSqGSIb3 +DQEBBQUAA4IBAQC/mZ2bKGj4ysHVB4q/skhYXMiTYBmVD7G7X434YIg70VDBM5IJ +efNNfx8HNdCprboX5PSPCpxl9n3TPARnEO2cm7XvVvt+wkdjNOys8z7a2DIPaeJ+ +An3sIPzWUtm85UxujghIJ9nPh1ovZ75cQ2HF5C79qCyKzHtfP77Kq61Nm2Ay4aTq +gWyjFAPRjnB9fczhjdzntVRdjUFVq8z4ifq3Lv+hbN6aOjhfKRt8Ksr3IFlfKJdy +0sE0lEZdjG+O8rsuHCT/c+90IvGsG5JLT5SPJIxwQ1+fPJDfB37VWmUC9meSe7rt +iP0EQsnY1ytKuyUylJl0FiF/wG3rB8N7qlua +-----END CERTIFICATE-----'; + $ENV{'REMOTE_ADDR'} = '195.113.161.39'; $ENV{'SERVER_NAME'} = 'warden-dev.cesnet.cz'; $ENV{'SERVER_ADDR'} = '195.113.161.39'; $ENV{'SERVER_PORT'} = '443'; -} - -my $ret; + $Warden::MAX_EVENTS_LIMIT = "1000001"; + %Warden::VALID_STRINGS = ( + 'type' => ['portscan', 'bruteforce', 'probe', 'spam', 'phishing', 'botnet_c_c', 'dos', 'malware', 'copyright', 'webattack', 'test', 'other'], + 'source_type' => ['IP', 'URL', 'Reply-To:']); + my $correctDBH = DBI->connect("DBI:mysql:database=warden;host=localhost", "root", "w4rd3n&r00t", {RaiseError => 1, mysql_auto_reconnect => 1}) || die "Could not connect to database: $DBI::errstr"; -our $MAX_EVENTS_LIMIT = "1000000"; -our %VALID_STRINGS = ( -"type" => ["portscan", "bruteforce", "probe", "spam", "phishing", "botnet_c_c", "dos", "malware", "copyright", "webattack", "test", "other"], -); + my $failDBH; -our $DBH = DBI->connect("DBI:mysql:database=warden;host=localhost", "root", "w4rd3n&r00t", {RaiseError => 1, mysql_auto_reconnect => 1}) || die "Could not connect to database: $DBI::errstr"; - -#print $ENV{'SSL_CLIENT_S_DN_CN'}; -#foreach (keys %ENV){ -# print "$_ -> $ENV{$_}\n"; -#} + $Warden::DBH = $correctDBH; +} -#trim test -$ret = Warden::trim(' a '); -is($ret,'a','Trim si OK.'); +my $ret; # Alternate names test +print "GetAltNames test\n"; + +# 1 #$alt_names, $ip, $service_type, $client_type, $function_name -#$ret = Warden::getAltNames("warden-dev.cesnet.cz","195.113.161.39","honeyscan","s","someEvent"); -#is($ret, '', 'Alternate names are OK.'); +lives_and( sub{ is Warden::getAltNames("warden-dev.cesnet.cz","195.113.161.39","honeyscan","s","someEvent"), "'warden-dev.cesnet.cz','warden-dev.cesnet.cz'"}, 'everything is OK.'); +#print "$@\n"; # Client authorizaton test -#$ret = Warden::authorizeClient("warden-dev.cesnet.cz","195.113.161.39","honeyscan","s","someEvent"); -#is($ret, undef, 'Client is unregistered.'); +print "AuthorizeClient tests\n"; + +# 2 +dies_ok( sub{ Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.39","honeyscan","s","badAndUglyEvent") }, 'badAndUglyEvent: die (doesn\'t exist)' ); +#print "$@\n"; + +# 3 +dies_ok( sub{ Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.222","badType","s","saveNewEvent")}, 'saveNewEvent: client is not registered'); +#print "$@\n"; + +# 4 +dies_ok( sub{ Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.222","badType","s","getNewEvents")}, 'getNewEvents: client is not registered'); +#print "$@\n"; -#$ret = Warden::authorizeClient(); -#is($ret, undef, 'Client is from the unauthorized subnet.'); +# 5 +lives_and( sub{ is Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.39","honeyscan","s","saveNewEvent"), '3/8'}, 'saveNewEvent: OK.'); +#print "$@\n"; -#$ret = Warden::authorizeClient(); -#is($ret, undef, 'Everything is fine.'); +# 6 +lives_and( sub{ is Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.39","any","r","getNewEvents"), '3/8'}, 'getNewEvents: OK.'); +#print "$@\n"; # Save event test -#$class, $data -#dies_ok {Warden::saveNewEvent()} 'Cannot do insert statement.'; +print "SaveNewEvent tests\n"; +# TODO: run database and SELECT error checks +my %event = ('TYPE' => 'badType', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'bad type'); -#my @event_ok = ("honeyscan", "1234567890", "portscan","IP", "123.123.123.123", "TCP", "22", "1234567890", "important note or comment", "null", "20"); -#$ret = Warden::saveNewEvent("a",@event_ok); -#ok($ret, 'Everything is fine.'); +%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'BADTYPE', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'bad source type.'); -# Get new event -#dies_ok {Warden::getNewEvents()} 'Cannot work with the database.'; +%event = ('TYPE' => 'test', 'DETECTED' => 'XXXX-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'bad date format.'); + +%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => 'XXX', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'port is not a number.'); + +%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => 'XXX', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'attack scale is not a number.'); + +%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => 'XXX', 'TIMEOUT' => '20'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'priority is not a number.'); + +%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => 'XXX'); +dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'timeout is not a number.'); -#$ret = Warden::getNewEvents(); -#is($ret, @EVENTS, 'Everything is fine.'); +%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20'); +lives_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'everything is fine.'); + +# Get new event +print "GetNewEvents tests\n"; +# TODO: run database and SELECT error checks +# dies_ok {Warden::getNewEvents()} 'Cannot work with the database.'; +my %getEventHash = ('REQUESTED_TYPE' => 'any', 'LAST_ID' => '1', 'MAX_RCV_EVENTS_LIMIT' => '10'); +lives_ok( sub{ Warden::getNewEvents("test",\%getEventHash)}, 'everything is fine.'); # Get last ID test -#dies_ok {Warden::getLastId()} 'Cannot prepare statment.'; +print "GetLastId test\n"; +# TODO: run database and SELECT error checks +lives_ok( sub{Warden::getLastId() =~ /^\d+$/}, 'getLastID is OK.'); + +# Get clients test +print "GetClients\n"; +# TODO: run database and SELECT error checks +lives_ok( sub{ Warden::getClients()}, 'everything is fine.'); + +print "GetStatus\n"; +# run database and SELECT error checks +lives_ok( sub{ Warden::getStatus()}, 'everything is fine.'); -$ret = Warden::getLastId(); -print $ret. "\n"; -is($ret, '16302246', 'GetLastID is OK.');