]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/_auto_deps.py
Only allow pyOpenSSL >= 0.14 if it is already installed. fixes #2193
[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 install_requires = [
8     # we require newer versions of setuptools (actually
9     # zetuptoolz) to build, but can handle older versions to run
10     "setuptools >= 0.6c6",
11
12     "zfec >= 1.1.0",
13
14     # Feisty has simplejson 1.4
15     "simplejson >= 1.4",
16
17     # zope.interface >= 3.6.0 is required for Twisted >= 12.1.0.
18     # zope.interface 3.6.3 and 3.6.4 are incompatible with Nevow (#1435).
19     "zope.interface == 3.6.0, == 3.6.1, == 3.6.2, >= 3.6.5",
20
21     # * foolscap < 0.5.1 had a performance bug which spent O(N**2) CPU for
22     #   transferring large mutable files of size N.
23     # * foolscap < 0.6 is incompatible with Twisted 10.2.0.
24     # * foolscap 0.6.1 quiets a DeprecationWarning.
25     # * foolscap < 0.6.3 is incompatible with Twisted-11.1.0 and newer. Since
26     #   current Twisted is 12.0, any build which needs twisted will grab a
27     #   version that requires foolscap>=0.6.3
28     # * pyOpenSSL is required by foolscap for it (foolscap) to provide secure
29     #   connections. Foolscap doesn't reliably declare this dependency in a
30     #   machine-readable way, so we need to declare a dependency on pyOpenSSL
31     #   ourselves. Tahoe-LAFS doesn't *really* depend directly on pyOpenSSL,
32     #   so if something changes in the relationship between foolscap and
33     #   pyOpenSSL, such as foolscap requiring a specific version of
34     #   pyOpenSSL, or foolscap switching from pyOpenSSL to a different crypto
35     #   library, we need to update this declaration here.
36     #
37     "foolscap >= 0.6.3",
38
39     # Needed for SFTP. pyasn1 is needed by twisted.conch in Twisted >= 9.0.
40     # pycrypto 2.2 doesn't work due to https://bugs.launchpad.net/pycrypto/+bug/620253
41     # pycrypto 2.4 doesn't work due to https://bugs.launchpad.net/pycrypto/+bug/881130
42     "pycrypto == 2.1.0, == 2.3, >= 2.4.1",
43
44     # http://www.voidspace.org.uk/python/mock/ , 0.8.0 provides "call"
45     "mock >= 0.8.0",
46
47     # pycryptopp-0.6.0 includes ed25519
48     "pycryptopp >= 0.6.0",
49
50     # Will be needed to test web apps, but not yet. See #1001.
51     #"windmill >= 1.3",
52 ]
53
54 # Includes some indirect dependencies, but does not include allmydata.
55 # These are in the order they should be listed by --version, etc.
56 package_imports = [
57     # package name       module name
58     ('foolscap',         'foolscap'),
59     ('pycryptopp',       'pycryptopp'),
60     ('zfec',             'zfec'),
61     ('Twisted',          'twisted'),
62     ('Nevow',            'nevow'),
63     ('zope.interface',   'zope.interface'),
64     ('python',           None),
65     ('platform',         None),
66     ('pyOpenSSL',        'OpenSSL'),
67     ('simplejson',       'simplejson'),
68     ('pycrypto',         'Crypto'),
69     ('pyasn1',           'pyasn1'),
70     ('mock',             'mock'),
71 ]
72
73 # Dependencies for which we don't know how to get a version number at run-time.
74 not_import_versionable = [
75     'zope.interface',
76     'mock',
77     'pyasn1',
78     'pyasn1-modules',
79 ]
80
81 # Dependencies reported by pkg_resources that we can safely ignore.
82 ignorable = [
83     'argparse',
84     'pyutil',
85     'zbase32',
86     'distribute',
87     'twisted-web',
88     'twisted-core',
89     'twisted-conch',
90 ]
91
92 import sys
93
94 # Don't try to get the version number of setuptools in frozen builds, because
95 # that triggers 'site' processing that causes failures. Note that frozen
96 # builds still (unfortunately) import pkg_resources in .tac files, so the
97 # entry for setuptools in install_requires above isn't conditional.
98 if not hasattr(sys, 'frozen'):
99     package_imports.append(('setuptools', 'setuptools'))
100
101 if sys.platform == "win32":
102     install_requires += [
103         # * On Windows we need at least Twisted 9.0 to avoid an indirect
104         #   dependency on pywin32.
105         # * We also need Twisted 10.1 for the FTP frontend in order for
106         #   Twisted's FTP server to support asynchronous close.
107         # * When the cloud backend lands, it will depend on Twisted 10.2.0
108         #   which includes the fix to <https://twistedmatrix.com/trac/ticket/411>.
109         # * The SFTP frontend depends on Twisted 11.0.0 to fix the SSH server
110         #   rekeying bug <https://twistedmatrix.com/trac/ticket/4395>
111         # * We don't want Twisted >= 13.0 to avoid a dependency of its endpoints
112         #   code on pywin32. <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2028>
113         #
114         "Twisted == 11.0.0, == 11.1.0, == 12.0.0, == 12.1.0, == 12.2.0",
115
116         # * We need Nevow >= 0.9.33 to avoid a bug in Nevow's setup.py
117         #   which imported twisted at setup time.
118         # * We don't want Nevow 0.11 because that requires Twisted >= 13.0
119         #   which conflicts with the Twisted requirement above.
120         #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2291>
121         #
122         "Nevow == 0.9.33, == 0.10",
123
124         # pyasn1 is needed by twisted.conch in Twisted >= 9.0.
125         "pyasn1 >= 0.0.8a",
126     ]
127 else:
128     install_requires += [
129         # * On Linux we need at least Twisted 10.1.0 for inotify support
130         #   used by the drop-upload frontend.
131         # * Nevow 0.11.1 requires Twisted >= 13.0.0 so we might as well
132         #   require it directly; this helps to work around
133         #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2286>.
134         #   This also satisfies the requirements for the FTP and SFTP
135         #   frontends and cloud backend mentioned in the Windows section
136         #   above.
137         #
138         "Twisted >= 13.0.0",
139
140         # Nevow >= 0.11.1 can be installed using pip.
141         "Nevow >= 0.11.1",
142
143         "service-identity",         # this is needed to suppress complaints about being unable to verify certs
144         "characteristic >= 14.0.0", # latest service-identity depends on this version
145         "pyasn1 >= 0.1.4",          # latest pyasn1-modules depends on this version
146         "pyasn1-modules",           # service-identity depends on this
147     ]
148
149     package_imports += [
150         ('service-identity', 'service_identity'),
151         ('characteristic',   'characteristic'),
152         ('pyasn1-modules',   'pyasn1_modules'),
153     ]
154
155 # If pyOpenSSL >= 0.14 is *already* installed, then accept it, otherwise
156 # require pyOpenSSL 0.13 or 0.13.1.
157 # See <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1246#comment:6> for why
158 # we don't rely on pkg_resources to tell us the installed pyOpenSSL version number.
159
160 _can_use_pyOpenSSL_0_14 = False
161 try:
162     import OpenSSL
163     pyOpenSSL_ver = OpenSSL.__version__.split('.')
164     if int(pyOpenSSL_ver[0]) > 0 or int(pyOpenSSL_ver[1]) >= 14:
165         _can_use_pyOpenSSL_0_14 = True
166 except Exception:
167     pass
168
169 if _can_use_pyOpenSSL_0_14:
170     install_requires += [
171         # pyOpenSSL >= 0.13 is needed in order to fix
172         # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2005>.
173         "pyOpenSSL >= 0.13",
174
175         # ... and now all the new stuff that pyOpenSSL 0.14 transitively
176         # depends on. We specify these explicitly because setuptools is
177         # bad at correctly resolving indirect dependencies (e.g. see
178         # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2286>).
179         #
180         "cryptography",
181         "cffi >= 0.8",          # latest cryptography depends on this version
182         "six >= 1.4.1",         # latest cryptography depends on this version
183         "pycparser",            # cffi depends on this
184     ]
185
186     package_imports += [
187         ('cryptography',     'cryptography'),
188         ('cffi',             'cffi'),
189         ('six',              'six'),
190         ('pycparser',        'pycparser'),
191     ]
192 else:
193     install_requires += [
194         "pyOpenSSL == 0.13, == 0.13.1",
195     ]
196
197
198 # These are suppressed globally:
199
200 global_deprecation_messages = [
201     "BaseException.message has been deprecated as of Python 2.6",
202     "twisted.internet.interfaces.IFinishableConsumer was deprecated in Twisted 11.1.0: Please use IConsumer (and IConsumer.unregisterProducer) instead.",
203     "twisted.internet.interfaces.IStreamClientEndpointStringParser was deprecated in Twisted 14.0.0: This interface has been superseded by IStreamClientEndpointStringParserWithReactor.",
204 ]
205
206 # These are suppressed while importing dependencies:
207
208 deprecation_messages = [
209     "the sha module is deprecated; use the hashlib module instead",
210     "object.__new__\(\) takes no parameters",
211     "The popen2 module is deprecated.  Use the subprocess module.",
212     "the md5 module is deprecated; use hashlib instead",
213     "twisted.web.error.NoResource is deprecated since Twisted 9.0.  See twisted.web.resource.NoResource.",
214     "the sets module is deprecated",
215 ]
216
217 runtime_warning_messages = [
218     "Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.",
219 ]
220
221 warning_imports = [
222     'nevow',
223     'twisted.persisted.sob',
224     'twisted.python.filepath',
225     'Crypto.Hash.SHA',
226 ]