This revision introduces two new config parameters and the corresponding server startup parameters: - osv_memory_count_limit: limit on number or records in each osv_mem table - osv_memory_age_limit: limit on maximum age of records in each osv_mem table The default values have been changed to count=False (disabled), age=1 (hour), so that in the default config the server will only expire osv_memory records that are 1 hour old or more, avoiding problems related with some osv_memory classes that instantiate a large number of short-lived objects. A corresponding set of YAML tests has been added to test the proper behaviour of the new parameters, and check the various use cases. lp bug: https://launchpad.net/bugs/555271 fixed lp bug: https://launchpad.net/bugs/709559 fixed bzr revid: odo@openerp.com-20110208140924-0bgxqgt1oyrxwz3z
96 lines
4.2 KiB
YAML
96 lines
4.2 KiB
YAML
- |
|
|
To check that common dangerous operations are not allowed by the safe_eval mechanism, attempt to
|
|
evaluate unauthorized expressions, and verify that they trigger an error.
|
|
-
|
|
1. Try a few common expressions to verify they work with safe_eval
|
|
-
|
|
!python {model: ir.model}: |
|
|
from tools.safe_eval import safe_eval
|
|
expected = (1, {"a": 9 * 2}, (True, False, None))
|
|
actual = safe_eval('(1, {"a": 9 * 2}, (True, False, None))')
|
|
assert actual == expected, "Simple python expressions are not working with safe_eval"
|
|
-
|
|
2. Try simple literal definition to verify it works with literal_eval
|
|
-
|
|
!python {model: ir.model}: |
|
|
from tools.safe_eval import literal_eval
|
|
expected = (1, {"a": 9}, (True, False, None))
|
|
actual = literal_eval('(1, {"a": 9}, (True, False, None))')
|
|
assert actual == expected, "Simple python expressions are not working with literal_eval"
|
|
-
|
|
3. Try arithmetic expression in literal_eval to verify it does not work
|
|
-
|
|
!python {model: ir.model}: |
|
|
from tools.safe_eval import literal_eval
|
|
try:
|
|
literal_eval('(1, {"a": 2*9}, (True, False, None))')
|
|
assert False, "literal_eval should not accept arithmetic expressions"
|
|
except ValueError:
|
|
pass
|
|
-
|
|
4. Try forbidden expressions in literal_eval to verify they are not allowed
|
|
-
|
|
!python {model: ir.model}: |
|
|
from tools.safe_eval import literal_eval
|
|
try:
|
|
literal_eval('{"a": True.__class__}')
|
|
assert False, "literal_eval should accept only literals"
|
|
except ValueError:
|
|
pass
|
|
-
|
|
5. Try forbidden expressions in safe_eval to verify they are not allowed (open)
|
|
-
|
|
!python {model: ir.model}: |
|
|
from tools.safe_eval import safe_eval
|
|
try:
|
|
safe_eval('open("/etc/passwd","r")')
|
|
assert False, "safe_eval should not allow calling open() builtin"
|
|
except NameError:
|
|
pass
|
|
except:
|
|
# NameError should be raised because open() builtin is not found,
|
|
# but other exceptions probably indicate that open() was executed!
|
|
assert False, "safe_eval should not allow calling open() builtin"
|
|
-
|
|
"OSV Memory: Verify that osv_memory properly handles large data allocation"
|
|
-
|
|
1. No "count-based" auto-vaccuum when max_count is disabled
|
|
-
|
|
!python {model: base.language.export}: |
|
|
# setup special limits for the test, these will be reset at next pool reload anyway
|
|
self._max_count = None
|
|
num_recs = 250
|
|
for i in xrange(num_recs):
|
|
self.create(cr, uid, {'format':'po'})
|
|
assert (len(self.datas) >= num_recs), "OSV Memory must not auto-vaccum records from the current transaction if max_count is not set"
|
|
-
|
|
2. Auto-vaccuum should be enabled when max_count is set
|
|
-
|
|
!python {model: base.language.export}: |
|
|
# setup special limits for the test, these will be reset at next pool reload anyway
|
|
self._max_count = 100
|
|
num_recs = 219
|
|
for i in xrange(num_recs):
|
|
self.create(cr, uid, {'name': i, 'format':'po'})
|
|
assert (self._max_count <= len(self.datas) < self._max_count + self._check_time), "OSV Memory must auto-expire records when max_count is reached"
|
|
for k,v in self.datas.iteritems():
|
|
assert (int(v['name']) >= (num_recs - (self._max_count + self._check_time))), "OSV Memory must auto-expire records based on age"
|
|
-
|
|
3. Auto-vaccuum should be based on age only when max_count is not set
|
|
-
|
|
!python {model: base.language.export}: |
|
|
# setup special limits for the test, these will be reset at next pool reload anyway
|
|
self._max_count = None
|
|
self._max_hours = 0.01 #36 seconds
|
|
num_recs = 200
|
|
for i in xrange(num_recs):
|
|
self.create(cr, uid, {'format':'po'})
|
|
assert (len(self.datas) >= num_recs), "OSV Memory must not auto-expire records from the current transaction"
|
|
|
|
# expire all records
|
|
for k,v in self.datas.iteritems():
|
|
v['internal.date_access'] = 0
|
|
self.vaccum(cr, 1, force=True)
|
|
|
|
assert (len(self.datas) == 0), "OSV Memory must expire old records after vaccuum"
|