From df5f61ffd0398c89ddccc73d2e3e101e50e96804 Mon Sep 17 00:00:00 2001 From: Zachary Seguin Date: Mon, 1 May 2017 17:36:05 -0400 Subject: [PATCH] Update check_email to handle hosts without an A record (either AAAA only or MX only) --- ceo/members.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ceo/members.py b/ceo/members.py index e1bf29457..e0365d3be 100644 --- a/ceo/members.py +++ b/ceo/members.py @@ -5,14 +5,14 @@ This module contains functions for registering new members, registering members for terms, searching for members, and other member-related functions. -Transactions are used in each method that modifies the database. +Transactions are used in each method that modifies the database. Future changes to the members database that need to be atomic must also be moved into this module. """ import os, re, subprocess, ldap, socket from ceo import conf, ldapi, terms, remote, ceo_pb2 from ceo.excep import InvalidArgument - +import dns.resolver ### Configuration ### @@ -179,11 +179,16 @@ def check_email(email): if c in ('"', "'", ',', '|', '$', '/', '#', ':'): return 'Invalid character in address: %s' % c + # Start by searching for host record host = match.group(1) try: - ip = socket.gethostbyname(host) + ip = socket.getaddrinfo(host, None) except: - return 'Invalid host: %s' % host + # Check for MX record + try: + dns.resolver.query(host, 'MX') + except: + return 'Invalid host: %s' % host def current_email(username): @@ -433,7 +438,7 @@ def set_shell(userid, shell): def create_club(username, name): """ Creates a UNIX user account with options tailored to CSC-hosted clubs. - + Parameters: username - the desired UNIX username name - the club name @@ -449,7 +454,7 @@ def create_club(username, name): # check username format if not username or not re.match(cfg['username_regex'], username): raise InvalidArgument("username", username, "expected format %s" % repr(cfg['username_regex'])) - + try: request = ceo_pb2.AddUser() request.type = ceo_pb2.AddUser.CLUB