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)
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)
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)
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)
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)
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)
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)
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
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
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