Metadata-Version: 2.1
Name: blabing
Version: 0.1.2
Summary: Building a convenient CLI on top of LDAP3
Author-email: Julien Tayon <julien@tayon.net>
Maintainer-email: Julien Tayon <julien@tayon.net>
License: PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
        --------------------------------------------
        
        1. This LICENSE AGREEMENT is between the Python Software Foundation
        ("PSF"), and the Individual or Organization ("Licensee") accessing and
        otherwise using this software ("Python") in source or binary form and
        its associated documentation.
        
        2. Subject to the terms and conditions of this License Agreement, PSF
        hereby grants Licensee a nonexclusive, royalty-free, world-wide
        license to reproduce, analyze, test, perform and/or display publicly,
        prepare derivative works, distribute, and otherwise use Python
        alone or in any derivative version, provided, however, that PSF's
        License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
        2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights
        Reserved" are retained in Python alone or in any derivative version
        prepared by Licensee.
        
        3. In the event Licensee prepares a derivative work that is based on
        or incorporates Python or any part thereof, and wants to make
        the derivative work available to others as provided herein, then
        Licensee hereby agrees to include in any such work a brief summary of
        the changes made to Python.
        
        4. PSF is making Python available to Licensee on an "AS IS"
        basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
        IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
        DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
        FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
        INFRINGE ANY THIRD PARTY RIGHTS.
        
        5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
        FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
        A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
        OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
        
        6. This License Agreement will automatically terminate upon a material
        breach of its terms and conditions.
        
        7. Nothing in this License Agreement shall be deemed to create any
        relationship of agency, partnership, or joint venture between PSF and
        Licensee. This License Agreement does not grant permission to use PSF
        trademarks or trade name in a trademark sense to endorse or promote
        products or services of Licensee, or any third party.
        
        8. By copying, installing or otherwise using Python, Licensee
        agrees to be bound by the terms and conditions of this License
        Agreement.
        
        BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
        -------------------------------------------
        
        BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
        
        1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
        office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
        Individual or Organization ("Licensee") accessing and otherwise using
        this software in source or binary form and its associated
        documentation ("the Software").
        
        2. Subject to the terms and conditions of this BeOpen Python License
        Agreement, BeOpen hereby grants Licensee a non-exclusive,
        royalty-free, world-wide license to reproduce, analyze, test, perform
        and/or display publicly, prepare derivative works, distribute, and
        otherwise use the Software alone or in any derivative version,
        provided, however, that the BeOpen Python License is retained in the
        Software, alone or in any derivative version prepared by Licensee.
        
        3. BeOpen is making the Software available to Licensee on an "AS IS"
        basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
        IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
        DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
        FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
        INFRINGE ANY THIRD PARTY RIGHTS.
        
        4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
        SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
        AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
        DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
        
        5. This License Agreement will automatically terminate upon a material
        breach of its terms and conditions.
        
        6. This License Agreement shall be governed by and interpreted in all
        respects by the law of the State of California, excluding conflict of
        law provisions. Nothing in this License Agreement shall be deemed to
        create any relationship of agency, partnership, or joint venture
        between BeOpen and Licensee. This License Agreement does not grant
        permission to use BeOpen trademarks or trade names in a trademark
        sense to endorse or promote products or services of Licensee, or any
        third party. As an exception, the "BeOpen Python" logos available at
        http://www.pythonlabs.com/logos.html may be used according to the
        permissions granted on that web page.
        
        7. By copying, installing or otherwise using the software, Licensee
        agrees to be bound by the terms and conditions of this License
        Agreement.
        
        CNRI OPEN SOURCE LICENSE AGREEMENT (for Python 1.6b1)
        --------------------------------------------------
        
        IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY.
        
        BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING,
        INSTALLING OR OTHERWISE USING PYTHON 1.6, beta 1 SOFTWARE, YOU ARE
        DEEMED TO HAVE AGREED TO THE TERMS AND CONDITIONS OF THIS LICENSE
        AGREEMENT.
        
        1. This LICENSE AGREEMENT is between the Corporation for National
        Research Initiatives, having an office at 1895 Preston White Drive,
        Reston, VA 20191 ("CNRI"), and the Individual or Organization
        ("Licensee") accessing and otherwise using Python 1.6, beta 1
        software in source or binary form and its associated documentation,
        as released at the www.python.org Internet site on August 4, 2000
        ("Python 1.6b1").
        
        2. Subject to the terms and conditions of this License Agreement, CNRI
        hereby grants Licensee a non-exclusive, royalty-free, world-wide
        license to reproduce, analyze, test, perform and/or display
        publicly, prepare derivative works, distribute, and otherwise use
        Python 1.6b1 alone or in any derivative version, provided, however,
        that CNRIs License Agreement is retained in Python 1.6b1, alone or
        in any derivative version prepared by Licensee.
        
        Alternately, in lieu of CNRIs License Agreement, Licensee may
        substitute the following text (omitting the quotes): "Python 1.6,
        beta 1, is made available subject to the terms and conditions in
        CNRIs License Agreement. This Agreement may be located on the
        Internet using the following unique, persistent identifier (known
        as a handle): 1895.22/1011. This Agreement may also be obtained
        from a proxy server on the Internet using the
        URL:http://hdl.handle.net/1895.22/1011".
        
        3. In the event Licensee prepares a derivative work that is based on
        or incorporates Python 1.6b1 or any part thereof, and wants to make
        the derivative work available to the public as provided herein,
        then Licensee hereby agrees to indicate in any such work the nature
        of the modifications made to Python 1.6b1.
        
        4. CNRI is making Python 1.6b1 available to Licensee on an "AS IS"
        basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
        IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
        DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR
        FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6b1
        WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
        
        5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
        SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
        LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING PYTHON 1.6b1,
        OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY
        THEREOF.
        
        6. This License Agreement will automatically terminate upon a material
        breach of its terms and conditions.
        
        7. This License Agreement shall be governed by and interpreted in all
        respects by the law of the State of Virginia, excluding conflict of
        law provisions. Nothing in this License Agreement shall be deemed
        to create any relationship of agency, partnership, or joint venture
        between CNRI and Licensee. This License Agreement does not grant
        permission to use CNRI trademarks or trade name in a trademark
        sense to endorse or promote products or services of Licensee, or
        any third party.
        
        8. By clicking on the "ACCEPT" button where indicated, or by copying,
        installing or otherwise using Python 1.6b1, Licensee agrees to be
        bound by the terms and conditions of this License Agreement.
        
        ACCEPT
        
        CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
        --------------------------------------------------
        
        Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
        The Netherlands. All rights reserved.
        
        Permission to use, copy, modify, and distribute this software and its
        documentation for any purpose and without fee is hereby granted,
        provided that the above copyright notice appear in all copies and that
        both that copyright notice and this permission notice appear in
        supporting documentation, and that the name of Stichting Mathematisch
        Centrum or CWI not be used in advertising or publicity pertaining to
        distribution of the software without specific, written prior
        permission.
        
        STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
        THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
        FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
        FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        
