#5 Migrate to 12.0

Additionally, allowing the field to be written to improves the UI by automatically highlighting it and doesn't really have any negative side effects. (how could you alter the hmac?)
This commit is contained in:
Jared Kipe
2018-12-28 18:54:20 -08:00
parent a562cb590d
commit 64ee02a10c
8 changed files with 27 additions and 25 deletions

View File

@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from . import controllers from . import controllers
from . import models from . import models
from . import wizard from . import wizard

View File

@@ -1,10 +1,8 @@
# -*- coding: utf-8 -*-
{ {
'name': 'Auth Admin', 'name': 'Auth Admin',
'author': 'Hibou Corp. <hello@hibou.io>', 'author': 'Hibou Corp. <hello@hibou.io>',
'category': 'Hidden', 'category': 'Hidden',
'version': '11.0.0.0.0', 'version': '12.0.1.0.0',
'description': 'description':
""" """
Login as other user Login as other user

View File

@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from odoo import http, exceptions from odoo import http, exceptions
from ..models.res_users import check_admin_auth_login from ..models.res_users import check_admin_auth_login

View File

@@ -1,2 +1 @@
# -*- coding: utf-8 -*-
from . import res_users from . import res_users

View File

@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from odoo import models, api, exceptions from odoo import models, api, exceptions
from odoo.http import request from odoo.http import request
from datetime import datetime from datetime import datetime
@@ -10,6 +8,7 @@ from hashlib import sha256
from logging import getLogger from logging import getLogger
_logger = getLogger(__name__) _logger = getLogger(__name__)
def admin_auth_generate_login(env, user): def admin_auth_generate_login(env, user):
""" """
Generates a URL to allow the current user to login as the portal user. Generates a URL to allow the current user to login as the portal user.
@@ -36,6 +35,7 @@ def admin_auth_generate_login(env, user):
return base_url + '/auth_admin?u=' + u + '&e=' + e + '&o=' + o + '&h=' + h.hexdigest() return base_url + '/auth_admin?u=' + u + '&e=' + e + '&o=' + o + '&h=' + h.hexdigest()
def check_admin_auth_login(env, u_user_id, e_expires, o_org_user_id, hash_): def check_admin_auth_login(env, u_user_id, e_expires, o_org_user_id, hash_):
""" """
Checks that the parameters are valid and that the user exists. Checks that the parameters are valid and that the user exists.
@@ -58,14 +58,14 @@ def check_admin_auth_login(env, u_user_id, e_expires, o_org_user_id, hash_):
myh = hmac.new(key.encode(), str(str(u_user_id) + str(e_expires) + str(o_org_user_id)).encode(), sha256) myh = hmac.new(key.encode(), str(str(u_user_id) + str(e_expires) + str(o_org_user_id)).encode(), sha256)
if not hmac.compare_digest(hash_, myh.hexdigest()): if not hmac.compare_digest(hash_, myh.hexdigest()):
raise exceptions.Warning('Invalid Request') raise exceptions.AccessDenied('Invalid Request')
if not (now <= int(e_expires) <= fifteen): if not (now <= int(e_expires) <= fifteen):
raise exceptions.Warning('Expired') raise exceptions.AccessDenied('Expired')
user = env['res.users'].sudo().search([('id', '=', int(u_user_id))], limit=1) user = env['res.users'].sudo().search([('id', '=', int(u_user_id))], limit=1)
if not user.id: if not user.id:
raise exceptions.Warning('Invalid User') raise exceptions.AccessDenied('Invalid User')
return user return user
@@ -82,9 +82,12 @@ class ResUsers(models.Model):
return False return False
@api.model def _check_credentials(self, password):
def check_credentials(self, password): try:
if request and hasattr(request, 'session') and request.session.get('auth_admin'): return super(ResUsers, self)._check_credentials(password)
_logger.warn('check_credentials for user id: ' + str(request.session.uid) + ' original user id: ' + str(request.session.auth_admin)) except exceptions.AccessDenied:
return True if request and hasattr(request, 'session') and request.session.get('auth_admin'):
return super(ResUsers, self).check_credentials(password) _logger.warn('_check_credentials for user id: ' + \
str(request.session.uid) + ' original user id: ' + str(request.session.auth_admin))
else:
raise

View File

@@ -1,2 +1 @@
# -*- coding: utf-8 -*-
from . import portal_wizard from . import portal_wizard

View File

@@ -9,7 +9,13 @@ class PortalWizard(models.TransientModel):
def admin_auth_generate_login(self): def admin_auth_generate_login(self):
self.ensure_one() self.ensure_one()
self.user_ids.admin_auth_generate_login() self.user_ids.admin_auth_generate_login()
return {'type': 'ir.actions.do_nothing'} return {
"type": "ir.actions.act_window",
"res_model": self._name,
"views": [[False, "form"]],
"res_id": self.id,
"target": "new",
}
class PortalWizardUser(models.TransientModel): class PortalWizardUser(models.TransientModel):
@@ -20,8 +26,8 @@ class PortalWizardUser(models.TransientModel):
@api.multi @api.multi
def admin_auth_generate_login(self): def admin_auth_generate_login(self):
ir_model_access = self.env['ir.model.access'] ir_model_access = self.env['ir.model.access']
for row in self: for row in self.filtered(lambda r: r.in_portal):
row.force_login_url = ''
user = row.partner_id.user_ids[0] if row.partner_id.user_ids else None user = row.partner_id.user_ids[0] if row.partner_id.user_ids else None
if ir_model_access.check('res.partner', mode='unlink') and row.in_portal and user: if ir_model_access.check('res.partner', mode='unlink') and user:
row.force_login_url = admin_auth_generate_login(self.env, user) row.force_login_url = admin_auth_generate_login(self.env, user)
self.filtered(lambda r: not r.in_portal).update({'force_login_url': ''})

View File

@@ -7,10 +7,10 @@
<field name="inherit_id" ref="portal.wizard_view"/> <field name="inherit_id" ref="portal.wizard_view"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='in_portal']" position="after"> <xpath expr="//field[@name='in_portal']" position="after">
<field name="force_login_url" readonly="1"/> <field name="force_login_url"/>
</xpath> </xpath>
<xpath expr="//button[last()]" position="after"> <xpath expr="//button[last()]" position="after">
<button string="Generate Login URL" type="object" name="admin_auth_generate_login" class="btn-default" /> <button string="Generate Login URL" type="object" name="admin_auth_generate_login" class="btn-primary" />
</xpath> </xpath>
</field> </field>
</record> </record>