mirror of
				https://github.com/pragma-/pbot.git
				synced 2025-11-04 08:37:24 +01:00 
			
		
		
		
	Refactor SSL behavior
This commit is contained in:
		
							parent
							
								
									61881535fa
								
							
						
					
					
						commit
						1b5b987f9e
					
				@ -260,7 +260,7 @@ sub connect {
 | 
			
		||||
    if ($self->connected) { $self->quit("Changing servers"); }
 | 
			
		||||
 | 
			
		||||
    if ($self->ssl) {
 | 
			
		||||
        require IO::Socket::SSL;
 | 
			
		||||
        use IO::Socket::SSL;
 | 
			
		||||
 | 
			
		||||
        if ($self->ssl_ca_file) {
 | 
			
		||||
            $self->socket(
 | 
			
		||||
@ -294,9 +294,7 @@ sub connect {
 | 
			
		||||
                )
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        $self->socket(
 | 
			
		||||
            IO::Socket::INET->new(
 | 
			
		||||
                PeerAddr  => $self->server,
 | 
			
		||||
@ -308,14 +306,25 @@ sub connect {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!$self->socket) {
 | 
			
		||||
        carp(
 | 
			
		||||
            sprintf "Can't connect to %s:%s!",
 | 
			
		||||
            $self->server, $self->port
 | 
			
		||||
        );
 | 
			
		||||
        if ($self->ssl) {
 | 
			
		||||
            carp(
 | 
			
		||||
                sprintf "Can't connect to %s:%s: error=$! SSL_ERROR=$SSL_ERROR",
 | 
			
		||||
                $self->server, $self->port
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            carp(
 | 
			
		||||
                sprintf "Can't connect to %s:%s: $!",
 | 
			
		||||
                $self->server, $self->port
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        $self->error(1);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($self->ssl) {
 | 
			
		||||
        $self->socket->blocking(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # send CAP LS first
 | 
			
		||||
    $self->sl("CAP LS 302");
 | 
			
		||||
 | 
			
		||||
@ -831,7 +840,26 @@ sub parse {
 | 
			
		||||
    my ($self) = shift;
 | 
			
		||||
    my ($from, $type, $message, @stuff, $itype, $ev, @lines, $line);
 | 
			
		||||
 | 
			
		||||
    if (defined($self->ssl ? $self->socket->read($line, 10240) : $self->socket->recv($line, 10240, 0)) and (length($self->{_frag}) + length($line)) > 0) {
 | 
			
		||||
    my $n;
 | 
			
		||||
 | 
			
		||||
    if ($self->ssl) {
 | 
			
		||||
        $n = sysread($self->socket, $line, 32767);
 | 
			
		||||
 | 
			
		||||
        if (not defined $n) {
 | 
			
		||||
            if ($!{EWOULDBLOCK}) {
 | 
			
		||||
                if ($SSL_ERROR == SSL_WANT_READ or $SSL_ERROR = SSL_WANT_WRITE) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                print STDERR "SSL broke: $SSL_ERROR\n";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
        $n = $self->socket->recv($line, 32767, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (defined $n and (length($self->{_frag}) + length($line)) > 0) {
 | 
			
		||||
        # grab any remnant from the last go and split into lines
 | 
			
		||||
        my $chunk = $self->{_frag} . $line;
 | 
			
		||||
        @lines = split /\012/, $chunk;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										38
									
								
								PBot/PBot.pm
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								PBot/PBot.pm
									
									
									
									
									
								
							@ -244,14 +244,15 @@ sub connect {
 | 
			
		||||
        # TODO: disconnect, clean-up, etc
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $server = $self->{registry}->get_value('irc', 'server');
 | 
			
		||||
    my $port   = $self->{registry}->get_value('irc', 'port');
 | 
			
		||||
    my $delay  = $self->{registry}->get_value('irc', 'reconnect_delay') // 10;
 | 
			
		||||
    my $server  = $self->{registry}->get_value('irc', 'server');
 | 
			
		||||
    my $port    = $self->{registry}->get_value('irc', 'port');
 | 
			
		||||
    my $delay   = $self->{registry}->get_value('irc', 'reconnect_delay') // 10;
 | 
			
		||||
    my $retries = $self->{registry}->get_value('irc', 'reconnect_retries') // 10;
 | 
			
		||||
 | 
			
		||||
    $self->{logger}->log("Connecting to $server:$port\n");
 | 
			
		||||
 | 
			
		||||
    while (
 | 
			
		||||
        not $self->{conn} = $self->{irc}->newconn(
 | 
			
		||||
    for (my $attempt = 0; $attempt < $retries; $attempt++) {
 | 
			
		||||
        my %config = (
 | 
			
		||||
            Nick        => $self->{registry}->get_value('irc', 'randomize_nick') ? $self->random_nick : $self->{registry}->get_value('irc', 'botnick'),
 | 
			
		||||
            Username    => $self->{registry}->get_value('irc', 'username'),
 | 
			
		||||
            Ircname     => $self->{registry}->get_value('irc', 'realname'),
 | 
			
		||||
@ -260,13 +261,30 @@ sub connect {
 | 
			
		||||
            Pacing      => 1,
 | 
			
		||||
            UTF8        => 1,
 | 
			
		||||
            SSL         => $self->{registry}->get_value('irc', 'ssl'),
 | 
			
		||||
            SSL_ca_file => $self->{registry}->get_value('irc', 'ssl_ca_file'),
 | 
			
		||||
            SSL_ca_path => $self->{registry}->get_value('irc', 'ssl_ca_path'),
 | 
			
		||||
            Debug       => $self->{registry}->get_value('irc', 'debug'),
 | 
			
		||||
            PBot        => $self,
 | 
			
		||||
        )
 | 
			
		||||
      )
 | 
			
		||||
    {
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        # set SSL stuff
 | 
			
		||||
        my $ssl_ca_file = $self->{registry}->get_value('irc', 'ssl_ca_file');
 | 
			
		||||
 | 
			
		||||
        if (length $ssl_ca_file and $ssl_ca_file ne 'none') {
 | 
			
		||||
            $config{SSL_ca_file} = $ssl_ca_file;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $ssl_ca_path = $self->{registry}->get_value('irc', 'ssl_ca_path');
 | 
			
		||||
 | 
			
		||||
        if (length $ssl_ca_file and $ssl_ca_file ne 'none') {
 | 
			
		||||
            $config{SSL_ca_file} = $ssl_ca_file;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # attempt to connect
 | 
			
		||||
        $self->{conn} = $self->{irc}->newconn(%config);
 | 
			
		||||
 | 
			
		||||
        # connection succeeded
 | 
			
		||||
        last if $self->{conn};
 | 
			
		||||
 | 
			
		||||
        # connection failed
 | 
			
		||||
        $self->{logger}->log("$0: Can't connect to $server:$port: $!\nRetrying in $delay seconds...\n");
 | 
			
		||||
        sleep $delay;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user