]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/_auto_deps.py
Add OpenSSL version check and tests. refs ticket:2215
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / _auto_deps.py
1 # Note: please minimize imports in this file. In particular, do not import
2 # any module from Tahoe-LAFS or its dependencies, and do not import any
3 # modules at all at global level. That includes setuptools and pkg_resources.
4 # It is ok to import modules from the Python Standard Library if they are
5 # always available, or the import is protected by try...except ImportError.
6
7 # The semantics for requirement specs changed incompatibly in setuptools 8,
8 # which now follows PEP 440. The requirements used in this file must be valid
9 # under both the old and new semantics. That can be achieved by limiting
10 # requirement specs to one of the following forms:
11 #
12 #   * >= X, <= Y where X < Y
13 #   * >= X, != Y, != Z, ... where X < Y < Z...
14 #
15 # (In addition, check_requirement in allmydata/__init__.py only supports
16 # >=, <= and != operators.)
17
18 install_requires = [
19     # We require newer versions of setuptools (actually
20     # zetuptoolz) to build, but can handle older versions to run.
21     "setuptools >= 0.6c6",
22
23     "zfec >= 1.1.0",
24
25     # Feisty has simplejson 1.4
26     "simplejson >= 1.4",
27
28     # zope.interface >= 3.6.0 is required for Twisted >= 12.1.0.
29     # zope.interface 3.6.3 and 3.6.4 are incompatible with Nevow (#1435).
30     "zope.interface >= 3.6.0, != 3.6.3, != 3.6.4",
31
32     # * foolscap < 0.5.1 had a performance bug which spent O(N**2) CPU for
33     #   transferring large mutable files of size N.
34     # * foolscap < 0.6 is incompatible with Twisted 10.2.0.
35     # * foolscap 0.6.1 quiets a DeprecationWarning.
36     # * foolscap < 0.6.3 is incompatible with Twisted 11.1.0 and newer.
37     # * foolscap 0.8.0 generates 2048-bit RSA-with-SHA-256 signatures,
38     #   rather than 1024-bit RSA-with-MD5. This also allows us to work
39     #   with a FIPS build of OpenSSL.
40     "foolscap >= 0.8.0",
41
42     # Needed for SFTP.
43     # pycrypto 2.2 doesn't work due to <https://bugs.launchpad.net/pycrypto/+bug/620253>
44     # pycrypto 2.4 doesn't work due to <https://bugs.launchpad.net/pycrypto/+bug/881130>
45     "pycrypto >= 2.1.0, != 2.2, != 2.4",
46
47     # <http://www.voidspace.org.uk/python/mock/>, 0.8.0 provides "call"
48     "mock >= 0.8.0",
49
50     # pycryptopp-0.6.0 includes ed25519
51     "pycryptopp >= 0.6.0",
52
53     "service-identity",         # this is needed to suppress complaints about being unable to verify certs
54     "characteristic >= 14.0.0", # latest service-identity depends on this version
55     "pyasn1 >= 0.1.4",          # latest pyasn1-modules depends on this version
56     "pyasn1-modules >= 0.0.5",  # service-identity depends on this
57 ]
58
59 # Includes some indirect dependencies, but does not include allmydata.
60 # These are in the order they should be listed by --version, etc.
61 package_imports = [
62     # package name       module name
63     ('foolscap',         'foolscap'),
64     ('pycryptopp',       'pycryptopp'),
65     ('zfec',             'zfec'),
66     ('Twisted',          'twisted'),
67     ('Nevow',            'nevow'),
68     ('zope.interface',   'zope.interface'),
69     ('python',           None),
70     ('platform',         None),
71     ('pyOpenSSL',        'OpenSSL'),
72     ('OpenSSL',          None),
73     ('simplejson',       'simplejson'),
74     ('pycrypto',         'Crypto'),
75     ('pyasn1',           'pyasn1'),
76     ('mock',             'mock'),
77     ('service-identity', 'service_identity'),
78     ('characteristic',   'characteristic'),
79     ('pyasn1-modules',   'pyasn1_modules'),
80 ]
81
82 # Dependencies for which we don't know how to get a version number at run-time.
83 not_import_versionable = [
84     'zope.interface',
85     'mock',
86     'pyasn1',
87 ]
88
89 # Dependencies reported by pkg_resources that we can safely ignore.
90 ignorable = [
91     'argparse',
92     'pyutil',
93     'zbase32',
94     'distribute',
95     'twisted-web',
96     'twisted-core',
97     'twisted-conch',
98 ]
99
100 import sys
101
102 # Don't try to get the version number of setuptools in frozen builds, because
103 # that triggers 'site' processing that causes failures. Note that frozen
104 # builds still (unfortunately) import pkg_resources in .tac files, so the
105 # entry for setuptools in install_requires above isn't conditional.
106 if not hasattr(sys, 'frozen'):
107     package_imports.append(('setuptools', 'setuptools'))
108
109
110 # * On Linux we need at least Twisted 10.1.0 for inotify support
111 #   used by the drop-upload frontend.
112 # * We also need Twisted 10.1.0 for the FTP frontend in order for
113 #   Twisted's FTP server to support asynchronous close.
114 # * The SFTP frontend depends on Twisted 11.0.0 to fix the SSH server
115 #   rekeying bug <https://twistedmatrix.com/trac/ticket/4395>
116 # * The FTP frontend depends on Twisted >= 11.1.0 for
117 #   filepath.Permissions
118 #
119 # On Windows, Twisted >= 12.2.0 has a dependency on pywin32.
120 # Since pywin32 can only be installed manually, we fall back to
121 # requiring earlier versions of Twisted and Nevow if it is not
122 # already installed.
123 # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2028>
124 #
125 # When the fallback is used we also need to work around the fact
126 # that Nevow imports itself when building, which causes Twisted
127 # and zope.interface to be imported; therefore, we need to set
128 # setup_requires to make sure that the versions of Twisted and
129 # zope.interface used at build time satisfy Nevow's requirements.
130 #
131 # In cases where this fallback isn't needed, we prefer Nevow >= 0.11.1
132 # which can be installed using pip, and Twisted >= 13.0.0 which
133 # Nevow 0.11.1 depends on. In this case we should *not* use the
134 # setup_requires hack, because if we do then the build will break
135 # when Twisted < 13.0.0 is already installed (even though it could
136 # have succeeded by building a later version under support/ ).
137 #
138 # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2032>
139 # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2249>
140 # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2291>
141 # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2286>
142
143 setup_requires = []
144
145 _use_old_Twisted_and_Nevow = False
146 if sys.platform == "win32":
147     try:
148         import win32api
149         [win32api]
150     except ImportError:
151         _use_old_Twisted_and_Nevow = True
152
153 if _use_old_Twisted_and_Nevow:
154     install_requires += [
155         "Twisted >= 11.1.0, <= 12.1.0",
156         "Nevow >= 0.9.33, <= 0.10",
157     ]
158     setup_requires += [req for req in install_requires if req.startswith('Twisted')
159                                                        or req.startswith('zope.interface')]
160 else:
161     install_requires += [
162         "Twisted >= 13.0.0",
163         "Nevow >= 0.11.1",
164     ]
165
166
167 # * pyOpenSSL is required in order for foolscap to provide secure connections.
168 #   Since foolscap doesn't reliably declare this dependency in a machine-readable
169 #   way, we need to declare a dependency on pyOpenSSL ourselves. Tahoe-LAFS does
170 #   not *directly* depend on pyOpenSSL.
171 #
172 # * pyOpenSSL >= 0.13 is needed in order to avoid
173 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2005>, and also to check the
174 #   version of OpenSSL that pyOpenSSL is using.
175 #
176 # * pyOpenSSL >= 0.14 is built on the 'cryptography' package which depends
177 #   on 'cffi' (and indirectly several other packages). Unfortunately cffi
178 #   attempts to compile code dynamically, which causes problems on many systems.
179 #   It also depends on the libffi OS package which may not be installed.
180 #   <https://bitbucket.org/cffi/cffi/issue/109/enable-sane-packaging-for-cffi>
181 #   <https://bitbucket.org/cffi/cffi/issue/70/cant-install-cffi-using-pip-on-windows>
182 #
183 #   So, if pyOpenSSL 0.14 has *already* been installed and is importable, we
184 #   want to accept it; otherwise we ask for pyOpenSSL 0.13 or 0.13.1.
185 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2193>
186 #
187 #   We don't rely on pkg_resources to tell us the installed pyOpenSSL version
188 #   number, because pkg_resources telling us that we have 0.14 is not sufficient
189 #   evidence that 0.14 will be the imported version (or will work correctly).
190 #   One possible reason why it might not be is explained in
191 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1246#comment:6> and
192 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1258>.
193
194 _can_use_pyOpenSSL_0_14 = False
195 try:
196     import OpenSSL
197     pyOpenSSL_ver = OpenSSL.__version__.split('.')
198     if int(pyOpenSSL_ver[0]) > 0 or int(pyOpenSSL_ver[1]) >= 14:
199         _can_use_pyOpenSSL_0_14 = True
200 except Exception:
201     pass
202
203 if _can_use_pyOpenSSL_0_14:
204     install_requires += [
205         # Although we checked for pyOpenSSL >= 0.14 above, we only actually
206         # need pyOpenSSL >= 0.13; requiring 0.14 here cannot help.
207         "pyOpenSSL >= 0.13",
208
209         # ... and now all the new stuff that pyOpenSSL 0.14 transitively
210         # depends on. We specify these explicitly because setuptools is
211         # bad at correctly resolving indirect dependencies (e.g. see
212         # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2286>).
213         #
214         "cryptography",
215         "cffi >= 0.8",          # latest cryptography depends on this version
216         "six >= 1.4.1",         # latest cryptography depends on this version
217         "enum34",               # latest cryptography depends on this
218         "pycparser",            # cffi depends on this
219     ]
220
221     package_imports += [
222         ('cryptography',     'cryptography'),
223         ('cffi',             'cffi'),
224         ('six',              'six'),
225         ('enum34',           'enum'),
226         ('pycparser',        'pycparser'),
227     ]
228 else:
229     install_requires += [
230         "pyOpenSSL >= 0.13, <= 0.13.1",
231     ]
232
233
234 # These are suppressed globally:
235
236 global_deprecation_messages = [
237     "BaseException.message has been deprecated as of Python 2.6",
238     "twisted.internet.interfaces.IFinishableConsumer was deprecated in Twisted 11.1.0: Please use IConsumer (and IConsumer.unregisterProducer) instead.",
239     "twisted.internet.interfaces.IStreamClientEndpointStringParser was deprecated in Twisted 14.0.0: This interface has been superseded by IStreamClientEndpointStringParserWithReactor.",
240 ]
241
242 # These are suppressed while importing dependencies:
243
244 deprecation_messages = [
245     "the sha module is deprecated; use the hashlib module instead",
246     "object.__new__\(\) takes no parameters",
247     "The popen2 module is deprecated.  Use the subprocess module.",
248     "the md5 module is deprecated; use hashlib instead",
249     "twisted.web.error.NoResource is deprecated since Twisted 9.0.  See twisted.web.resource.NoResource.",
250     "the sets module is deprecated",
251 ]
252
253 runtime_warning_messages = [
254     "Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.",
255 ]
256
257 warning_imports = [
258     'nevow',
259     'twisted.persisted.sob',
260     'twisted.python.filepath',
261     'Crypto.Hash.SHA',
262 ]