The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Iodef::Pb::Simple::Plugin::Url;
use base 'Iodef::Pb::Simple::Plugin';

use strict;
use warnings;

use URI::Escape;
use Digest::SHA qw/sha1_hex/;
use Digest::MD5 qw/md5_hex/;
use Encode qw(encode_utf8);

sub process {
    my $self = shift;
    my $data = shift;
    my $iodef = shift;
    
    my $addr = $data->{'address'};
    return unless($addr);
    return unless($addr =~ /^(ftp|https?):\/\//);
    
    $addr = lc($addr);
    $addr =~ s/\/$//;
    my $safe = uri_escape($addr,'\x00-\x1f\x7f-\xff');
    $safe = encode_utf8($addr);
    $addr = $safe;
  
    $data->{'address'} = $safe;
    $data->{'md5'} = md5_hex($safe) unless($data->{'md5'});
    $data->{'sha1'} = sha1_hex($safe) unless($data->{'sha1'});
    
    my @additional_data;
    push(@additional_data,(
        ExtensionType->new({
            dtype       => ExtensionType::DtypeType::dtype_type_string(),
            meaning     => 'url hash',
            formatid    => 'md5',
            content     => $data->{'md5'},
        }),
        ExtensionType->new({
            dtype       => ExtensionType::DtypeType::dtype_type_string(),
            meaning     => 'url hash',
            formatid    => 'sha1',
            content     => $data->{'sha1'},
        })
    ));
    
    my $event = EventDataType->new({
        Flow    => FlowType->new({
            System  => SystemType->new({
                Node    => NodeType->new({
                    Address => AddressType->new({
                        category        => AddressType::AddressCategory::Address_category_ext_value(),
                        ext_category    => 'url',
                        content         => $addr,
                    }),
                }),
                AdditionalData  => \@additional_data,
                category        => SystemType::SystemCategory::System_category_target(),
            }),
        }),
    });
    my $incident = @{$iodef->get_Incident()}[0];
    push(@{$incident->{'EventData'}},$event);
}

1;