node.ext.ugm 2.0.0
Node-based user and group management
License: Simplified BSD
Requires Python: >=3.10
Keywords: group, node, role, user

node.ext.ugm
============

.. image:: https://img.shields.io/pypi/v/node.ext.ugm.svg
    :target: https://pypi.python.org/pypi/node.ext.ugm
    :alt: Latest PyPI version

.. image:: https://img.shields.io/pypi/dm/node.ext.ugm.svg
    :target: https://pypi.python.org/pypi/node.ext.ugm
    :alt: Number of PyPI downloads

.. image:: https://github.com/conestack/node.ext.ugm/actions/workflows/test.yml/badge.svg
    :target: https://github.com/conestack/node.ext.ugm/actions/workflows/test.yml
    :alt: Test node.ext.ugm


Overview
--------

``node.ext.ugm`` provides an API for node based managing of users and groups.

See ``node.ext.ugm.interfaces`` for a description of the API.

A file based default implementation can be found at ``node.ext.ugm.file``.

Base objects for writing UGM implementations can be found at
``node.ext.ugm._api``.

For more information on nodes see `node <http://pypi.python.org/pypi/node>`_
package.

For more information on plumbing see
`plumber <http://pypi.python.org/pypi/plumber>`_ package.


Python Versions
===============

- Python 2.7, 3.7+
- May work with other versions (untested)


Contributors
============

- Robert Niederreiter
- Florian Friesdorf
- Jens W. Klein
- Philipp Auersperg-Castell


Changes
=======

2.0.0 (2026-02-03)
------------------

- Refactor package layout to use ``pyproject.toml`` and implicit namespace packages.
  [rnix]


1.2 (2025-10-25)
----------------

- Pin upper versions of dependencies.
  [rnix]


1.1 (2022-12-05)
----------------

- Extend ``node.ext.ugm.interfaces.IUser`` by ``expires`` and ``expired``
  attributes and provide default values on ``node.ext.ugm._api.User``.
  [rnix]

- Implement ``expires`` and ``expired`` on ``node.ext.ugm.file.UserBehavior``.
  Extend ``node.ext.ugm.file.UgmBehavior`` by ``user_expires_attr`` which
  enables used expiration support.
  [rnix]


1.0 (2022-03-18)
----------------

- Remove usage of ``Nodespaces`` behavior.
  [rnix]

- Replace deprecated use of ``Storage`` by ``MappingStorage``.
  [rnix]

- Replace deprecated use of ``Nodify`` by ``MappingNode``.
  [rnix]

- Replace deprecated use of ``NodeChildValidate`` by ``MappingConstraints``.
  [rnix]

- Replace deprecated use of ``Adopt`` by ``MappingAdopt``.
  [rnix]

- Replace deprecated use of ``allow_non_node_children`` by ``child_constraints``.
  [rnix]


0.9.13 (2021-11-08)
-------------------

- Rename deprecated ``FileStorage.allow_non_node_childs`` to
  ``allow_non_node_children``
  [rnix]


0.9.12 (2020-07-09)
-------------------

- ``node.ext.ugm.file.GroupBehavior.add`` properly raises ``KeyError`` if given
  user not exists.
  [rnix]

- Also call parent in ``node.ext.ugm.file.UserBehavior.__call__`` and
  ``node.ext.ugm.file.GroupBehavior.__call__`` if not called from parent.
  [rnix]

- ``node.ext.ugm.file.FileStorage.invalidate`` gets set with
  ``plumber.override`` instead of ``plumber.default`` to work on
  ``node.ext.ugm.file.Users`` and ``node.ext.ugm.file.Groups``.
  [rnix]

- ``node.ext.ugm.file.FileStorage`` values can be ``node.utils.UNSET``.
  [rnix]


0.9.11 (2020-05-28)
-------------------

- Implement ``invalidate`` on ``node.ext.ugm.file.Ugm``.
  [rnix, 2020-05-16]

