]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/_auto_deps.py
3dbff4c992c9520aa62778d44953fd746eeb80f7
[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     # * We need Twisted 10.1.0 for the FTP frontend in order for
33     #   Twisted's FTP server to support asynchronous close.
34     # * The SFTP frontend depends on Twisted 11.0.0 to fix the SSH server
35     #   rekeying bug <https://twistedmatrix.com/trac/ticket/4395>
36     # * The FTP frontend depends on Twisted >= 11.1.0 for
37     #   filepath.Permissions
38     # * Nevow 0.11.1 depends on Twisted >= 13.0.0.
39     # * The Magic Folder frontend depends on Twisted >= 15.2.0.
40     "Twisted >= 15.2.0",
41
42     # Nevow 0.11.1 can be installed using pip (#2032).
43     "Nevow >= 0.11.1",
44
45     # * foolscap < 0.5.1 had a performance bug which spent O(N**2) CPU for
46     #   transferring large mutable files of size N.
47     # * foolscap < 0.6 is incompatible with Twisted 10.2.0.
48     # * foolscap 0.6.1 quiets a DeprecationWarning.
49     # * foolscap < 0.6.3 is incompatible with Twisted 11.1.0 and newer.
50     # * foolscap 0.8.0 generates 2048-bit RSA-with-SHA-256 signatures,
51     #   rather than 1024-bit RSA-with-MD5. This also allows us to work
52     #   with a FIPS build of OpenSSL.
53     "foolscap >= 0.10.1",
54
55     # Needed for SFTP.
56     # pycrypto 2.2 doesn't work due to <https://bugs.launchpad.net/pycrypto/+bug/620253>
57     # pycrypto 2.4 doesn't work due to <https://bugs.launchpad.net/pycrypto/+bug/881130>
58     "pycrypto >= 2.1.0, != 2.2, != 2.4",
59
60     # pycryptopp-0.6.0 includes ed25519
61     "pycryptopp >= 0.6.0",
62
63     "service-identity",         # this is needed to suppress complaints about being unable to verify certs
64     "characteristic >= 14.0.0", # latest service-identity depends on this version
65     "pyasn1 >= 0.1.8",          # latest pyasn1-modules depends on this version
66     "pyasn1-modules >= 0.0.5",  # service-identity depends on this
67
68     "humanize >= 0.5.1",        # might not *need* to be this new
69 ]
70
71 # We no longer have any setup dependencies.
72 setup_requires = []
73
74 # Includes some indirect dependencies, but does not include allmydata.
75 # These are in the order they should be listed by --version, etc.
76 package_imports = [
77     # package name       module name
78     ('foolscap',         'foolscap'),
79     ('pycryptopp',       'pycryptopp'),
80     ('zfec',             'zfec'),
81     ('Twisted',          'twisted'),
82     ('Nevow',            'nevow'),
83     ('zope.interface',   'zope.interface'),
84     ('python',           None),
85     ('platform',         None),
86     ('pyOpenSSL',        'OpenSSL'),
87     ('OpenSSL',          None),
88     ('simplejson',       'simplejson'),
89     ('pycrypto',         'Crypto'),
90     ('pyasn1',           'pyasn1'),
91     ('service-identity', 'service_identity'),
92     ('characteristic',   'characteristic'),
93     ('pyasn1-modules',   'pyasn1_modules'),
94     ('humanize',         'humanize'),
95 ]
96
97 # Dependencies for which we don't know how to get a version number at run-time.
98 not_import_versionable = [
99     'zope.interface',
100     'humanize',
101 ]
102
103 # Dependencies reported by pkg_resources that we can safely ignore.
104 ignorable = [
105     'argparse',
106     'pyutil',
107     'zbase32',
108     'distribute',
109     'twisted-web',
110     'twisted-core',
111     'twisted-conch',
112 ]
113
114 import sys
115
116 # Don't try to get the version number of setuptools in frozen builds, because
117 # that triggers 'site' processing that causes failures. Note that frozen
118 # builds still (unfortunately) import pkg_resources in .tac files, so the
119 # entry for setuptools in install_requires above isn't conditional.
120 if not hasattr(sys, 'frozen'):
121     package_imports.append(('setuptools', 'setuptools'))
122
123
124 # * pyOpenSSL is required in order for foolscap to provide secure connections.
125 #   Since foolscap doesn't reliably declare this dependency in a machine-readable
126 #   way, we need to declare a dependency on pyOpenSSL ourselves. Tahoe-LAFS does
127 #   not *directly* depend on pyOpenSSL.
128 #
129 # * pyOpenSSL >= 0.13 is needed in order to avoid
130 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2005>, and also to check the
131 #   version of OpenSSL that pyOpenSSL is using.
132 #
133 # * pyOpenSSL >= 0.14 is built on the 'cryptography' package which depends
134 #   on 'cffi' (and indirectly several other packages). Unfortunately cffi
135 #   attempts to compile code dynamically, which causes problems on many systems.
136 #   It also depends on the libffi OS package which may not be installed.
137 #   <https://bitbucket.org/cffi/cffi/issue/109/enable-sane-packaging-for-cffi>
138 #   <https://bitbucket.org/cffi/cffi/issue/70/cant-install-cffi-using-pip-on-windows>
139 #
140 #   So, if pyOpenSSL 0.14 has *already* been installed and is importable, we
141 #   want to accept it; otherwise we ask for pyOpenSSL 0.13 or 0.13.1.
142 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2193>
143 #
144 #   We don't rely on pkg_resources to tell us the installed pyOpenSSL version
145 #   number, because pkg_resources telling us that we have 0.14 is not sufficient
146 #   evidence that 0.14 will be the imported version (or will work correctly).
147 #   One possible reason why it might not be is explained in
148 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1246#comment:6> and
149 #   <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1258>.
150
151 _can_use_pyOpenSSL_0_14 = False
152 try:
153     import OpenSSL
154     pyOpenSSL_ver = OpenSSL.__version__.split('.')
155     if int(pyOpenSSL_ver[0]) > 0 or int(pyOpenSSL_ver[1]) >= 14:
156         _can_use_pyOpenSSL_0_14 = True
157 except Exception:
158     pass
159
160 if _can_use_pyOpenSSL_0_14:
161     install_requires += [
162         # Although we checked for pyOpenSSL >= 0.14 above, we only actually
163         # need pyOpenSSL >= 0.13; requiring 0.14 here cannot help.
164         "pyOpenSSL >= 0.13",
165
166         # ... and now all the new stuff that pyOpenSSL 0.14 transitively
167         # depends on. We specify these explicitly because setuptools is
168         # bad at correctly resolving indirect dependencies (e.g. see
169         # <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2286>).
170         #
171         "cryptography",
172         "cffi >= 0.8",          # latest cryptography depends on this version
173         "six >= 1.4.1",         # latest cryptography depends on this version
174         "enum34",               # latest cryptography depends on this
175         "pycparser",            # cffi depends on this
176     ]
177
178     package_imports += [
179         ('cryptography',     'cryptography'),
180         ('cffi',             'cffi'),
181         ('six',              'six'),
182         ('enum34',           'enum'),
183         ('pycparser',        'pycparser'),
184     ]
185 else:
186     install_requires += [
187         "pyOpenSSL >= 0.13, <= 0.13.1",
188     ]
189
190
191 # These are suppressed globally:
192
193 global_deprecation_messages = [
194     "BaseException.message has been deprecated as of Python 2.6",
195     "twisted.internet.interfaces.IFinishableConsumer was deprecated in Twisted 11.1.0: Please use IConsumer (and IConsumer.unregisterProducer) instead.",
196     "twisted.internet.interfaces.IStreamClientEndpointStringParser was deprecated in Twisted 14.0.0: This interface has been superseded by IStreamClientEndpointStringParserWithReactor.",
197 ]
198
199 # These are suppressed while importing dependencies:
200
201 deprecation_messages = [
202     "the sha module is deprecated; use the hashlib module instead",
203     "object.__new__\(\) takes no parameters",
204     "The popen2 module is deprecated.  Use the subprocess module.",
205     "the md5 module is deprecated; use hashlib instead",
206     "twisted.web.error.NoResource is deprecated since Twisted 9.0.  See twisted.web.resource.NoResource.",
207     "the sets module is deprecated",
208 ]
209
210 runtime_warning_messages = [
211     "Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.",
212 ]
213
214 warning_imports = [
215     'nevow',
216     'twisted.persisted.sob',
217     'twisted.python.filepath',
218     'Crypto.Hash.SHA',
219 ]