diff --git a/src/rougail/structural_bitwarden/__init__.py b/src/rougail/structural_bitwarden/__init__.py index d5d2b22..38bdbf5 100644 --- a/src/rougail/structural_bitwarden/__init__.py +++ b/src/rougail/structural_bitwarden/__init__.py @@ -19,4 +19,3 @@ from .object_model import Variable __all__ = ("Variable",) - diff --git a/src/rougail/structural_bitwarden/annotator.py b/src/rougail/structural_bitwarden/annotator.py new file mode 100644 index 0000000..c35c7d7 --- /dev/null +++ b/src/rougail/structural_bitwarden/annotator.py @@ -0,0 +1,67 @@ +""" +Silique (https://www.silique.fr) +Copyright (C) 2025 + +distribued with GPL-2 or later license + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +""" +from rougail.error import DictConsistencyError +from rougail.annotator.variable import Walk +from .i18n import _ + + +class Annotator(Walk): + """Annotate for bitwarden""" + + level = 95 + + def __init__( + self, + objectspace, + *args, # pylint: disable=unused-argument + ) -> None: + if not objectspace.paths: + return + self.objectspace = objectspace + self.check_variable() + + def check_variable(self): + for variable in self.get_variables(): + if not variable.bitwarden: + continue + path = variable.path + if variable.type not in ["unix_user", "secret"]: + msg = _('only "unix_user" or "secret" variable type can have "bitwarden" attribute, but "{0}" has type "{1}"') + raise DictConsistencyError(msg.format(path, variable.type), 301, variable.xmlfiles) + if variable.multi and path not in self.objectspace.leaders: + msg = _('the variable "{0}" has attribute "bitwarden" but is a multi variable') + raise DictConsistencyError(msg.format(path), 302, variable.xmlfiles) + check_default_value = True + if path in self.objectspace.followers: + leadership = path.rsplit('.', 1)[0] + leader_path = self.objectspace.parents[leadership][0] + leader = self.objectspace.paths[leader_path] + if leader.bitwarden: + if variable.default: + msg = _('the variable "{0}" is a follower and leader variable ("{1}") is also in Bitwarden so this variable could not have default value') + raise DictConsistencyError(msg.format(path, leader_path), 303, variable.xmlfiles) + check_default_value = False + if check_default_value and not variable.default: + msg = _('the variable "{0}" is in Bitwarden so should have default value') + raise DictConsistencyError(msg.format(path), 304, variable.xmlfiles) + self.objectspace.informations.add(path, "bitwarden", True) + self.objectspace.informations.add(path, "default_value_makes_sense", False) + self.objectspace.properties.add(path, "novalidator", True)