return False, unicode(sys.exc_info()[1]) if not username or not password: nw.nntp.sock.sendall('ARTICLE <test@home>\r\n') try: nw.clear_data() nw.recv_chunk(block=True) except: return False, unicode(sys.exc_info()[1]) if nw.status_code == '480': return False, T('Server requires username and password.') elif nw.status_code == '100' or nw.status_code.startswith(('2', '4')): return True, T('Connection Successful!') elif nw.status_code == '502' or clues_login(nntp_to_msg(nw.data)): return False, T('Authentication failed, check username/password.') elif clues_too_many(nw.lines[0]): return False, T( 'Too many connections, please pause downloading or try again later' ) else: return False, T('Could not determine connection result (%s)' ) % nntp_to_msg(nw.data) # Close the connection nw.terminate(quit=True)
except: return False, unicode(sys.exc_info()[1]) if not username or not password: nw.nntp.sock.sendall('ARTICLE <test@home>\r\n') try: nw.clear_data() nw.recv_chunk(block=True) except: # Some internal error, not always safe to close connection return False, unicode(sys.exc_info()[1]) # Close the connection nw.terminate(quit=True) if nw.status_code == '480': return False, T('Server requires username and password.') elif nw.status_code == '100' or nw.status_code.startswith(('2', '4')): return True, T('Connection Successful!') elif nw.status_code == '502' or clues_login(nntp_to_msg(nw.data)): return False, T('Authentication failed, check username/password.') elif clues_too_many(nw.lines[0]): return False, T('Too many connections, please pause downloading or try again later') else: return False, T('Could not determine connection result (%s)') % nntp_to_msg(nw.data)
def test_nntp_server(host, port, server=None, username=None, password=None, ssl=None, ssl_verify=1, ssl_ciphers=None): """ Will connect (blocking) to the nttp server and report back any errors """ timeout = 4.0 if "*" in password and not password.strip("*"): # If the password is masked, try retrieving it from the config if not server: servers = get_servers() got_pass = False for server in servers: if host in servers[server].host(): srv = servers[server] password = srv.password() got_pass = True else: srv = get_servers().get(server) if srv: password = srv.password() got_pass = True if not got_pass: return False, T("Password masked in ******, please re-enter") try: s = Server(-1, "", host, port, timeout, 0, 0, ssl, ssl_verify, ssl_ciphers, False, username, password) except: return False, T("Invalid server details") try: nw = NewsWrapper(s, -1, block=True) nw.init_connect(None) while not nw.connected: nw.clear_data() nw.recv_chunk(block=True) # Handle 1/n-1 splitting to prevent Rizzo/Duong-Beast read_sockets, _, _ = select.select([nw.nntp.sock], [], [], 0.1) if read_sockets: nw.recv_chunk(block=True) nw.finish_connect(nw.status_code) except socket.timeout: if port != 119 and not ssl: return False, T( "Timed out: Try enabling SSL or connecting on a different port." ) else: return False, T("Timed out") except socket.error as e: # Trying SSL on non-SSL port? if "unknown protocol" in str(e).lower(): return False, T( "Unknown SSL protocol: Try disabling SSL or connecting on a different port." ) return False, str(e) except TypeError: return False, T("Invalid server address.") except IndexError: # No data was received in recv_chunk() call return False, T("Server quit during login sequence.") except: return False, str(sys.exc_info()[1]) if not username or not password: nw.nntp.sock.sendall(b"ARTICLE <test@home>\r\n") try: nw.clear_data() nw.recv_chunk(block=True) except: # Some internal error, not always safe to close connection return False, str(sys.exc_info()[1]) # Close the connection nw.terminate(quit=True) if nw.status_code == 480: return False, T("Server requires username and password.") elif nw.status_code == 100 or str(nw.status_code).startswith(("2", "4")): return True, T("Connection Successful!") elif nw.status_code == 502 or clues_login(nntp_to_msg(nw.data)): return False, T("Authentication failed, check username/password.") elif clues_too_many(nntp_to_msg(nw.data)): return False, T( "Too many connections, please pause downloading or try again later" ) else: return False, T("Could not determine connection result (%s)" ) % nntp_to_msg(nw.data)