def checkResponseStatus(response):
    """
    Vérifie si le code status passé est un code de réussite ou pas (réussite = 0)
    Lève une exception selon le type d'erreur

    :param response: la réponse de l'appel à l'API
    :return: True si le code est 0, levée d'exception sinon
    :raises TypeError: Exception levée si le paramètre n'est pas un OrderedDict et si il ne possède pas un champs type avec la valeur integer
    """
    try:
        status = utils.changeToInt(response["status"])
    except TypeError:
        raise ServiceException(response["status"], response["message"])

    if status != 0:
        # On essaie de déterminer les erreurs temporaires versus définitives, à partir du contenu de response["message"]
        if re.search(
                '(unable to get connection|Invalid token|Accès refusé|Une erreur système bloque votre requête|LDAP error|system failure|unable to create entry|unable to create account)',
                response["message"]):
            raise TmpServiceException(response["status"], response["message"])
        elif re.search(
                '(no such account|no such domain|no such distribution list|no such cos)',
                response["message"]):
            raise NotFoundException(response["status"], response["message"])
        else:
            raise ServiceException(response["status"], response["message"])

    return True
예제 #2
0
def getAllCOS(domain, limit=100, offset=0, ldapQuery=""):
    """
    Permet de rechercher toutes les classes de service d'un domain

    :param domain: le domaine de la recherche
    :param limit: le nombre de résultats renvoyés (optionnel)
    :param offset: le nombre à partir duquel les comptes sont renvoyés (optionnel)
    :param ldapQuery: un filtre ldap pour affiner la rechercher (optionnel)
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises DomainException: Exception levée si le domaine n'est pas un domaine valide
    """
    if not utils.checkIsDomain(domain):
        raise DomainException
    data = {"limit": limit, "offset": offset, "ldap_query": ldapQuery}
    response = callMethod(domain, "GetAllCos", data)
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
    if len(response["coses"]) == 1:
        return []
    else:
        coses = response["coses"]["cose"]
        retCoses = []
        if isinstance(coses, list):
            for cos in coses:
                retCoses.append(fillCOS(cos))
        else:
            retCoses.append(fillCOS(coses))
        return retCoses
def setPassword(name, newPassword):
    if not utils.checkIsMailAddress(name):
        raise NameException("L'adresse mail " + name + " n'est pas valide")
    data = {"name": name, "password": newPassword}
    response = callMethod(services.extractDomain(name), "SetPassword", data)
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
def createAccountExt(account, password):
    """
    Méthode permettant de créer un compte via l'API BSS en lui passant en
    paramètre les informations concernant un compte ainsi qu'une empreinte de
    mot de passe.

    :param Account account: l'objet contenant les informations du compte \
            utilisateur
    :param str password: l'empreinte du mot de passe de l'utilisateur

    :raises ServiceException: la requête vers l'API a echoué. L'exception \
            contient le code de l'erreur et le message.
    :raises NameException: le nom du compte n'est pas une adresse mail valide, \
            ou le mot de passe spécifié n'est pas une empreinte.
    :raises DomainException: le domaine de l'adresse mail n'est pas un domaine \
            valide.
    """

    if not re.search(r'^\{\S+\}', password):
        raise NameException(
            "Le format de l'empreinte du mot de passe " +
            "n'est pas correcte ; format attendu : {algo}empreinte")

    data = account.toData()
    data.update({
        'password': '',
        'userPassword': password,
    })
    response = callMethod(services.extractDomain(account.name),
                          'CreateAccount', data)
    if not utils.checkResponseStatus(response['status']):
        raise ServiceException(response['status'], response['message'])
