[IMP] base, *: tighten ir.model access rights

Remove unrestricted "read" access.  To make code internally using `ir.model`
work, add a private method `_get` on `ir.model` to retrieve the record
corresponding to a model name, without access rights issue.

Change signature of method `get_authorized_fields` to make it use a model name
instead of a model id.  This removes the necessity of a search on `ir.model`.
This commit is contained in:
Raphael Collet
2017-01-03 16:52:49 +01:00
parent 1abd543f14
commit 5d746d0ac6
24 changed files with 64 additions and 76 deletions
+4 -12
View File
@@ -59,11 +59,8 @@ class IrModelFieldsAnonymization(models.Model):
@api.model
def _get_model_and_field_ids(self, vals):
if vals.get('field_name') and vals.get('model_name'):
model_id = self.env['ir.model'].search([('model', '=', vals['model_name'])], limit=1).id
if model_id:
field_id = self.env['ir.model.fields'].search([('name', '=', vals['field_name']), ('model_id', '=', model_id)], limit=1).id
if field_id:
return (model_id, field_id)
field = self.env['ir.model.fields']._get(vals['model_name'], vals['field_name'])
return (field.model_id.id, field.id)
return (False, False)
@api.model
@@ -109,17 +106,12 @@ class IrModelFieldsAnonymization(models.Model):
def _onchange_model_name(self):
self.field_name = False
self.field_id = False
if self.model_name:
self.model_id = self.env['ir.model'].search([('model', '=', self.model_name)], limit=1)
else:
self.model_id = False
self.model_id = self.env['ir.model']._get(self.model_name)
@api.onchange('field_name')
def _onchange_field_name(self):
if self.field_name and self.model_name:
self.field_id = self.env['ir.model.fields'].search([
('name', '=', self.field_name), ('model', '=', self.model_name)
], limit=1)
self.field_id = self.env['ir.model.fields']._get(self.model_name, self.field_name)
else:
self.field_id = False
+2 -2
View File
@@ -111,10 +111,10 @@ class Alias(models.Model):
if vals.get('alias_name'):
vals['alias_name'] = self._clean_and_make_unique(vals.get('alias_name'))
if model_name:
model = self.env['ir.model'].search([('model', '=', model_name)])
model = self.env['ir.model']._get(model_name)
vals['alias_model_id'] = model.id
if parent_model_name:
model = self.env['ir.model'].search([('model', '=', parent_model_name)])
model = self.env['ir.model']._get(parent_model_name)
vals['alias_parent_model_id'] = model.id
return super(Alias, self).create(vals)
+1 -1
View File
@@ -40,7 +40,7 @@ class Followers(models.Model):
:param force: if True, delete existing followers before creating new one
using the subtypes given in the parameters
"""
res_model_id = self.env['ir.model'].search([('model', '=', res_model)], limit=1).id
res_model_id = self.env['ir.model']._get(res_model).id
force_mode = force or (all(data for data in partner_data.values()) and all(data for data in channel_data.values()))
generic = []
specific = {}
+1 -1
View File
@@ -212,7 +212,7 @@ class MailMail(models.Model):
try:
# TDE note: remove me when model_id field is present on mail.message - done here to avoid doing it multiple times in the sub method
if mail.model:
model = self.env['ir.model'].sudo().search([('model', '=', mail.model)])[0]
model = self.env['ir.model']._get(mail.model)[0]
else:
model = None
if model:
+4 -4
View File
@@ -106,7 +106,7 @@ class MailTemplate(models.Model):
def default_get(self, fields):
res = super(MailTemplate, self).default_get(fields)
if res.get('model'):
res['model_id'] = self.env['ir.model'].search([('model', '=', res.pop('model'))]).id
res['model_id'] = self.env['ir.model']._get(res.pop('model')).id
return res
name = fields.Char('Name')
@@ -201,9 +201,9 @@ class MailTemplate(models.Model):
def onchange_sub_model_object_value_field(self):
if self.model_object_field:
if self.model_object_field.ttype in ['many2one', 'one2many', 'many2many']:
models = self.env['ir.model'].search([('model', '=', self.model_object_field.relation)])
if models:
self.sub_object = models.id
model = self.env['ir.model']._get(self.model_object_field.relation)
if model:
self.sub_object = model.id
self.copyvalue = self.build_expression(self.model_object_field.name, self.sub_model_object_field and self.sub_model_object_field.name or False, self.null_value or False)
else:
self.sub_object = False
+3 -3
View File
@@ -229,7 +229,7 @@ class MailThread(models.AbstractModel):
# automatic logging unless asked not to (mainly for various testing purpose)
if not self._context.get('mail_create_nolog'):
doc_name = self.env['ir.model'].search([('model', '=', self._name)]).read(['name'])[0]['name']
doc_name = self.env['ir.model']._get(self._name).name
thread.message_post(body=_('%s created') % doc_name)
# auto_subscribe: take values and defaults into account
@@ -663,7 +663,7 @@ class MailThread(models.AbstractModel):
access_link = self._notification_link_helper('view', message_id=message.id)
if message.model:
model_name = self.env['ir.model'].sudo().search([('model', '=', self.env[message.model]._name)]).name_get()[0][1]
model_name = self.env['ir.model']._get(message.model).display_name
view_title = '%s %s' % (_('View'), model_name)
else:
view_title = _('View')
@@ -1133,7 +1133,7 @@ class MailThread(models.AbstractModel):
dest_aliases = Alias.search([('alias_name', 'in', rcpt_tos_localparts)])
if dest_aliases:
routes = []
for alias in dest_aliases:
for alias in dest_aliases.sudo():
user_id = alias.alias_user_id.id
if not user_id:
# TDE note: this could cause crashes, because no clue that the user
+1 -1
View File
@@ -65,7 +65,7 @@ class Partner(models.Model):
model_name = False
if message.model:
model_name = self.env['ir.model'].sudo().search([('model', '=', self.env[message.model]._name)]).name_get()[0][1]
model_name = self.env['ir.model']._get(message.model).display_name
record_name = message.record_name
+3 -3
View File
@@ -25,7 +25,7 @@ class TestMailFollowers(TestMail):
'mail.channel', groups.ids,
{self.user_employee.partner_id.id: [self.mt_mg_nodef.id]},
{test_channel.id: [self.mt_al_nodef.id]})
mail_channel_model_id = self.env['ir.model'].search([('model', '=', 'mail.channel')], limit=1).id
mail_channel_model_id = self.env['ir.model']._get('mail.channel').id
self.assertFalse(specific)
self.assertEqual(len(generic), 2)
@@ -40,7 +40,7 @@ class TestMailFollowers(TestMail):
def test_m2o_command_update_selective(self):
test_channel = self.env['mail.channel'].create({'name': 'Test'})
mail_channel_model_id = self.env['ir.model'].search([('model', '=', 'mail.channel')], limit=1).id
mail_channel_model_id = self.env['ir.model']._get('mail.channel').id
groups = self.group_pigs | self.group_public
self.env['mail.followers'].create({'partner_id': self.user_employee.partner_id.id, 'res_model_id': mail_channel_model_id, 'res_id': self.group_pigs.id})
generic, specific = self.env['mail.followers']._add_follower_command(
@@ -136,7 +136,7 @@ class TestMailFollowers(TestMail):
})
with self.assertRaises(Int