Net-EPP-Server

 view release on metacpan or  search on metacpan

lib/Net/EPP/Server.pm  view on Meta::CPAN


sub generate_response {
    my $self    = shift;
    my %args    = @_;

    my $clTRID  = $args{'clTRID'};
    my $svTRID  = $args{'svTRID'};

    my $code    = $args{'code'} || OK;
    my $msg     = $args{'msg'} || $MESSAGES{$code} || ($code < UNKNOWN_COMMAND ? $MESSAGES{OK} : $MESSAGES{COMMAND_FAILED});

    my $frame = XML::LibXML::Document->new;

    $frame->setDocumentElement($frame->createElementNS($Net::EPP::Frame::EPP_URN, 'epp'));
    my $response = $frame->documentElement->appendChild($frame->createElement('response'));

    my $result = $response->appendChild($frame->createElement('result'));

    $result->setAttribute('code', $code);
    $result->appendChild($frame->createElement('msg'))->appendText($msg);

    if ($args{'resData'}) {
        $response->appendChild($frame->createElement('resData'));
    }

    if ($clTRID || $svTRID) {
        my $trID = $response->appendChild($frame->createElement('trID'));
        $trID->appendChild($frame->createElement('clTRID'))->appendText($clTRID) if ($clTRID);
        $trID->appendChild($frame->createElement('svTRID'))->appendText($svTRID) if ($svTRID);
    }

    return $frame;
}


sub generate_error {
    my ($self, %args) = @_;
    $args{'code'} ||= COMMAND_FAILED;
    $args{'msg'} = $args{'msg'} || $MESSAGES{$args{'code'}} || 'An internal error occurred. Please try again later.';
    return $self->generate_response(%args);
}


sub generate_svTRID {
    state $counter = time();

    return substr(sha512_hex(
        pack('Q', ++$counter)
        .chr(0)
        .Crypt::OpenSSL::Random::random_pseudo_bytes(32)
    ), 0, 64);
}


sub parse_frame {
    my ($self, $xml) = @_;

    return XML::LibXML->load_xml(
        string      => $xml,
        no_blanks   => 1,
        no_cdata    => 1,
    );
}


sub validate_frame {
    my ($self, $frame) = @_;

    if ($self->{'epp'}->{'xsd_file'}) {
        state $xsd = XML::LibXML::Schema->new(location => $self->{'epp'}->{'xsd_file'});

        eval { $xsd->validate($frame) };

        return (SYNTAX_ERROR, $@) if ($@);
    }

    return OK;
}

#
# This method finds the callback for the given event, and if found, runs it and
# passes back its return value(s).
#
sub run_callback {
    my $self = shift;
    my %args = @_;

    $args{'server'} ||= $self;

    my $ref = $self->{'epp'}->{'handlers'}->{$args{'event'}};

    return &{$ref}(%args) if ($ref);
}


sub is_result_code {
    my $value = shift;
    return (int($value) >= OK && int($value) <= 2502);
}

#
# This method is a wrapper around Net::EPP::Protocol->send_frame() which
# validates the response and reports any errors
#
sub send_frame {
    my ($self, $socket, $frame) = @_;

    #
    # note: we need to do a round-trip here otherwise we get namespace issues
    #
    $frame = XML::LibXML->load_xml(string => $frame->toString);

    my ($code, $msg) = $self->validate_frame($frame);
    if (OK != $code) {
        carp($msg);
    }

    Net::EPP::Protocol->send_frame($socket, $frame->toString);
}

1;



( run in 1.062 second using v1.01-cache-2.11-cpan-d7f47b0818f )