monolith/modules/regproc.py

151 lines
5.2 KiB
Python
Raw Normal View History

import main
from modules import provision
from utils.logging.log import *
from utils.logging.debug import *
from copy import deepcopy
2022-07-21 12:39:46 +00:00
from random import choice
2022-07-21 12:39:41 +00:00
def needToRegister(net):
# Check if the network does not support authentication
networkObj = main.network[net]
if networkObj.auth == "none":
return False
# Check if the IRC network definition has registration disabled
inst = selectInst(net)
if "register" in inst.keys():
if inst["register"]:
return True
else:
return False
2022-07-21 12:39:41 +00:00
def selectInst(net):
if net in main.irc.keys():
inst = deepcopy(main.irc[net])
for i in main.irc["_"].keys():
if not i in inst:
inst[i] = main.irc["_"][i]
else:
inst = main.irc["_"]
return inst
2022-07-21 12:39:41 +00:00
def substitute(net, num, token=None):
inst = selectInst(net)
alias = main.alias[num]
2022-07-21 12:39:52 +00:00
gotemail = False
if "emails" in alias:
2022-07-21 12:39:46 +00:00
# First priority is explicit email lists
2022-07-21 12:39:52 +00:00
if alias["emails"]:
email = choice(alias["emails"])
gotemail = True
if "domains" in inst:
if inst["domains"]:
if not gotemail:
domain = choice(inst["domains"])
email = f"{alias['nickname']}@{domain}"
gotemail = True
if not gotemail:
error(f"Could not get email for {net} - {num}")
return False
nickname = alias["nick"]
2022-07-21 12:39:41 +00:00
username = nickname + "/" + net
password = main.network[net].aliases[num]["password"]
2022-07-21 12:39:46 +00:00
#inst["email"] = inst["email"].replace("{nickname}", nickname)
for i in inst.keys():
if not isinstance(inst[i], str):
continue
inst[i] = inst[i].replace("{nickname}", nickname)
inst[i] = inst[i].replace("{password}", password)
2022-07-21 12:39:46 +00:00
inst[i] = inst[i].replace("{email}", email)
if token:
inst[i] = inst[i].replace("{token}", token)
return inst
2022-07-21 12:39:41 +00:00
def registerAccount(net, num):
debug("Attempting to register: %s - %i" % (net, num))
sinst = substitute(net, num)
2022-07-21 12:39:52 +00:00
if not sinst:
error(f"Register account failed for {net} - {num}")
return
if not sinst["register"]:
error("Cannot register for %s: function disabled" % (net))
return False
2022-07-21 12:39:41 +00:00
name = net + str(num)
main.IRCPool[name].msg(sinst["entity"], sinst["registermsg"])
2022-07-21 12:39:41 +00:00
def confirmAccount(net, num, token):
sinst = substitute(net, num, token=token)
2022-07-21 12:39:41 +00:00
name = net + str(num)
main.IRCPool[name].msg(sinst["entity"], sinst["confirm"])
enableAuthentication(net, num)
2022-07-21 12:39:41 +00:00
def confirmRegistration(net, num, negativepass=None):
obj = main.network[net]
2022-07-21 12:39:41 +00:00
name = net + str(num)
if name in main.IRCPool.keys():
if not negativepass == None:
main.IRCPool[name].regPing(negativepass=negativepass)
return
2022-07-21 12:39:41 +00:00
debug("Relay authenticated: %s - %i" % (net, num))
main.IRCPool[name].authenticated = True
main.IRCPool[name].recheckList()
if obj.relays[num]["registered"]:
return
if name in main.IRCPool.keys():
if main.IRCPool[name]._regAttempt:
try:
main.IRCPool[name]._regAttempt.cancel()
except:
pass
obj.relays[num]["registered"] = True
main.saveConf("network")
2022-07-21 12:39:41 +00:00
def enableAuthentication(net, num):
obj = main.network[net]
nick = main.alias[num]["nick"]
security = obj.security
auth = obj.auth
password = obj.aliases[num]["password"]
2022-07-21 12:39:41 +00:00
uname = main.alias[num]["nick"] + "/" + net
provision.provisionAuthenticationData(num, nick, net, security, auth, password) # Set up for auth
main.IRCPool[net + str(num)].msg(main.config["Tweaks"]["ZNC"]["Prefix"] + "status", "Jump")
if selectInst(net)["check"] == False:
confirmRegistration(net, num)
2022-07-21 12:39:41 +00:00
def registerTest(c):
sinst = substitute(c["net"], c["num"])
2022-07-21 12:39:41 +00:00
name = c["net"] + str(c["num"])
if sinst["check"] == False:
return
if "msg" in c.keys() and not c["msg"] == None:
if sinst["negative"]:
if name in main.IRCPool.keys():
if not main.IRCPool[name]._negativePass == True:
if c["type"] == "query" and c["nick"] == sinst["entity"]:
if sinst["checknegativemsg"] in c["msg"]:
2022-07-21 12:39:41 +00:00
confirmRegistration(c["net"], c["num"], negativepass=False) # Not passed negative check, report back
return
if sinst["checkendnegative"] in c["msg"]:
2022-07-21 12:39:41 +00:00
confirmRegistration(c["net"], c["num"], negativepass=True) # Passed the negative check, report back
return
if sinst["ping"]:
if sinst["checkmsg2"] in c["msg"] and c["nick"] == sinst["entity"]:
confirmRegistration(c["net"], c["num"])
return
if sinst["checktype"] == "msg":
2022-07-21 12:39:41 +00:00
if sinst["checkmsg"] in c["msg"]:
confirmRegistration(c["net"], c["num"])
return
elif sinst["checktype"] == "mode":
if c["type"] == "self":
if c["mtype"] == "mode":
if sinst["checkmode"] in c["mode"] and c["status"] == True:
confirmRegistration(c["net"], c["num"])
return