Beispiel #1
0
def update_project(ccd, sid, pld):
    """
    update existing project

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_UPDATEPROJ packet
                must contain the following data:

                    pid     id of the project to update
                    name    new name to set
                    descrption  new description text to set

    """

    user, _ = ccd.get_user_and_workgroup(sid)

    # parse request
    try:
        pid = int(pld["pid"])
        name = pld["name"]
        if len(name) > MAX_LEN_NAME:
            raise InputError("Name exceeds limit of %d characters" %
                             MAX_LEN_NAME)

        try:
            description = pld["description"]
        except KeyError:
            description = ""
        if len(description) > MAX_LEN_DESC:
            raise InputError("Desc exceeds limit of %d characters" %
                             MAX_LEN_DESC)

    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # get project
    proj = Project.by_pid(ccd._db.conn, pid)

    # authorise
    if (not user.uid == ccd.superadmin.uid) and \
            (not proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_WRITE)):
        raise PermissionDenied(user.name)

    # update
    proj.name = name
    if description:
        proj.description = description

    proj.flush(ccd._db.conn)
Beispiel #2
0
def delete_project(ccd, sid, pld):
    """
    delete existing project

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_DELPROJ packet
                must contain the following data:

                    pid     id of the project to delete

    """

    # get user and workgroup
    user, wg = ccd.get_user_and_workgroup(sid)

    # authorise
    if (not user.uid == ccd.superadmin.uid) and \
            (not wg.is_allowed(ccd._db.conn, user, ccddb.ACCESS_DEL)):
        raise PermissionDenied(user.name)

    # parse packet
    try:
        pid = int(pld["pid"])
    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # delete project
    proj = Project.by_pid(ccd._db.conn, pid)
    ses = ccd.get_session(sid)
    ses.unsetproject(ccd._db.conn, proj)
    proj.delete(ccd._db.conn)
Beispiel #3
0
def show_project_members(ccd, sid, pld):
    """
    return a project's member

    input:
        ccd     ccd instance
        sid     session id
        pld     payload of the packet
                must contain the following data:

                    pid     id of the project to get users from

    output:
        returns a project's members

    """
    # get user we work with
    user, _ = ccd.get_user_and_workgroup(sid)

    # parse payload
    try:
        pid = int(pld["pid"])
    except (KeyError, ValueError, TypeError):
        raise InputError("Invalid payload format!")

    if pid < 0:
        raise InputError("Invalid pid requested:%s", pid)

    # project we want to add to
    proj = Project.by_pid(ccd._db.conn, pid)

    if not proj:
        raise NotFoundError("No such project")

    # authorise
    if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
            or proj.owner == user.uid
            or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_READ)):
        raise PermissionDenied(user.name)

    return proj.get_members(ccd._db.conn)
Beispiel #4
0
def remove_plugin(ccd, sid, pld):
    """
    remove a user to a project

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_DELPROJPLG packet
                must contain the following data:

                    pid     id of the project to del a plugin from
                    plg_id  id of the plugin to del from project


    """
    # get user and workgroup
    user, wg = ccd.get_user_and_workgroup(sid)

    # parse payload
    try:
        pid = int(pld["pid"])
        plg_id = int(pld["plg_id"])
    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # project we work with
    proj = Project.by_pid(ccd._db.conn, pid)

    if not proj:
        raise NotFoundError("No such project")

    # authorise
    if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
            or proj.owner == user.uid
            or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_DEL)):
        raise PermissionDenied(user.name)

    # check whether plugin is in user's workgroup
    if not wg.has_plugin(ccd._db.conn, plg_id):
        raise NotFoundError("Plugin is not part of workgroup!")

    # remove member
    proj.remove_plugin(ccd._db.conn, plg_id)
Beispiel #5
0
def select(ccd, sid, pld):
    """
    Associate a project with a session. Without doing this, a user is not able
    to execute any plugins.

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_SETPROJ packet
                must contain the following data:

                    pid     id of the project to select


    """
    # get user and workgroup
    user, _ = ccd.get_user_and_workgroup(sid)

    # parse payload
    try:
        pid = int(pld["pid"])
    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # project we want to add to
    proj = Project.by_pid(ccd._db.conn, pid)

    if not proj:
        raise NotFoundError("No such project")

    # authorise
    if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
            or proj.owner == user.uid
            or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_READ)):
        raise PermissionDenied(user.name)

    # select
    ses = ccd.get_session(sid)
    ses.setproject(ccd._db.conn, proj)
