mirror of
				https://github.com/mail-in-a-box/mailinabox.git
				synced 2025-10-31 19:00:54 +00:00 
			
		
		
		
	new tests for DNS and IMAP/SMTP
This commit is contained in:
		
							parent
							
								
									304bf3d360
								
							
						
					
					
						commit
						04d97a11e9
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1 +1,2 @@ | ||||
| *~ | ||||
| tests/__pycache__/ | ||||
|  | ||||
							
								
								
									
										58
									
								
								tests/dns.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										58
									
								
								tests/dns.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,58 @@ | ||||
| #!/usr/bin/python3 | ||||
| # Test DNS configuration. | ||||
| # | ||||
| # tests/dns.py ipaddr hostname | ||||
| 
 | ||||
| import sys, subprocess, re, difflib | ||||
| 
 | ||||
| if len(sys.argv) < 3: | ||||
| 	print("Usage: tests/dns.py ipaddress hostname") | ||||
| 	sys.exit(1) | ||||
| 
 | ||||
| ipaddr, hostname = sys.argv[1:] | ||||
| 
 | ||||
| def dig(digargs): | ||||
| 	# run dig and clean the output | ||||
| 	response = subprocess.check_output(['dig', '@' + ipaddr] + digargs).decode('utf8') | ||||
| 	response = re.sub('[\r\n]+', '\n', response) # remove blank lines | ||||
| 	response = re.sub('\n;.*', '', response) # remove comments | ||||
| 	response = response.strip() + "\n" | ||||
| 	return response | ||||
| 
 | ||||
| # call dig a few times with different parameters | ||||
| digoutput = \ | ||||
|    dig([hostname])\ | ||||
|  + dig(["www." + hostname, "+noadditional", "+noauthority"]) \ | ||||
|  + dig(["mx", hostname, "+noadditional", "+noauthority"]) \ | ||||
|  + dig(["txt", hostname, "+noadditional", "+noauthority"]) \ | ||||
|  + dig(["txt", "mail._domainkey." + hostname, "+noadditional", "+noauthority"]) | ||||
| 
 | ||||
| # normalize DKIM key | ||||
| digoutput = re.sub(r"(\"p=).*(\")", r"\1__KEY__\2", digoutput) | ||||
| 
 | ||||
| # construct the expected output | ||||
| subs = { "ipaddr": ipaddr, "hostname": hostname } | ||||
| expected = """ | ||||
| {hostname}.	86400	IN	A	{ipaddr} | ||||
| {hostname}.	86400	IN	NS	ns1.{hostname}. | ||||
| {hostname}.	86400	IN	NS	ns2.{hostname}. | ||||
| ns1.{hostname}.	86400	IN	A	{ipaddr} | ||||
| ns2.{hostname}.	86400	IN	A	{ipaddr} | ||||
| www.{hostname}.	86400	IN	A	{ipaddr} | ||||
| {hostname}.	86400	IN	MX	10 {hostname}. | ||||
| {hostname}.	300	IN	TXT	"v=spf1 mx -all" | ||||
| mail._domainkey.{hostname}. 86400 IN TXT	"v=DKIM1\; k=rsa\; s=email\; " "p=__KEY__" | ||||
| """.format(**subs).strip() + "\n" | ||||
| 
 | ||||
| # Show a diff if there are any changes | ||||
| has_diff = False | ||||
| def split(s): return [line+"\n" for line in s.split("\n")] | ||||
| for line in difflib.unified_diff(split(expected), split(digoutput), fromfile='expected DNS settings', tofile='output from dig'): | ||||
| 	sys.stdout.write(line)    | ||||
| 	has_diff = True | ||||
| 
 | ||||
| if not has_diff: | ||||
| 	print("DNS is OK.") | ||||
| 	sys.exit(0) | ||||
| 
 | ||||
| sys.exit(1) | ||||
| @ -1,20 +0,0 @@ | ||||
| #!/usr/bin/python3 | ||||
| import imaplib, sys | ||||
| 
 | ||||
| if len(sys.argv) < 3: | ||||
| 	print("Usage: tests/imap.py host username password") | ||||
| 	sys.exit(1) | ||||
| 
 | ||||
| host, username, pw = sys.argv[1:4] | ||||
| 
 | ||||
| M = imaplib.IMAP4_SSL(host) | ||||
| M.login(username, pw) | ||||
| print("Login successful.") | ||||
| M.select() | ||||
| typ, data = M.search(None, 'ALL') | ||||
| for num in data[0].split(): | ||||
|     typ, data = M.fetch(num, '(RFC822)') | ||||
|     print('Message %s\n%s\n' % (num, data[0][1])) | ||||
| M.close() | ||||
| M.logout() | ||||
| 
 | ||||
							
								
								
									
										78
									
								
								tests/mail.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										78
									
								
								tests/mail.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,78 @@ | ||||
