Mercurial > p > roundup > code
annotate roundup/support.py @ 5232:462b0f76fce8
issue2550864 - Potential information leakage via journal/history
Fix this by making the hyperdb::Class::history function check for view
permissions on the journaled properties. So a user that sees [hidden]
for a property in the web interface doesn;t see the property changes
in the history.
While doing this, relocated the filter for quiet properties
from the templating class to the hyperdb.
Also added the skipquiet option to the history command in
roundup-admin.py to enable filtering of quiet params.
Also changed calls to history() in the backend databases to report all
items.
Changed inline documentation for all history calls that document the
actions. The create action (before nov 6 2002) used to record all
parameters. After that point the create call uses an empty dictionary.
The filtering code depends on the create dictionary being empty.
It may not operate properly on very old roundup databases.
Changed calls to logging.getLogger to roundup.hyperdb.backends to
allow filtering the back end while keeping hyperdb logging.
In cgi/templating.py, changed history() function consolidating
handiling of link and unlink actions
Added tests for quiet property filtering and permission filtering
of history.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Fri, 14 Apr 2017 23:24:18 -0400 |
| parents | ac0c117cd24c |
| children | 64b05e24dbd8 |
| rev | line source |
|---|---|
| 2984 | 1 """Implements various support classes and functions used in a number of |
| 2 places in Roundup code. | |
| 3 """ | |
| 4 | |
| 5 __docformat__ = 'restructuredtext' | |
| 6 | |
|
3644
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
7 import os, time, sys, re |
|
3019
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
8 |
| 2984 | 9 class TruthDict: |
| 10 '''Returns True for valid keys, False for others. | |
| 11 ''' | |
| 12 def __init__(self, keys): | |
| 13 if keys: | |
| 14 self.keys = {} | |
| 15 for col in keys: | |
| 16 self.keys[col] = 1 | |
| 17 else: | |
| 18 self.__getitem__ = lambda name: 1 | |
| 19 | |
| 20 def __getitem__(self, name): | |
| 21 return self.keys.has_key(name) | |
| 22 | |
|
3019
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
23 def ensureParentsExist(dest): |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
24 if not os.path.exists(os.path.dirname(dest)): |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
25 os.makedirs(os.path.dirname(dest)) |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
26 |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
27 class PrioList: |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
28 '''Manages a sorted list. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
29 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
30 Currently only implements method 'append' and iteration from a |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
31 full list interface. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
32 Implementation: We manage a "sorted" status and sort on demand. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
33 Appending to the list will require re-sorting before use. |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
34 >>> p = PrioList() |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
35 >>> for i in 5,7,1,-1: |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
36 ... p.append(i) |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
37 ... |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
38 >>> for k in p: |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
39 ... print k |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
40 ... |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
41 -1 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
42 1 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
43 5 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
44 7 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
45 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
46 ''' |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
47 def __init__(self): |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
48 self.list = [] |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
49 self.sorted = True |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
50 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
51 def append(self, item): |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
52 self.list.append(item) |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
53 self.sorted = False |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
54 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
55 def __iter__(self): |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
56 if not self.sorted: |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
57 self.list.sort() |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
58 self.sorted = True |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
59 return iter(self.list) |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
60 |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
61 class Progress: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
62 '''Progress display for console applications. |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
63 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
64 See __main__ block at end of file for sample usage. |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
65 ''' |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
66 def __init__(self, info, sequence): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
67 self.info = info |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
68 self.sequence = iter(sequence) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
69 self.total = len(sequence) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
70 self.start = self.now = time.time() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
71 self.num = 0 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
72 self.stepsize = self.total / 100 or 1 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
73 self.steptimes = [] |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
74 self.display() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
75 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
76 def __iter__(self): return self |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
77 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
78 def next(self): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
79 self.num += 1 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
80 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
81 if self.num > self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
82 print self.info, 'done', ' '*(75-len(self.info)-6) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
83 sys.stdout.flush() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
84 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
85 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
86 if self.num % self.stepsize: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
87 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
88 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
89 self.display() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
90 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
91 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
92 def display(self): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
93 # figure how long we've spent - guess how long to go |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
94 now = time.time() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
95 steptime = now - self.now |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
96 self.steptimes.insert(0, steptime) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
97 if len(self.steptimes) > 5: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
98 self.steptimes.pop() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
99 steptime = sum(self.steptimes) / len(self.steptimes) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
100 self.now = now |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
101 eta = steptime * ((self.total - self.num)/self.stepsize) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
102 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
103 # tell it like it is (or might be) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
104 if now - self.start > 3: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
105 M = eta / 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
106 H = M / 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
107 M = M % 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
108 S = eta % 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
109 if self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
110 s = '%s %2d%% (ETA %02d:%02d:%02d)'%(self.info, |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
111 self.num * 100. / self.total, H, M, S) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
112 else: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
113 s = '%s 0%% (ETA %02d:%02d:%02d)'%(self.info, H, M, S) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
114 elif self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
115 s = '%s %2d%%'%(self.info, self.num * 100. / self.total) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
116 else: |
|
3589
1be293265e61
woo, that was quick
Richard Jones <richard@users.sourceforge.net>
parents:
3544
diff
changeset
|
117 s = '%s %d done'%(self.info, self.num) |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
118 sys.stdout.write(s + ' '*(75-len(s)) + '\r') |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
119 sys.stdout.flush() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
120 |
| 2984 | 121 # vim: set et sts=4 sw=4 : |