Project-URL: Homepage, https://github.com/jul/bla
Keywords: LDAP,cli
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python
Provides: blabing
Requires-Python: >=3.9
Description-Content-Type: text/x-rst
License-File: LICENSE.txt
Requires-Dist: ldap3
Requires-Dist: tempdir
Requires-Dist: PyYAML
Requires-Dist: ipython
Requires-Dist: pygments-ldif
Requires-Dist: flask

=======================
BLA : Brutal LDAP Admin
=======================


Synopsis
========

LDAP is a great extensible Entity Value (key/value storage) with security in mind. It's a great tool with a terrible User Experience when it comes to the tooling.


Why people (as I) are reluctant to use it ?


First problem CLI tools
***********************

- without kerberos CLI tools implies either to type password **for every
  operations (search, add modify)** or have it in
  seeable in history (if you don't use *secrets* my bash tool to solve this
  problem);
- who can remember what **-b, -x, -W, -w, -s** means ? CLI becames unreadable.

WE NEED A GOOD DSL (Domain specific language)

We also want history since we often make the same operation over and over again.



Second Problem
**************

LDAP is a NoSQL without fixed schema, but STRONGLY TYPED and with non intuitive behaviour:

Indexes behaviour
-----------------

unless explicitly told by default *description* fields and *aRecord*
(ip address) can only be searched on the base of exact value. For aRecord
it makes sense in terms of performance and use case (DNS backend), for 
descriptions it does not.

So how do you search for all descriptions were sysadmins lovingly put
informations about for whom a field was created in which context ?



Default settings
----------------

The size limits of 500 entries. Searching in the whole tree for one entry
if you don't exactly know what kind of object to search for will hit this limit.

Infuriating. Especially that permissions are in LDIF format and pretty hard to 
grock.

BLA is a path towards this
==========================

*brutal* a lib that intends to be usable out of the box to help develop tools.
*bla* a CLI tools using ipython for history, completion and documentation
*lhl* a web explorer

Design choices
**************

- GCU style to make a usable prototype to show the behaviour;
- except for ldap3 the cli tool uses only stdlib;
- using an implicit local or global configuration to setup the ldap 
  access/options;
- a templating tool to insert default on the fly that the library does not 
  support in order to easily craft your own request
- helpers to recursively search for any entries bypassing the 500 items limits
- *COLORS* because life is too short to have a monotone CLI (but actually
  does have it has a fallback mode)


Demo
====

example:

.. code-block:: bash

    # activate your virtual env
    python3 -mpip install blabing
    # standalone ldap server for tests
    standalone_ldap.sh slap
    # calling bla with credentials for this server, and calling test.bla  
    # which creates ou=people,dc=home and create 3 users there
    cat bla.test
     ldap.add("dc=home", [ "dcObject", "organization", "top"], dict(dc="home", o="home"))
     ldap.add("ou=people,dc=home",  'organizationalUnit', dict(ou="people"))
     [ user_add(i) for i in ( "boss", "manager", "louis" ) ]
     ldap.add("ou=group,dc=home",  'organizationalUnit', dict(ou="group"))
     ldap.add("cn=staff,ou=group,dc=home",  ['top', "groupOfNames"],attributes= dict(member=["uid=boss,ou=people,dc=home" ]))
     search("(uid=boss)", attributes="memberOf")
     list(walk("dc=home",lambda e:e.entry_dn))
     pe(get("uid=boss,ou=people,dc=home"))
     password("uid=boss,ou=people,dc=home")
     pe(get("uid=boss,ou=people,dc=home"))

    bla bla.no_tls.json test.bla
    # fill in a password has demanded
    # exit
    # browse the tree
    lhl bla.no_tls.json
    firefox http://127.0.0.1:5001


.. image:: ./img/screenshot.png