| #!/usr/bin/python3 | ||||
| # Tests sending and receiving mail by sending a test message to yourself. | ||||
| 
 | ||||
| import sys, imaplib, smtplib, uuid, time, dkim | ||||
| 
 | ||||
| if len(sys.argv) < 3: | ||||
| 	print("Usage: tests/mail.py hostname emailaddress password") | ||||
| 	sys.exit(1) | ||||
| 
 | ||||
| host, emailaddress, pw = sys.argv[1:4] | ||||
| 
 | ||||
| # Attempt to login with IMAP. Our setup uses email addresses | ||||
| # as IMAP/SMTP usernames. | ||||
| M = imaplib.IMAP4_SSL(host) | ||||
| M.login(emailaddress, pw) | ||||
| M.select() | ||||
| print("IMAP login is OK.") | ||||
| 
 | ||||
| # Attempt to send a mail to ourself. | ||||
| mailsubject = "Mail-in-a-Box Automated Test Message " + uuid.uuid4().hex | ||||
| emailto = emailaddress | ||||
| msg = """From: {emailaddress} | ||||
| To: {emailto} | ||||
| Subject: {subject} | ||||
| 
 | ||||
| This is a test message. It should be automatically deleted by the test script.""".format( | ||||
| 	emailaddress=emailaddress, | ||||
| 	emailto=emailto, | ||||
| 	subject=mailsubject, | ||||
| 	) | ||||
| server = smtplib.SMTP(host, 587) | ||||
| #server.set_debuglevel(1) | ||||
| server.starttls() | ||||
| server.login(emailaddress, pw) | ||||
| server.sendmail(emailaddress, [emailto], msg) | ||||
| server.quit() | ||||
| print("SMTP submission is OK.") | ||||
| 
 | ||||
| while True: | ||||
| 	# Wait so the message can propagate to the inbox. | ||||
| 	time.sleep(10) | ||||
| 
 | ||||
| 	# Read the subject lines of all of the emails in the inbox | ||||
| 	# to find our test message, and then delete it. | ||||
| 	found = False | ||||
| 	typ, data = M.search(None, 'ALL') | ||||
| 	for num in data[0].split(): | ||||
| 		typ, data = M.fetch(num, '(BODY[HEADER.FIELDS (SUBJECT)])') | ||||
| 		imapsubjectline = data[0][1].strip().decode("utf8") | ||||
| 		if imapsubjectline == "Subject: " + mailsubject: | ||||
| 			# We found our test message. | ||||
| 			found = True | ||||
| 
 | ||||
| 			# To test DKIM, download the whole mssage body. Unfortunately, | ||||
| 			# pydkim doesn't actually work. | ||||
| 			# You must 'sudo apt-get install python3-dkim python3-dnspython' first. | ||||
| 			#typ, msgdata = M.fetch(num, '(RFC822)') | ||||
| 			#msg = msgdata[0][1] | ||||
| 			#if dkim.verify(msg): | ||||
| 			#	print("DKIM signature on the test message is OK (verified).") | ||||
| 			#else: | ||||
| 			#	print("DKIM signature on the test message failed verification.") | ||||
| 
 | ||||
| 			# Delete the test message. | ||||
| 			M.store(num, '+FLAGS', '\\Deleted') | ||||
| 			M.expunge() | ||||
| 
 | ||||
| 			break | ||||
| 
 | ||||
| 	if found: | ||||
| 		break | ||||
| 
 | ||||
| 	print("Test message not present in the inbox yet...") | ||||
| 
 | ||||
| M.close() | ||||
| M.logout() | ||||
| 
 | ||||
| print("Test message sent & received successfully.") | ||||
| @ -1,22 +0,0 @@ | ||||
| #!/usr/bin/python3 | ||||
| import smtplib, sys | ||||
| 
 | ||||
| if len(sys.argv) < 3: | ||||
|         print("Usage: tests/smtp_submission.py host email.from pw  email.to") | ||||
|         sys.exit(1) | ||||
| 
 | ||||
| host, fromaddr, pw, toaddr = sys.argv[1:5] | ||||
| msg = """From: %s | ||||
| To: %s | ||||
| Subject: SMTP server test | ||||
| 
 | ||||
| This is a test message.""" % (fromaddr, toaddr) | ||||
| 
 | ||||
| server = smtplib.SMTP(host, 587) | ||||
| server.set_debuglevel(1) | ||||
| server.starttls() | ||||
| server.login(fromaddr, pw) | ||||
| server.sendmail(fromaddr, [toaddr], msg) | ||||
| server.quit() | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user