63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
|
|
try:
|
||
|
|
from odoo import models, fields, api, SUPERUSER_ID
|
||
|
|
from odoo.exceptions import UserError, AccessDenied
|
||
|
|
except ModuleNotFoundError:
|
||
|
|
from flectra import models, fields, api, SUPERUSER_ID
|
||
|
|
from flectra.exceptions import UserError, AccessDenied
|
||
|
|
|
||
|
|
import logging
|
||
|
|
|
||
|
|
import passlib
|
||
|
|
|
||
|
|
from ..lib import get_config
|
||
|
|
from ..lib.ldap import get_ldap_connection
|
||
|
|
|
||
|
|
_logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
_posix_shell_selection = list(map(lambda x: (x, x), ['/bin/false', '/usr/bin/nologin', '/bin/sh', '/bin/bash', '/bin/zsh']))
|
||
|
|
|
||
|
|
|
||
|
|
def _posix_uid(self):
|
||
|
|
return self.login.split('@')[0].lower()
|
||
|
|
|
||
|
|
|
||
|
|
def _posix_home_dir(self):
|
||
|
|
return f"/tmp/{self.posix_uid}"
|
||
|
|
|
||
|
|
|
||
|
|
class ResUsers(models.Model):
|
||
|
|
_inherit = 'res.users'
|
||
|
|
|
||
|
|
ssh_public_key = fields.Text(string='SSH Public Key', required=False)
|
||
|
|
posix_uid = fields.Char(required=False, string='POSIX UID', compute='_compute_posix_uid')
|
||
|
|
posix_home_directory = fields.Char(string='Posix Home', required=False, compute='_compute_posix_home_dir', store=True)
|
||
|
|
posix_login_shell = fields.Selection(_posix_shell_selection, string='SSH Login Shell', required=False, default=_posix_shell_selection[0][0])
|
||
|
|
|
||
|
|
@api.model
|
||
|
|
def _compute_posix_uid(self):
|
||
|
|
for record in self:
|
||
|
|
if True or not record.posix_uid:
|
||
|
|
record.posix_uid = _posix_uid(record)
|
||
|
|
|
||
|
|
@api.depends('posix_uid')
|
||
|
|
def _compute_posix_home_dir(self):
|
||
|
|
for record in self:
|
||
|
|
if True or not record.posix_home_directory:
|
||
|
|
record.posix_home_directory = _posix_home_dir(record)
|
||
|
|
|
||
|
|
def write(self, vals):
|
||
|
|
result = super().write(vals)
|
||
|
|
for record in self:
|
||
|
|
if record.partner_id and not self.partner_id.is_company:
|
||
|
|
with get_ldap_connection(self.env) as conn:
|
||
|
|
record.partner_id._sync_contact(conn)
|
||
|
|
return result
|
||
|
|
|
||
|
|
@api.model
|
||
|
|
def _crypt_context(self):
|
||
|
|
algo = get_config(self.env, 'ldap_password_algo', "ldap_salted_sha512")
|
||
|
|
return passlib.context.CryptContext(
|
||
|
|
["pbkdf2_sha512", algo, "plaintext"],
|
||
|
|
deprecated=["pbkdf2_sha512", "plaintext"]
|
||
|
|
)
|