The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# $Id: Parser.pm 142 2009-10-16 19:13:45Z jabra $
package Nikto::Parser;
{
    our $VERSION = '0.01';
    $VERSION = eval $VERSION;

    use Object::InsideOut;
    use Nikto::Parser::Session;
    my @session : Field : Arg(session) : Get(session) :
        Type(Nikto::Parser::Session);

    # parse_file
    #
    # Input:
    # argument  -   self obj    -
    # argument  -   xml         scalar
    #
    # Ouptut:
    #
    sub parse_file {
        my ( $self, $file ) = @_;
        my $parser = XML::LibXML->new();

        my $doc = $parser->parse_file($file);
        return Nikto::Parser->new(
            session => Nikto::Parser::Session->parse( $parser, $doc ) );
    }

    sub parse_scan {
        my ( $self, $ndir, $args, @ips ) = @_;
        my $FH;

        if ( $args =~ /-Format/ ) {
            die
                "[Nikto-Parser] Cannot pass option '-Format ' to parse_scan()";
        }

        if ( $args =~ /-output/ ) {
            die
                "[Nikto-Parser] Cannot pass option '-output ' to parse_scan()";
        }
        if ( -d $ndir ) {
            chdir $ndir or die "[Nikto-Parser] $ndir not a directory\n";
        }
        else {
            die "[Nikto-Parser] $ndir not a directory\n";
        }

        my $cmd = "./nikto.pl -Format xml -output \"-\" -host "
            . ( join ' ', @ips );
        print "$cmd\n";
        open $FH, "$cmd |"
            || die "[Nikto-Parser] Could not perform nikto scan - $!";
        my $p      = XML::LibXML->new();
        my $doc    = $p->parse_fh($FH);
        my $parser = Nikto::Parser->new(
            session => Nikto::Parser::Session->parse( $p, $doc ) );
        close $FH;
        return $parser;
    }

    # return the session information for the current nikto scan
    sub get_session {
        my ($self) = @_;
        my $session = $self->session;
        return $session;
    }

    # return the host obj based on an ip address
    sub get_host {
        my ( $self, $ip ) = @_;
        my $host_obj = $self->session->scandetails->get_host_ip($ip);
        return $host_obj;
    }

    # return an ArrayRef containing all of the host objs
    sub get_all_hosts {
        my ($self) = @_;
        my @all_hosts = $self->session->scandetails->all_hosts();
        return @all_hosts;
    }
}
1;