[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:
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 | ||||