Source code for privacyidea.models.audit

# SPDX-FileCopyrightText: (C) 2025 NetKnights GmbH <https://netknights.it>
# SPDX-FileCopyrightText: (C) 2025 Paul Lettich <paul.lettich@netknights.it>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# This code is free software; you can redistribute it and/or
# modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
# as published by the Free Software Foundation; either
# version 3 of the License, or any later version.
#
# This code is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE for more details.
#
# You should have received a copy of the GNU Affero General Public
# License along with this program.  If not, see <http://www.gnu.org/licenses/>.

from datetime import datetime

from sqlalchemy import Sequence

from privacyidea.models import db
from privacyidea.models.utils import MethodsMixin
from privacyidea.lib.utils import convert_column_to_unicode

audit_column_length = {"signature": 620,
                       "action": 200,
                       "serial": 40,
                       "token_type": 12,
                       "user": 100,
                       "realm": 255,
                       "resolver": 255,
                       "administrator": 100,
                       "action_detail": 500,
                       "info": 500,
                       "privacyidea_server": 255,
                       "client": 50,
                       "loglevel": 12,
                       "clearance_level": 12,
                       "thread_id": 20,
                       "authentication": 12,
                       "user_agent": 50,
                       "user_agent_version": 20,
                       "policies": 255,
                       "container_serial": 40,
                       "container_type": 100}
AUDIT_TABLE_NAME = 'pidea_audit'


[docs] class Audit(MethodsMixin, db.Model): """ This class stores the Audit entries """ __tablename__ = AUDIT_TABLE_NAME id = db.Column(db.Integer, Sequence("audit_seq"), primary_key=True) date = db.Column(db.DateTime, index=True) startdate = db.Column(db.DateTime) duration = db.Column(db.Interval(second_precision=6)) signature = db.Column(db.Unicode(audit_column_length.get("signature"))) action = db.Column(db.Unicode(audit_column_length.get("action"))) success = db.Column(db.Integer) authentication = db.Column(db.Unicode(audit_column_length.get("authentication"))) serial = db.Column(db.Unicode(audit_column_length.get("serial"))) token_type = db.Column(db.Unicode(audit_column_length.get("token_type"))) container_serial = db.Column(db.Unicode(audit_column_length.get("container_serial"))) container_type = db.Column(db.Unicode(audit_column_length.get("container_type"))) user = db.Column(db.Unicode(audit_column_length.get("user")), index=True) realm = db.Column(db.Unicode(audit_column_length.get("realm"))) resolver = db.Column(db.Unicode(audit_column_length.get("resolver"))) administrator = db.Column(db.Unicode(audit_column_length.get("administrator"))) action_detail = db.Column(db.Unicode(audit_column_length.get("action_detail"))) info = db.Column(db.Unicode(audit_column_length.get("info"))) privacyidea_server = db.Column(db.Unicode(audit_column_length.get("privacyidea_server"))) client = db.Column(db.Unicode(audit_column_length.get("client"))) user_agent = db.Column(db.Unicode(audit_column_length.get("user_agent"))) user_agent_version = db.Column(db.Unicode(audit_column_length.get("user_agent_version"))) loglevel = db.Column(db.Unicode(audit_column_length.get("loglevel"))) clearance_level = db.Column(db.Unicode(audit_column_length.get("clearance_level"))) thread_id = db.Column(db.Unicode(audit_column_length.get("thread_id"))) policies = db.Column(db.Unicode(audit_column_length.get("policies"))) def __init__(self, action="", success=0, authentication="", serial="", token_type="", container_serial="", container_type="", user="", realm="", resolver="", administrator="", action_detail="", info="", privacyidea_server="", client="", user_agent="", user_agent_version="", loglevel="default", clearance_level="default", thread_id="0", policies="", startdate=None, duration=None ): self.signature = "" self.date = datetime.now() self.startdate = startdate self.duration = duration self.action = convert_column_to_unicode(action) self.success = success self.authentication = convert_column_to_unicode(authentication) self.serial = convert_column_to_unicode(serial) self.token_type = convert_column_to_unicode(token_type) self.container_serial = convert_column_to_unicode(container_serial) self.container_type = convert_column_to_unicode(container_type) self.user = convert_column_to_unicode(user) self.realm = convert_column_to_unicode(realm) self.resolver = convert_column_to_unicode(resolver) self.administrator = convert_column_to_unicode(administrator) self.action_detail = convert_column_to_unicode(action_detail) self.info = convert_column_to_unicode(info) self.privacyidea_server = convert_column_to_unicode(privacyidea_server) self.client = convert_column_to_unicode(client) self.loglevel = convert_column_to_unicode(loglevel) self.clearance_level = convert_column_to_unicode(clearance_level) self.thread_id = convert_column_to_unicode(thread_id) self.policies = convert_column_to_unicode(policies) self.user_agent = convert_column_to_unicode(user_agent) self.user_agent_version = convert_column_to_unicode(user_agent_version)