- ``node.ext.ugm.interfaces.IUgm`` inherits from
  ``node.interfaces.IInvalidate`` now.
  [rnix, 2020-05-16]

- Describe behavior of ``__getitem__``, ``__delitem__`` and ``__iter__`` on
  ``IGroup`` interface.
  [rnix, 2020-05-11]

- Fix file based ``GroupBehavior.__getitem__`` to properly raise ``KeyError``
  when accessing user which is no member of group.
  [rnix, 2020-05-11]

- Make clear on ``User`` and ``Group`` behaviors which not impelented functions
  are abstract and which are not supported.
  [rnix, 2020-05-11]


0.9.10 (2019-11-07)
-------------------

- Also derive ``IPrincipals`` interface from ``node.interfaces.IInvalidate``.
  Implement ``invalidate`` function on ``FileStorage``.
  [rnix, 2019-06-30]

- Persist users file on password change.
  [rnix, 2019-06-30]

- Add ``UserAttributes`` and ``GroupAttributes`` classes deriving from
  ``FileAttributes`` and handle reserved attributes expected by ``cone.ugm``
  there. This might change in future.
  [rnix, 2019-06-27]

- File based principals support binary attributes now.
  [rnix, 2019-06-26]

- Return all principals in file based UGM imlementation if no search criteria
  given.
  [rnix, 2019-06-26]

- Remove superfluous ``configure.zcml`` file.
  [rnix, 2019-04-13]

- Remove ``cone.app`` main hook for initializing file based UGM implementation.
  This is handled in ``cone.app`` itself as of version 1.0
  [rnix, 2019-03-28]


0.9.9
-----

- ``node.ext.ugm.file.FileStorage`` no longer provides ``unicode_keys`` and
  ``unicode_values``, files are always read and written encoded by encoding
  defined at ``node.ext.ugm.file.ENCODING``, keys and values are always decoded
  to unicode on read.
  [rnix, 2017-06-07]

- Python 3 Support.
  [rnix, 2017-06-07]


0.9.8
-----

- Fix bug where non related principal data has been overwritten when adding
  principal on partial loaded ugm tree.
  [rnix, 2015-04-12]

- Also delete user and group corresponding data if user or group is deleted.
  [rnix, 2015-04-11]

- Fix ``node.ext.ugm.file.UsersBehavior.passwd`` behavior.
  [rnix, 2015-04-11]


0.9.7
-----

- Create user and group data directories recursiv if not exists.
  [rnix, 2014-12-02]


0.9.6
-----

- Encode plain passwd for comparing with hash.
  [rnix, 2014-09-10]


0.9.5
-----

- Use ``plumbing`` decorator instead of ``plumber`` metaclass.
  [rnix, 2014-08-01]


0.9.4
-----

- Use better password hashing for file based default UGM implementation.
  **Warning** - all existing passwords in user table do not work any longer
  and must be reset.
  [rnix, 2014-06-13]


0.9.3
-----

- Rename parts to behaviors.
  [rnix, 2012-07-29]

- adopt to ``node`` 0.9.8.
  [rnix, 2012-07-29]

- Adopt to ``plumber`` 1.2.
  [rnix, 2012-07-29]

- Add ``User.group_ids``.
  [rnix, 2012-07-26]


0.9.2
-----

- Remove outdated stuff.
  [rnix, 2012-05-18]

- Use ``zope.interface.implementer`` instead of ``zope.interface.implements``.
  [rnix, 2012-05-18]


0.9.1
-----

- add ``Users.id_for_login``.
  [rnix, 2012-01-18]

- Implement ``search`` function for file based UGM as described in interface.
  [rnix, 2011-11-22]

- Adopt application startup hook for cone.ugm only setting auth implementation
  if explicitely defined.
  [rnix, 2011-11-21]


0.9
---

- make it work
  [rnix, chaoflow]


License
=======

Copyright (c) 2011-2021, BlueDynamics Alliance, Austria
Copyright (c) 2021-2025, Node Contributors
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this
  list of conditions and the following disclaimer in the documentation and/or
  other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.