feat(shopfloor): _tablet_session_audit helper for audit-log writes
Single source for sha256(session sid), ua trim, ip/acting_uid capture from request. Used by unlock_session, lock_session, and force-lock cron. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Helper for writing fp.tablet.session.event rows from the new
|
||||
unlock_session / lock_session endpoints and the force-lock cron.
|
||||
|
||||
Single source of truth for hashing the session sid, trimming the
|
||||
user-agent, and capturing forensic ip / acting_uid.
|
||||
"""
|
||||
import hashlib
|
||||
|
||||
from odoo import fields
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
def _sha256_session_sid(sid):
|
||||
"""Return sha256 hex digest of the session sid. Stored in the audit
|
||||
log so DB leaks can't be replayed."""
|
||||
if not sid:
|
||||
return ''
|
||||
return hashlib.sha256(sid.encode('utf-8')).hexdigest()
|
||||
|
||||
|
||||
def _trim_ua(ua):
|
||||
"""Trim user-agent to 256 chars (Odoo's standard Char width)."""
|
||||
if not ua:
|
||||
return ''
|
||||
return ua[:256]
|
||||
|
||||
|
||||
def write_event(env, *, event_type, user_id=None, attempted_user_id=None,
|
||||
session_id_hash=None, session_started_at=None,
|
||||
session_ended_at=None, duration_seconds=None,
|
||||
failure_reason=None, notes=None):
|
||||
"""Append an fp.tablet.session.event row. All writes sudo'd.
|
||||
|
||||
The acting_uid + ip + ua are pulled from the current request
|
||||
automatically so callers never forget them.
|
||||
"""
|
||||
vals = {
|
||||
'event_type': event_type,
|
||||
'user_id': user_id,
|
||||
'attempted_user_id': attempted_user_id,
|
||||
'session_id_hash': session_id_hash,
|
||||
'session_started_at': session_started_at,
|
||||
'session_ended_at': session_ended_at,
|
||||
'duration_seconds': duration_seconds,
|
||||
'failure_reason': failure_reason,
|
||||
'notes': notes,
|
||||
'acting_uid': env.uid,
|
||||
}
|
||||
if request:
|
||||
vals['ip_address'] = request.httprequest.remote_addr or ''
|
||||
vals['user_agent'] = _trim_ua(
|
||||
request.httprequest.headers.get('User-Agent', '')
|
||||
)
|
||||
return env['fp.tablet.session.event'].sudo().create(vals)
|
||||
Reference in New Issue
Block a user