annotate roundup/anypy/random_.py @ 5650:e8ca7072c629

Fix Python 3 issues in REST code. * Need to use .get not .getheader for HTTP headers (see hg commit fec18298ae02, "Python 3 preparation: HTTP headers handling in roundup_server.py."). * Need to use key not cmp with sort (see hg commit 3fa026621f69, "Python 3 preparation: comparisons."). * dispatch output must be bytes, not str, otherwise writing it to the socket (e.g. in roundup-server) will fail. This fixes issues shown up attempting to access the REST interface with a browser with Python 3 (as opposed to with the Roundup testsuite, which also has known REST issues with Python 3).
author Joseph Myers <jsm@polyomino.org.uk>
date Sun, 17 Mar 2019 16:25:36 +0000
parents 52cb53eedf77
children adf54478cdaf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5488
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
1 try:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
2 from secrets import choice, randbelow, token_bytes
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
3 def seed(v = None):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
4 pass
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
5
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
6 is_weak = False
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
7 except ImportError:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
8 import os as _os
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
9 import random as _random
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
10
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
11 # prefer to use SystemRandom if it is available
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
12 if hasattr(_random, 'SystemRandom'):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
13 def seed(v = None):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
14 pass
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
15
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
16 _r = _random.SystemRandom()
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
17 is_weak = False
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
18 else:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
19 # don't completely throw away the existing state, but add some
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
20 # more random state to the existing state
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
21 def seed(v = None):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
22 import os, time
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
23 _r.seed((_r.getstate(),
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
24 v,
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
25 hasattr(os, 'getpid') and os.getpid(),
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
26 time.time()))
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
27
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
28 # create our own instance so we don't mess with the global
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
29 # random number generator
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
30 _r = _random.Random()
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
31 seed()
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
32 is_weak = True
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
33
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
34 choice = _r.choice
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
35
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
36 def randbelow(i):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
37 return _r.randint(0, i - 1)
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
38
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
39 if hasattr(_os, 'urandom'):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
40 def token_bytes(l):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
41 return _os.urandom(l)
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
42 else:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
43 def token_bytes(l):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
44 _bchr = chr if str == bytes else lambda x: bytes((x,))
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
45 return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)])

Roundup Issue Tracker: http://roundup-tracker.org/