Add SSL support for IRC

This commit is contained in:
moneromooo 2014-12-31 17:18:50 +00:00
parent 4ac5dc07dc
commit e5d9a20b76
2 changed files with 40 additions and 14 deletions

View file

@ -13,11 +13,12 @@
tipbot_name = "monero-testnet-tipbot" tipbot_name = "monero-testnet-tipbot"
irc_network = 'irc.freenode.net' irc_network = 'irc.freenode.net'
irc_port = 6667 irc_port = 6697
irc_send_delay = 0.4 irc_send_delay = 0.4
irc_welcome_line = 'Welcome to the freenode Internet Relay Chat Network' irc_welcome_line = 'Welcome to the freenode Internet Relay Chat Network'
irc_homechan = '#txtptest000' irc_homechan = '#txtptest000'
irc_timeout_seconds = 600 irc_timeout_seconds = 600
irc_use_ssl = True
redis_host="127.0.0.1" redis_host="127.0.0.1"
redis_port=7777 redis_port=7777

View file

@ -12,6 +12,7 @@
import sys import sys
import socket import socket
import ssl
import select import select
import time import time
import string import string
@ -20,6 +21,7 @@ from tipbot.log import log_error, log_warn, log_info, log_log, log_IRCSEND, log_
irc_line_delay = 0 irc_line_delay = 0
irc = None irc = None
sslirc = None
irc_password = "" irc_password = ""
irc_min_send_delay = 0.01 # seconds irc_min_send_delay = 0.01 # seconds
irc_max_send_delay = 5 # seconds irc_max_send_delay = 5 # seconds
@ -50,11 +52,24 @@ def SendIRC(msg):
current_send_delay = irc_min_send_delay current_send_delay = irc_min_send_delay
log_IRCSEND(msg) log_IRCSEND(msg)
irc.send(msg + '\r\n') irc_send(msg + '\r\n')
last_send_time = time.time() last_send_time = time.time()
def irc_recv(size,flags=None):
if config.irc_use_ssl:
return sslirc.read(size)
else:
return irc.recv(size,flags)
def irc_send(data):
if config.irc_use_ssl:
return sslirc.write(data)
else:
return irc.send(data)
def connect_to_irc(network,port,name,password,delay): def connect_to_irc(network,port,name,password,delay):
global irc global irc
global sslirc
global irc_line_delay global irc_line_delay
global irc_network global irc_network
global irc_port global irc_port
@ -69,11 +84,20 @@ def connect_to_irc(network,port,name,password,delay):
log_info('Connecting to IRC at %s:%u' % (network, port)) log_info('Connecting to IRC at %s:%u' % (network, port))
try: try:
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) ) if config.irc_use_ssl:
try:
raise RuntimeError('')
irc_ssl_context = ssl.create_default_context()
sslirc = irc_ssl_context.wrap_socket(irc, network)
sslirc.connect ( ( network, port ) )
except Exception,e:
log_warn('Failed to create SSL context, using fallback code')
irc.connect ( ( network, port ) )
sslirc = socket.ssl(irc)
except Exception, e: except Exception, e:
log_error( 'Error initializing IRC: %s' % str(e)) log_error( 'Error initializing IRC: %s' % str(e))
exit() exit()
log_IRCRECV(irc.recv ( 4096 )) log_IRCRECV(irc_recv(4096))
SendIRC ( 'PASS *********') SendIRC ( 'PASS *********')
SendIRC ( 'NICK %s' % name) SendIRC ( 'NICK %s' % name)
SendIRC ( 'USER %s %s %s :%s' % (name, name, name, name)) SendIRC ( 'USER %s %s %s :%s' % (name, name, name, name))
@ -180,17 +204,17 @@ def GetUsersTable():
# SendIRC( 'MODE ' + chan + ' -v: ' + to_dv) # SendIRC( 'MODE ' + chan + ' -v: ' + to_dv)
buffered_data = "" buffered_data = ""
def GetIRCLine(s): def GetIRCLine():
global buffered_data global buffered_data
idx = buffered_data.find("\n") idx = buffered_data.find("\n")
if idx == -1: if idx == -1:
try: try:
(r,w,x)=select.select([s.fileno()],[],[],1) (r,w,x)=select.select([irc.fileno()],[],[],1)
if s.fileno() in r: if irc.fileno() in r:
newdata=s.recv(4096,socket.MSG_DONTWAIT) newdata=irc_recv(4096,socket.MSG_DONTWAIT)
else: else:
newdata = None newdata = None
if s.fileno() in x: if irc.fileno() in x:
log_error('getline: IRC socket in exception set') log_error('getline: IRC socket in exception set')
newdata = None newdata = None
except Exception,e: except Exception,e:
@ -214,16 +238,17 @@ def GetIRCLine(s):
def IRCLoop(on_idle,on_identified,on_command): def IRCLoop(on_idle,on_identified,on_command):
global userstable global userstable
global registered_users global registered_users
global last_ping_time
while True: while True:
action = None action = None
try: try:
data = GetIRCLine(irc) data = GetIRCLine()
except Exception,e: except Exception,e:
log_warn('Exception fron GetIRCLine, we were probably disconnected, reconnecting in 5 seconds') log_warn('Exception from GetIRCLine, we were probably disconnected, reconnecting in 5 seconds')
time.sleep(5) time.sleep(5)
last_ping_time = time.time() last_ping_time = time.time()
reconnect_to_irc(irc_network,irc_port) reconnect_to_irc()
continue continue
# All that must be done even when nothing from IRC - data may be None here # All that must be done even when nothing from IRC - data may be None here
@ -234,7 +259,7 @@ def IRCLoop(on_idle,on_identified,on_command):
log_warn('%s seconds without PING, reconnecting in 5 seconds' % config.irc_timeout_seconds) log_warn('%s seconds without PING, reconnecting in 5 seconds' % config.irc_timeout_seconds)
time.sleep(5) time.sleep(5)
last_ping_time = time.time() last_ping_time = time.time()
reconnect_to_irc(irc_network,irc_port) reconnect_to_irc()
continue continue
data = data.strip("\r\n") data = data.strip("\r\n")
@ -260,7 +285,7 @@ def IRCLoop(on_idle,on_identified,on_command):
log_warn('We were kicked from IRC, reconnecting in 5 seconds') log_warn('We were kicked from IRC, reconnecting in 5 seconds')
time.sleep(5) time.sleep(5)
last_ping_time = time.time() last_ping_time = time.time()
reconnect_to_irc(irc_network,irc_port) reconnect_to_irc()
continue continue
#--------------------------- Action check --------------------------------# #--------------------------- Action check --------------------------------#