Merge pull request 'Fixing the logic for draft/account-registration=before-connect' (#7) from before-connect into master
Reviewed-on: #7
This commit is contained in:
		
						commit
						12297a3de8
					
				@ -5,72 +5,55 @@ import os
 | 
			
		||||
webircpass = os.getenv("WEBIRC_PASS")
 | 
			
		||||
 | 
			
		||||
def ircregister(userip, username, password, email="*"):
 | 
			
		||||
 | 
			
		||||
    d = irctokens.StatefulDecoder()
 | 
			
		||||
    e = irctokens.StatefulEncoder()
 | 
			
		||||
    s = socket.socket()
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    # Here we assume using this only on localhost i.e. loopback
 | 
			
		||||
    s.connect(("127.0.0.1", 6667))
 | 
			
		||||
 | 
			
		||||
    # define the send function
 | 
			
		||||
    def _send(line):
 | 
			
		||||
        print(f"> {line.format()}")
 | 
			
		||||
        e.push(line)
 | 
			
		||||
        while e.pending():
 | 
			
		||||
            e.pop(s.send(e.pending()))
 | 
			
		||||
 | 
			
		||||
    # Registering connection
 | 
			
		||||
    
 | 
			
		||||
    # WEBIRC
 | 
			
		||||
    _send(irctokens.build("WEBIRC", [ webircpass, "WebregGateway", userip, userip, "secure"]))
 | 
			
		||||
 | 
			
		||||
    # Check for "ERROR :Invalid WebIRC password"
 | 
			
		||||
    # Should all of this this be under a try except block?
 | 
			
		||||
    lines = d.push(s.recv(1024))
 | 
			
		||||
    if lines == None:
 | 
			
		||||
        print("!disconnected")
 | 
			
		||||
        return "disconnected"
 | 
			
		||||
    elif lines.command == "ERROR" and lines.params == "Invalid WebIRC password":
 | 
			
		||||
        return "WebIRC bad password"
 | 
			
		||||
    
 | 
			
		||||
    # Inform the server that we support
 | 
			
		||||
    # CAP 3.2
 | 
			
		||||
    _send(irctokens.build("CAP", ["LS", "302"]))
 | 
			
		||||
 | 
			
		||||
    # REGISTER can be attempted before-connect if server supports
 | 
			
		||||
    # but if the server responds with the corresponding FAIL we
 | 
			
		||||
    # need to try again. We can also handle email-required using
 | 
			
		||||
    # the same keys. How to access these key-value pairs?
 | 
			
		||||
    # reference: https://ircv3.net/specs/extensions/account-registration.html
 | 
			
		||||
    
 | 
			
		||||
    # NICK and USER
 | 
			
		||||
    _send(irctokens.build("USER", ["u", "0", "*", username]))
 | 
			
		||||
    _send(irctokens.build("NICK", [username]))
 | 
			
		||||
 | 
			
		||||
    # go through all cases
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
        lines = d.push(s.recv(1024))
 | 
			
		||||
        if lines == None:
 | 
			
		||||
            print("! disconnected")
 | 
			
		||||
            break        
 | 
			
		||||
        for line in lines:
 | 
			
		||||
            print(f"< {line.format()}")
 | 
			
		||||
            if line.command == "432":
 | 
			
		||||
                return "ERR_ERRONEUSNICKNAME"
 | 
			
		||||
            elif line.command == "433":
 | 
			
		||||
                return "ERR_NICKNAMEINUSE"
 | 
			
		||||
            _send(irctokens.build("CAP", ["REQ", "draft/account-registration"]))
 | 
			
		||||
            # REGISTER can be attempted before-connect if server supports
 | 
			
		||||
            # but if the server responds with the corresponding FAIL we
 | 
			
		||||
            # need to try again. We can also handle email-required using
 | 
			
		||||
            # the same keys. How to access these key-value pairs?
 | 
			
		||||
            # reference: https://ircv3.net/specs/extensions/account-registration.html
 | 
			
		||||
            # do we handle if email-req but not before-connect
 | 
			
		||||
            # also how about when `custom-account-name` may be a value
 | 
			
		||||
            if 'draft/account-registration=before-connect' in line.params:
 | 
			
		||||
                _send(irctokens.build("CAP", ["REQ", "draft/account-registration"]))
 | 
			
		||||
            if line.command == "CAP" and ("NAK" in line.params):
 | 
			
		||||
                return "CAP_REFUSED"
 | 
			
		||||
            elif line.command == "CAP" and ("ACK" in line.params):
 | 
			
		||||
                to_send = irctokens.build("CAP", ["END"])
 | 
			
		||||
                _send(to_send)
 | 
			
		||||
            if line.command == "PING":
 | 
			
		||||
                to_send = irctokens.build("PONG", [line.params[0]])
 | 
			
		||||
                _send(to_send)
 | 
			
		||||
            if line.command == "001":
 | 
			
		||||
                # assuming no verif reqd.
 | 
			
		||||
                to_send = irctokens.build("REGISTER", ["*", email, password])
 | 
			
		||||
                _send(to_send)
 | 
			
		||||
                _send(irctokens.build("CAP", ["END"]))
 | 
			
		||||
                _send(irctokens.build("USER", ["u", "0", "*", username]))
 | 
			
		||||
                _send(irctokens.build("NICK", [username]))
 | 
			
		||||
                if line.command == "432":
 | 
			
		||||
                    return "ERR_ERRONEUSNICKNAME"
 | 
			
		||||
                if line.command == "433":
 | 
			
		||||
                    return "ERR_NICKNAMEINUSE"
 | 
			
		||||
                _send(irctokens.build("REGISTER", [username, "*", password]))
 | 
			
		||||
            if line.command == "REGISTER" and ("SUCCESS" in line.params):
 | 
			
		||||
                to_send = irctokens.build("QUIT")
 | 
			
		||||
                _send(to_send)
 | 
			
		||||
                _send(irctokens.build("QUIT"))
 | 
			
		||||
                return "SUCCESS"
 | 
			
		||||
	
 | 
			
		||||
@ -1,10 +0,0 @@
 | 
			
		||||
click==8.0.1
 | 
			
		||||
Flask==2.0.1
 | 
			
		||||
Flask-WTF==0.15.1
 | 
			
		||||
gunicorn==20.1.0
 | 
			
		||||
irctokens==2.0.0
 | 
			
		||||
itsdangerous==2.0.1
 | 
			
		||||
Jinja2==3.0.1
 | 
			
		||||
MarkupSafe==2.0.1
 | 
			
		||||
Werkzeug==2.0.1
 | 
			
		||||
WTForms==2.3.3
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user