Mercurial > hg
annotate tests/dummysmtpd.py @ 48041:37a41267d000
branching: merge stable into default
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 28 Sep 2021 09:40:57 +0200 |
parents | 23f5ed6dbcb1 |
children | 6000f5b25c9b |
rev | line source |
---|---|
47500
23f5ed6dbcb1
run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45830
diff
changeset
|
1 #!/usr/bin/env python |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
2 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
3 """dummy SMTP server for use in tests""" |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
4 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
5 from __future__ import absolute_import |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
6 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
7 import asyncore |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
8 import optparse |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
9 import smtpd |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
10 import ssl |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
11 import sys |
35776
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
12 import traceback |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
13 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
14 from mercurial import ( |
36566
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
15 pycompat, |
30506
d9d8d78e6bc9
server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
29556
diff
changeset
|
16 server, |
29556
1b8b6adb2365
tests: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29332
diff
changeset
|
17 sslutil, |
1b8b6adb2365
tests: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29332
diff
changeset
|
18 ui as uimod, |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
19 ) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
20 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
21 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
22 def log(msg): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
23 sys.stdout.write(msg) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
24 sys.stdout.flush() |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
25 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
26 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
27 class dummysmtpserver(smtpd.SMTPServer): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
28 def __init__(self, localaddr): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
29 smtpd.SMTPServer.__init__(self, localaddr, remoteaddr=None) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
30 |
39029
78f1899e4202
dummysmtpd: accept additional kwargs from stdlib smtpd
Augie Fackler <augie@google.com>
parents:
36566
diff
changeset
|
31 def process_message(self, peer, mailfrom, rcpttos, data, **kwargs): |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
32 log('%s from=%s to=%s\n' % (peer[0], mailfrom, ', '.join(rcpttos))) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
33 |
35776
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
34 def handle_error(self): |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
35 # On Windows, a bad SSL connection sometimes generates a WSAECONNRESET. |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
36 # The default handler will shutdown this server, and then both the |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
37 # current connection and subsequent ones fail on the client side with |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
38 # "No connection could be made because the target machine actively |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
39 # refused it". If we eat the error, then the client properly aborts in |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
40 # the expected way, and the server is available for subsequent requests. |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
41 traceback.print_exc() |
75bae69747f0
dummysmtpd: don't die on client connection errors
Matt Harbison <matt_harbison@yahoo.com>
parents:
30559
diff
changeset
|
42 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
43 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
44 class dummysmtpsecureserver(dummysmtpserver): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
45 def __init__(self, localaddr, certfile): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
46 dummysmtpserver.__init__(self, localaddr) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
47 self._certfile = certfile |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
48 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
49 def handle_accept(self): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
50 pair = self.accept() |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
51 if not pair: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
52 return |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
53 conn, addr = pair |
30559
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30506
diff
changeset
|
54 ui = uimod.ui.load() |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
55 try: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
56 # wrap_socket() would block, but we don't care |
29556
1b8b6adb2365
tests: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29332
diff
changeset
|
57 conn = sslutil.wrapserversocket(conn, ui, certfile=self._certfile) |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
58 except ssl.SSLError: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
59 log('%s ssl error\n' % addr[0]) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
60 conn.close() |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
61 return |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
62 smtpd.SMTPChannel(self, conn, addr) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
63 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
64 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
65 def run(): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
66 try: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
67 asyncore.loop() |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
68 except KeyboardInterrupt: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
69 pass |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
70 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
71 |
36566
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
72 def _encodestrsonly(v): |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
73 if isinstance(v, type(u'')): |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
74 return v.encode('ascii') |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
75 return v |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
76 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
77 |
36566
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
78 def bytesvars(obj): |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
79 unidict = vars(obj) |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
80 bd = {k.encode('ascii'): _encodestrsonly(v) for k, v in unidict.items()} |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
81 if bd[b'daemon_postexec'] is not None: |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
82 bd[b'daemon_postexec'] = [ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
83 _encodestrsonly(v) for v in bd[b'daemon_postexec'] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
84 ] |
36566
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
85 return bd |
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
86 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
87 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
88 def main(): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
89 op = optparse.OptionParser() |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
90 op.add_option('-d', '--daemon', action='store_true') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
91 op.add_option('--daemon-postexec', action='append') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
92 op.add_option('-p', '--port', type=int, default=8025) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
93 op.add_option('-a', '--address', default='localhost') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
94 op.add_option('--pid-file', metavar='FILE') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
95 op.add_option('--tls', choices=['none', 'smtps'], default='none') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
96 op.add_option('--certificate', metavar='FILE') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
97 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
98 opts, args = op.parse_args() |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
99 if opts.tls == 'smtps' and not opts.certificate: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
100 op.error('--certificate must be specified') |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
101 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
102 addr = (opts.address, opts.port) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
103 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
104 def init(): |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
105 if opts.tls == 'none': |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
106 dummysmtpserver(addr) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
107 else: |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
108 dummysmtpsecureserver(addr, opts.certificate) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
109 log('listening at %s:%d\n' % addr) |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
110 |
36566
ed96d1116302
tests: help dummysmtpd work on python 3
Augie Fackler <augie@google.com>
parents:
35776
diff
changeset
|
111 server.runservice( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
112 bytesvars(opts), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
113 initfn=init, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
114 runfn=run, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
115 runargs=[pycompat.sysexecutable, pycompat.fsencode(__file__)] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
116 + pycompat.sysargv[1:], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
117 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39029
diff
changeset
|
118 |
29332
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
119 |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
120 if __name__ == '__main__': |
2bb0ddd8267b
tests: add dummy SMTP daemon for SSL tests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
121 main() |