HEX
Server: Apache
System: Linux sg241.singhost.net 2.6.32-896.16.1.lve1.4.51.el6.x86_64 #1 SMP Wed Jan 17 13:19:23 EST 2018 x86_64
User: honghock (909)
PHP: 8.0.30
Disabled: passthru,system,shell_exec,show_source,exec,popen,proc_open
Upload Files
File: //proc/self/root/usr/local/share/perl5/Mail/Alias/Reader/Parser.pm
# Copyright (c) 2012, cPanel, Inc.
# All rights reserved.
# http://cpanel.net/
#
# This is free software; you can redistribute it and/or modify it under the same
# terms as Perl itself.  See the LICENSE file for further details.

package Mail::Alias::Reader::Parser;

use strict;
use warnings;

use Mail::Alias::Reader::Token ();

use Carp;

sub _parse_forward_statement {
    my ($tokens) = @_;
    my @destinations;

    my $last_token = Mail::Alias::Reader::Token->new('T_BEGIN');

    foreach my $token ( @{$tokens} ) {
        next if $token->isa(qw/T_BEGIN T_COMMENT T_WHITESPACE/);

        if ( $token->is_value ) {
            confess('Unexpected value') if $last_token->is_value;

            push @destinations, $token;
        }
        elsif ( $token->isa('T_COMMA') ) {
            confess('Unexpected comma') unless $last_token->is_value || $last_token->isa('T_COMMA');
        }
        else {
            confess("Unexpected $token->{'type'}") unless $token->isa('T_END');
        }

        $last_token = $token;
    }

    confess('Statement contains no destinations') unless @destinations;

    return \@destinations;
}

sub _parse_aliases_statement {
    my ($tokens) = @_;
    my ( $name, @destinations );

    my $last_token = Mail::Alias::Reader::Token->new('T_BEGIN');

    foreach my $token ( @{$tokens} ) {
        next if $token->isa(qw/T_BEGIN T_COMMENT T_WHITESPACE/);

        if ( $last_token->isa('T_BEGIN') ) {
            confess("Expected address as name of alias, found $token->{'type'}") unless $token->is_address;
        }
        elsif ( $token->isa('T_COLON') ) {
            confess('Unexpected colon') unless $last_token->is_address;
            confess('Too many colons') if $name;

            $name = $last_token->{'value'};
        }
        elsif ( $token->isa('T_COMMA') ) {
            confess('Unexpected comma') unless $last_token->is_value || $last_token->isa('T_COMMA');
        }
        elsif ( $token->isa('T_END') ) {
            confess('Unexpected end of aliases statement') unless $last_token->is_value || $last_token->isa('T_COMMA');

            last;
        }
        elsif ( $token->is_value ) {
            push @destinations, $token;
        }
        else {
            confess("Unexpected $token->{'type'}");
        }

        $last_token = $token;
    }

    confess('Alias statement has no name') unless defined $name;

    return ( $name, \@destinations );
}

sub parse {
    my ( $class, $statement, $mode ) = @_;
    my $tokens = Mail::Alias::Reader::Token->tokenize($statement);

    return _parse_forward_statement($tokens) if $mode eq 'forward';
    return _parse_aliases_statement($tokens) if $mode eq 'aliases';

    confess("Invalid parsing mode $mode specified");
}

1;

__END__

=head1 COPYRIGHT

Copyright (c) 2012, cPanel, Inc.
All rights reserved.
http://cpanel.net/

This is free software; you can redistribute it and/or modify it under the same
terms as Perl itself.  See the LICENSE file for further details.