def modifyAccount(account):
    """
    Permet de modifier un compte via l'API

    :param account: un objets compte avec les attributs à changer
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail preSupprimé
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    response = callMethod(services.extractDomain(account.name),
                          "ModifyAccount", account.toData())
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
예제 #6
0
def parseResponse(stringXml):
    """
    Méthode permettant de transformer la reponse XML de l'API BSS en objet Python

    :param stringXml: la chaine XML à transformer en objet python
    :return: l'objet response obtenu
    """
    response = ya.data(et.fromstring(stringXml))
    if "Response" in response:
        return response["Response"]
    elif "response" in response:
        return response["response"]
    else:
        raise ServiceException(3, "Problème format réponse")
def deleteAccount(name):
    """
    Permet de supprimer un compte

    :param name: Nom du compte à supprimer
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail valide
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    if not utils.checkIsMailAddress(name):
        raise NameException("L'adresse mail " + name + " n'est pas valide")
    data = {"name": name}
    response = callMethod(services.extractDomain(name), "DeleteAccount", data)
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
def renameAccount(name, newName):
    """
    Permet de renommer un compte :param name: nom du compte à renommer :param newName: le nouveau nom du compte

    :param name: le nom du compte à renommer
    :param newName: le nouveau nom du compte
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail preSupprimé
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    if not utils.checkIsMailAddress(name) or not utils.checkIsMailAddress(
            newName):
        raise NameException("L'adresse mail n'est pas valide")
    data = {"name": name, "newname": newName}
    response = callMethod(services.extractDomain(name), "RenameAccount", data)
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
예제 #9
0
def getCOS(domain, name):
    """
    Méthode permettant de récupérer les informations d'une classe de service via l'API BSS

    :return: La classe de service récupérée ou None si la classe de service n'existe pas
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail valide
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """

    data = {"name": name}
    response = callMethod(domain, "GetCos", data)
    if utils.checkResponseStatus(response["status"]):
        cos = response["cos"]
        return fillCOS(cos)
    elif re.search(".*no such cos.*", response["message"]):
        return None
    else:
        raise ServiceException(response["status"], response["message"])
def removeAccountAlias(name, aliasToDelete):
    """
    Méthode permettant de supprimer un alias d'un compte

    :param name: le nom du compte
    :param aliasToDelete: l'alias a supprimer
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail preSupprimé
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    if not utils.checkIsMailAddress(name) or not utils.checkIsMailAddress(
            aliasToDelete):
        raise NameException("L'adresse mail " + name + " ou " + aliasToDelete +
                            " n'est pas valide")
    data = {"name": name, "alias": aliasToDelete}
    response = callMethod(services.extractDomain(name), "RemoveAccountAlias",
                          data)
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
def getAccount(name):
    """
    Méthode permettant de récupérer les informations d'un compte via l'API BSS

    :return: Le compte récupéré ou None si le compte n'existe pas
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail valide
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    if not utils.checkIsMailAddress(name):
        raise NameException("L'adresse mail " + name + " n'est pas valide")
    data = {"name": name}
    response = callMethod(services.extractDomain(name), "GetAccount", data)
    if utils.checkResponseStatus(response["status"]):
        account = response["account"]
        return fillAccount(account)
    elif re.search(".*no such account.*", response["message"]):
        return None
    else:
        raise ServiceException(response["status"], response["message"])
def modifyPassword(name, newUserPassword):
    """
    Pour modifier le mot de passe on n'accepte que l'empreinte du mot de passe.
    On commence par faire un SetPassword avec une valeur factice pour forcer la déconnexion des sessions en cours
    On passe ensuite via ModifyAccount l'empreinte du nouveau mot de passe

    :param newUserPassword:
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail preSupprimé
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    if not re.search(r'^\{\S+\}', newUserPassword):
        raise NameException(
            "Le format de l'empreinte du mot de passe n'est pas correcte ; format attendu : {algo}empreinte"
        )
    if not utils.checkIsMailAddress(name):
        raise NameException("L'adresse mail " + name + " n'est pas valide")
    setPassword(name, "valeurPourDeconnecterLesSessions")
    data = {"name": name, "userPassword": newUserPassword}
    response = callMethod(services.extractDomain(name), "ModifyAccount", data)
    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])
def createAccount(name, userPassword, cosId, account=None):
    """
    Méthode permettant de créer un compte via l'API BSS en lui passant en paramètre l'empreinte du mot de passe (SSHA) et le cosId

    :param userPassword: l'empreine du mot de passe de l'utilisateur
    :param cosId: l'identifiant du cosId à appliquer pour le compte
    :param account: objet account contenant les informations à ajouter dans le compte (optionnel)
    :return: Le compte créé
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises NameException: Exception levée si le nom n'est pas une adresse mail valide
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """

    if not re.search(r'^\{\S+\}', userPassword):
        raise NameException(
            "Le format de l'empreinte du mot de passe n'est pas correcte ; format attendu : {algo}empreinte"
        )

    if not utils.checkIsMailAddress(name):
        raise NameException("L'adresse mail " + name + " n'est pas valide")

    data = {
        "name": name,
        "password": "",
        "userPassword": userPassword,
        "zimbraHideInGal": "FALSE",
        "zimbraCOSId": cosId
    }
    response = callMethod(services.extractDomain(name), "CreateAccount", data)

    if not utils.checkResponseStatus(response["status"]):
        raise ServiceException(response["status"], response["message"])

    if account is not None:
        modifyAccount(account)

    return getAccount(name)
def callMethod(domain, methodName, data):
    """
    Méthode permettant d'appeler une méthode de l'API BSS

    :param domain: le nom de domaine
    :param methodName: le nom de la méthode à appeler
    :param data: le body de la requête
    :return: la réponse reçue de l'API BSS
    :raises ServiceException: Exception levée si la requête vers l'API à echoué. L'exception contient le code de l'erreur et le message
    :raises DomainException: Exception levée si le domaine de l'adresse mail n'est pas un domaine valide
    """
    con = BSSConnexion()
    token = None
    try:
        token = con.token(domain)

    except BSSConnexionException as e:
        raise TmpServiceException(3,
                                  "Problème authentification BSS : " + str(e))

    except DomainException as e:
        raise ServiceException(3, "Problème authentification BSS : " + str(e))

    return postBSS(con.url + "/" + methodName + "/" + token, data)