Beispiel #6
0
def remove_member(ccd, sid, pld):
    """
    remove a user to a project

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_DELPROJMEMBER packet
                must contain the following data:

                    pid     id of the project to del user from
                    uid     id of the user to delete

    """

    # get user and workgroup
    user, _ = ccd.get_user_and_workgroup(sid)

    # parse payload
    try:
        pid = int(pld["pid"])
        uid = int(pld["uid"])
    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # project we want to add to
    proj = Project.by_pid(ccd._db.conn, pid)

    if not proj:
        raise NotFoundError("No such project")

    # authorise
    if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
            or proj.owner == user.uid
            or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_DEL)):
        raise PermissionDenied(user.name)

    # remove member
    proj.remove_member(ccd._db.conn, uid)
Beispiel #7
0
def add_member(ccd, sid, pld):
    """
    add a user to a project

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_ADDPROJMEMBER packet
                must contain the following data:

                    pid     id of the project to add user to
                    uid     id of the user to add
                    role_id id of the role the new user has

    """

    # get user and workgroup
    user, _ = ccd.get_user_and_workgroup(sid)

    # parse payload
    try:
        pid = int(pld["pid"])
        uid = int(pld["uid"])
        role_id = int(pld["role_id"])
    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # project we want to add to
    proj = Project.by_pid(ccd._db.conn, pid)

    # authorise
    if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
            or proj.owner == user.uid
            or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_ADD)):
        raise PermissionDenied(user.name)

    # add member
    proj.add_member(ccd._db.conn, uid, role_id)
Beispiel #8
0
def show_projects(ccd, sid, pld):
    """
    return projects the user is in

    input:
        ccd     ccd instance
        sid     session id
        pld     payload of the OP_SHOWPROJ packet. if no payload provided, all
                projects the user is member of are shown.

                might contain the following data:

                    pid     id of the project to show. this field might have
                            different states:


                                pid=<int>   show project with corresponding id
                                pid=        show all projects. only allowed for
                                            superadmin

    output:
        returns selected projects

    """
    response = []

    # get user we work with
    user, _ = ccd.get_user_and_workgroup(sid)

    # get users projects
    if not pld:
        projs = user.get_projects(ccd._db.conn)

        logger.debug("projs:%s", projs)
        for proj in projs:
            response.append(
                dict(pid=proj[0],
                     name=proj[1],
                     ptype=proj[2],
                     created=proj[3].isoformat(),
                     creator=proj[4],
                     owner=proj[5]))

    # get specific project
    else:
        try:
            pid = pld["pid"]
        except KeyError:
            raise InputError("Invalid payload format!")

        logger.debug("pid=:%s", pid)

        # return project the user is interested in
        if pid:
            try:
                pid = int(pid)
            except ValueError:
                raise InputError("Invalid pid!")

            # project we want to add to
            proj = Project.by_pid(ccd._db.conn, pid)

            if not proj:
                raise NotFoundError("No such project")

            # authorise
            if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
                    or proj.owner == user.uid
                    or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_READ)):
                raise PermissionDenied(user.name)

            response = [
                dict(pid=proj.pid,
                     name=proj.name,
                     ptype=proj.ptype,
                     created=proj.created.isoformat(),
                     creator=proj.creator,
                     owner=proj.owner)
            ]

        # if pid field empty, return all existing projects
        else:
            # authorise
            if not (user.uid == ccd.superadmin.uid):
                raise PermissionDenied(user.name)

            all_projects = ccddb.get_all_projects(ccd._db.conn)
            response = [
                dict(pid=p[0],
                     name=p[1],
                     ptype=p[2],
                     created=p[3].isoformat(),
                     creator=p[4],
                     owner=p[5]) for p in all_projects
            ]

    return response
