def share_list_project_member(request, response): "List sharing for a given project and member" project = get_project(request.user, request.user, request.kwargs['project']) member = request.user.find_member(request.kwargs['member']) data = request.user.get_sharing(project, member) return _respond_json(response, data)
def share_add(request, response): "Add a member to the sharing list for a project" project = get_project(request.user, request.user, request.kwargs['project']) member = request.user.find_member(request.kwargs['member']) options = simplejson.loads(request.body) request.user.add_sharing(project, member, options) return _respond_blank(response)
def listfiles(request, response): user = request.user path = request.kwargs['path'] result = [] if not path: projects = request.user.get_all_projects(True) for project in projects: if project.owner == user: result.append({ 'name':project.short_name }) else: result.append({ 'name':project.owner.username + "+" + project.short_name }) else: try: owner, project, path = _split_path(request) except BadRequest: project = path path = '' if project: project = get_project(user, owner, project) files = project.list_files(path) for item in files: reply = { 'name':item.short_name } _populate_stats(item, reply) result.append(reply) return _respond_json(response, result)
def listfiles(request, response): user = request.user path = request.kwargs['path'] result = [] if not path: projects = request.user.get_all_projects(True) for project in projects: if project.owner == user: result.append({'name': project.short_name}) else: result.append({ 'name': project.owner.username + "+" + project.short_name }) else: try: owner, project, path = _split_path(request) except BadRequest: project = path path = '' if project: project = get_project(user, owner, project) files = project.list_files(path) for item in files: reply = {'name': item.short_name} _populate_stats(item, reply) result.append(reply) return _respond_json(response, result)
def share_remove(request, response): "Remove project sharing from a given member" project = get_project(request.user, request.user, request.kwargs['project']) member = request.user.find_member(request.kwargs['member']) data = request.user.remove_sharing(project, member) return _respond_json(response, data)
def retrieve_deploy_setup(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) data = simplejson.loads(request.body) response.content_type="application/json" pdo = deploy.ProjectDeploymentOptions.get(project) if not pdo: response.body = simplejson.dumps(None) return response() kc = deploy.DeploymentKeyChain(user, data['kcpass']) cred = kc.get_credentials_for_project(project) result = dict(remoteHost=pdo.remote_host, remoteDirectory=pdo.remote_directory, connType=pdo.type, authType=cred['type'], username=cred['username']) result['password'] = cred['password'] \ if cred['type'] == "password" else "" response.body = simplejson.dumps(result) return response()
def export_project(request, response): user = request.user project_name = request.kwargs['project_name'] project_name, extension = os.path.splitext(project_name) project = get_project(user, user, project_name) if extension == ".zip": func = project.export_zipfile response.content_type = "application/zip" else: response.content_type = "application/x-tar-gz" func = project.export_tarball output = func() def filegen(): data = output.read(8192) while data: yield data data = output.read(8192) raise StopIteration response.app_iter = filegen() return response()
def _split(self, name): """Cut a name into the username, projectname, path parts and lookup a project under the given user""" (user_name, project_name, path) = name.split("/", 2) user = User.find_user(user_name) project = get_project(user, user, project_name) return (project, path)
def deletefile(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project) project.delete(path) return response()
def history_at(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project) if user != owner: raise BadRequest("History is only available to project owners") history = project.get_history(path) return _respond_json(response, history)
def putfile(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project, create=True) if path: project.save_file(path, request.body) return response()
def rename_project(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) project.rename(request.body) response.body = "" response.content_type = "text/plain" return response()
def preview_file(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project) file_obj = project.get_file_object(path) response.body = str(file_obj.data) response.content_type = file_obj.mimetype return response()
def file_list_all(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) metadata = project.metadata files = metadata.get_file_list() metadata.close() return _respond_json(response, files)
def filestats(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project) file_obj = project.get_file_object(path) result = {} _populate_stats(file_obj, result) return _respond_json(response, result)
def getfile(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project) mode = request.GET.get('mode', 'rw') contents = project.get_file(path, mode) response.body = contents return response()
def save(self, name, contents, handle): """Load a temporary file by extracting the project from the filename and calling project.save_temp_file""" try: (user, owner, project_name, path) = self._split_path(name, handle) project = get_project(user, owner, project_name) log.debug("saving to temp file for: %s/%s" % (project.name, path)) project.save_temp_file(path, contents) except: log.exception("Error in Persister.save() for name=%s", name)
def install_file_template(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, user, project, create=True) options = simplejson.loads(request.body) project.install_template_file(path, options) response.body = "" response.content_type = "text/plain" return response()
def vcs_remoteauth(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) metadata = project.metadata value = metadata.get(vcs.AUTH_PROPERTY, "") response.content_type = "text/plain" response.body = value.encode("utf8") return response()
def _perform_import(user, project_name, filename, fileobj): project = get_project(user, user, project_name, clean=True) if filename.endswith(".tgz") or filename.endswith(".tar.gz"): func = project.import_tarball elif filename.endswith(".zip"): func = project.import_zipfile else: raise BadRequest( "Import only supports .tar.gz, .tgz and .zip at this time.") func(filename, fileobj) return
def rescan_project(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) job_body = dict(user=user.username, project=project_name) jobid = queue.enqueue("vcs", job_body, execute="bespin.filesystem:rescan_project", error_handler="bespin.vcs:vcs_error", use_db=True) response.content_type = "application/json" response.body = simplejson.dumps(dict(jobid=jobid, taskname="Rescan %s" % project_name)) return response()
def file_search(request, response): user = request.user query = request.GET.get("q", "") limit = request.GET.get("limit", 20) try: limit = int(limit) except ValueError: limit = 20 project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) result = project.search_files(query, limit) return _respond_json(response, result)
def putfile(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project, create=True) if path.endswith('/'): if request.body != None and request.body != '': raise BadRequest("Path ended in '/' indicating directory, but request contains ") project.create_directory(path) elif path: project.save_file(path, request.body) return response()
def preview_file(request, response): user = request.user owner, project, path = _split_path(request) if owner != user: raise BadRequest("Preview of shared projects is not currently supported for security reasons.") project = get_project(user, owner, project) file_obj = project.get_file_object(path) response.body = str(file_obj.data) response.content_type = file_obj.mimetype return response()
def getfile(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project) mode = request.GET.get('mode', 'rw') revision = request.GET.get('revision', None) contents = project.get_file(path, mode, revision=revision) response.body = contents response.content_type = "zombie/brains" return response()
def file_search(request, response): user = request.user query = request.GET.get("q", "") include = request.GET.get("i", "") limit = request.GET.get("limit", 20) try: limit = int(limit) except ValueError: limit = 20 project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) result = project.search_files(query, limit, include) return _respond_json(response, result)
def rescan_project(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) job_body = dict(user=user.username, project=project_name) jobid = queue.enqueue("vcs", job_body, execute="bespin.filesystem:rescan_project", error_handler="bespin.vcs:vcs_error", use_db=True) response.content_type = "application/json" response.body = simplejson.dumps( dict(jobid=jobid, taskname="Rescan %s" % project_name)) return response()
def putfile(request, response): user = request.user owner, project, path = _split_path(request) project = get_project(user, owner, project, create=True) if path.endswith('/'): if request.body != None and request.body != '': raise BadRequest( "Path ended in '/' indicating directory, but request contains " ) project.create_directory(path) elif path: project.save_file(path, request.body) return response()
def install_template(request, response): user = request.user project_name = request.kwargs['project_name'] data = simplejson.loads(request.body) try: template_name = data['templateName'] except KeyError: raise BadRequest("templateName not provided in request") project = get_project(user, user, project_name, create=True) project.install_template(template_name, data) response.content_type = "text/plain" response.body = "" return response()
def new_user(request, response): try: username = request.kwargs['username'] email = request.POST['email'] password = request.POST['password'] except KeyError: raise BadRequest("username, email and password are required.") user = User.create_user(username, password, email) settings_project = get_project(user, user, "BespinSettings", create=True) settings_project.install_template('usertemplate') response.content_type = "application/json" response.body = "{}" request.environ['paste.auth_tkt.set_user'](username) return response()
def check_access(self, name): from bespin.database import User, get_project (user_name, project_name, path) = name.split("/", 2) user = User.find_user(user_name) parts = project_name.partition('+') if parts[1] == '': owner = user else: owner = User.find_user(parts[0]) project_name = parts[2] project = get_project(user, owner, project_name) return (project, path)
def deploy_setup(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) data = simplejson.loads(request.body) deploy_options = dict(remote_host = data.get("remoteHost"), remote_directory = data.get("remoteDirectory"), type = data.get("connType")) try: pdo = deploy.ProjectDeploymentOptions(project, **deploy_options) pdo.save() except deploy.InvalidConfiguration, e: raise BadRequest(e.message)
def load(self, name, handle): """Load a temporary file by extracting the project from the filename and calling project.get_temp_file""" try: (user, owner, project_name, path) = self._split_path(name, handle) project = get_project(user, owner, project_name) log.debug("loading temp file for: %s/%s" % (project.name, path)) bytes = project.get_temp_file(path) # mobwrite gets things into unicode by doing bytes.encode("utf-8") # which uses the 'strict' error handling technique, which raises # on failure. Since we're not tracking content-type on the server # we could have anything at this point so, and we don't want to die # so we fudge the issue by ignoring things that are not utf-8 return bytes.decode("utf-8", "ignore") except: log.exception("Error in Persister.load() for name=%s", name) return ""
def run_deploy(request, response): user = request.user project_name = request.kwargs['project_name'] data = simplejson.loads(request.body) kcpass = data['kcpass'] options = dict() if "dryRun" in data: options['dry_run'] = data['dryRun'] project = get_project(user, user, project_name) response.content_type = "application/json" try: jobid = deploy.run_deploy(user, project, kcpass, options) except deploy.NotConfigured, e: response.body = simplejson.dumps(dict(error=str(e), notConfigured=True)) response.status = "400 Bad Request" return response()
def vcs_command(request, response): user = request.user project_name = request.kwargs['project_name'] request_info = simplejson.loads(request.body) args = request_info['command'] kcpass = request_info.get('kcpass') try: taskname = "vcs %s command" % (args[0]) except IndexError: taskname = "vcs command" # special support for clone/checkout if vcs.is_new_project_command(args): raise BadRequest("Use /vcs/clone/ to create a new project") else: project = get_project(user, user, project_name) jobid = vcs.run_command(user, project, args, kcpass) response.content_type = "application/json" response.body = simplejson.dumps(dict(jobid=jobid, taskname=taskname)) return response()
def vcs_command(request, response): user = request.user project_name = request.kwargs['project_name'] request_info = simplejson.loads(request.body) args = request_info['command'] log.debug("VCS command: %s", args) kcpass = request_info.get('kcpass') try: taskname = "vcs %s command" % (args[0]) except IndexError: taskname = "vcs command" # special support for clone/checkout if vcs.is_new_project_command(args): raise BadRequest("Use /vcs/clone/ to create a new project") else: project = get_project(user, user, project_name) jobid = vcs.run_command(user, project, args, kcpass) response.content_type = "application/json" response.body = simplejson.dumps(dict(jobid=jobid, taskname=taskname)) return response()
def keychain_setauth(request, response): user = request.user project_name = request.kwargs['project_name'] project = get_project(user, user, project_name) try: kcpass = request.POST['kcpass'] atype = request.POST['type'] remote_auth = request.POST['remoteauth'] except KeyError: raise BadRequest("Request must include kcpass, type and remoteauth.") if remote_auth != vcs.AUTH_WRITE and remote_auth != vcs.AUTH_BOTH: raise BadRequest("Remote auth type must be %s or %s" % (vcs.AUTH_WRITE, vcs.AUTH_BOTH)) keychain = vcs.KeyChain(user, kcpass) body = "" if atype == "password": try: username = request.POST['username'] password = request.POST['password'] except KeyError: raise BadRequest("Request must include username and password") keychain.set_credentials_for_project(project, remote_auth, username, password) elif atype == "ssh": # set the project to use the SSH key and return the public key body = keychain.set_ssh_for_project(project, remote_auth)[0] else: raise BadRequest("auth type must be ssh or password") response.content_type = "application/json" response.body = body return response()
def share_list_project(request, response): "List sharing for a given project" project = get_project(request.user, request.user, request.kwargs['project']) data = request.user.get_sharing(project) return _respond_json(response, data)
def share_remove_all(request, response): "Remove all sharing from a project" project = get_project(request.user, request.user, request.kwargs['project']) data = request.user.remove_sharing(project) return _respond_json(response, data)