Beispiel #9
0
def new_project(ccd, sid, pld):
    """
    create new project

    input:
        ccd     ccd instance
        sid     session id of running session
        pld     payload of the OP_NEWPROJ packet
                might contain the following data:

                    name        name of the plugin
                    tid         type id
                    descrption  plugin description

    output:
        returns project id

    """
    logger.debug("creating new project..")

    # get user and workgroup
    user, wg = ccd.get_user_and_workgroup(sid)

    # is user superadmin
    if (not user.uid == ccd.superadmin.uid
            and not wg.is_allowed(ccd._db.conn, user, ccddb.ACCESS_ADD)):
        raise PermissionDenied(user.name)
    elif not wg:
        raise Exception("Failed to create project since user is not "
                        "assigned to any workgroup")

    # parse request
    try:
        name = pld["name"]
        if len(name) > MAX_LEN_NAME:
            raise InputError("Name exceeds limit of %d characters" %
                             MAX_LEN_NAME)

        tid = int(pld["tid"])

        try:
            description = pld["description"]
        except KeyError:
            description = ""
        if len(description) > MAX_LEN_DESC:
            raise InputError("Desc exceeds limit of %d characters" %
                             MAX_LEN_DESC)

    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # set creator
    creator = user

    # set owner
    # at the moment it's just some admin user
    admins = wg.getmember_byrole(ccd._db.conn, ccddb.ROLE_ADMIN)
    if not admins:
        raise NotFoundError("No admin user in wgroup find!")
    owner = admins[0]

    # create project
    proj = Project.create_fromname(ccd._db.conn, name, creator, owner, tid,
                                   description)

    return proj.pid
Beispiel #10
0
def data(ccd, sid, pld, mth):
    """
    View information from project database

    Input:
        sid     Session ID
        pld     Payload

    output:
        result  path where file is written to
    """

    logger.info('op report: %s', pld)

    result = None

    # get user and workgroup
    user, _ = ccd.get_user_and_workgroup(sid)

    # mandatory payload
    try:
        # project ID
        pid = int(pld["pid"])

        # which columns we want to view OR special keywords [columns, fields]
        columns = pld["columns"]

        # which tables we want to view
        tables = pld["tables"]

    except (KeyError, ValueError):
        raise InputError("Invalid payload format!")

    # optional payload. this only mandatory if report is generated to file
    # (indicated via MTH_SAVE)
    #print 'pld ' + repr(pld)
    try:
        filename = pld["filename"]
        fmt = pld["fmt"]

    except KeyError:
        if mth == ccdlib.MTH_SAVE:
            raise InputError("Invalid payload format. Missing filename or "
                             "file format!")

    # language is optional
    try:
        language = pld["lang"]
    except KeyError:
        language = "de"

    # group is optional
    try:
        group_by_list = pld["group_by"].split(',')
        logger.info('group_by_list: %s', group_by_list)
        group_by = []

        if group_by_list:
            for gp_item in group_by_list:
                if not gp_item:
                    continue
                logger.info("gp_item:%s", gp_item)
                item = tuple(gp_item.split(':'))
                if not len(item) == 2:
                    raise InputError("Invalid payload format!")
                group_by.append(item)

    except KeyError:
        group_by = []

    columns = columns.split(',')
    tables = tables.split(',')
    logger.info('view columns: \'%s\', tables: \'%s\'', columns, tables)

    # project we want to dump
    proj = Project.by_pid(ccd._db.conn, pid)

    # authorise
    if not (user.uid == ccd.superadmin.uid or proj.creator == user.uid
            or proj.owner == user.uid
            or proj.is_allowed(ccd._db.conn, user, ccddb.ACCESS_READ)):
        raise PermissionDenied(user.name)

    # store report
    if mth == ccdlib.MTH_SAVE:

        # get absolute file name
        path_dest = get_write_location(ccd, sid, filename)

        # check if we have anything to write
        tables_dict = projectdb.get_tables_dict(ccd._db.conn,
                                                proj.pid,
                                                tbl_names=tables,
                                                group_by=group_by,
                                                lang=language)

        if not tables_dict:
            return

        if fmt == CSV:
            proj.data_save_csv(ccd._db.conn, columns, tables, path_dest)

        elif fmt == PDF:
            pdf.gen_pdf(
                ccd._db.conn, proj.pid, path_dest,
                os.path.join(ccd.config.shared_directory, 'stdtmpl.tar.gz'),
                tables_dict, language)

        #elif fmt == ODT:
        #    cOdf.gen_odf(ccd._db.conn, proj.pid, tables_dict, path_dest,
        #                 language)

        else:
            raise InputError("Invalid file format:%s!", fmt)

        os.chown(path_dest, ccd.config.runAsUid, ccd.config.runAsGid)
        result = filename

    # just return report
    elif mth == ccdlib.MTH_VIEW:
        result = proj.data_view(ccd._db.conn, columns, tables)

    elif mth == ccdlib.MTH_INFO:
        result = proj.data_show(ccd._db.conn, columns, tables)

    return result