Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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()
Beispiel #7
0
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()
Beispiel #8
0
 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)
Beispiel #9
0
def deletefile(request, response):
    user = request.user

    owner, project, path = _split_path(request)
    project = get_project(user, owner, project)

    project.delete(path)
    return response()
Beispiel #10
0
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)
Beispiel #11
0
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)
Beispiel #12
0
def deletefile(request, response):
    user = request.user

    owner, project, path = _split_path(request)
    project = get_project(user, owner, project)

    project.delete(path)
    return response()
Beispiel #13
0
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()
Beispiel #14
0
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()
Beispiel #15
0
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()
Beispiel #16
0
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()
Beispiel #17
0
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)
Beispiel #18
0
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)
Beispiel #19
0
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()
Beispiel #20
0
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()
Beispiel #21
0
 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)
Beispiel #22
0
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)
Beispiel #23
0
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()
Beispiel #24
0
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)
Beispiel #25
0
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()
Beispiel #26
0
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()
Beispiel #27
0
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()
Beispiel #28
0
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()
Beispiel #29
0
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
Beispiel #30
0
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
Beispiel #31
0
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)
Beispiel #33
0
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()
Beispiel #34
0
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()
Beispiel #35
0
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()
Beispiel #36
0
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)
Beispiel #37
0
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()
Beispiel #38
0
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()
Beispiel #39
0
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()
Beispiel #40
0
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()
Beispiel #41
0
    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)
Beispiel #42
0
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)
Beispiel #43
0
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()
Beispiel #44
0
  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)
Beispiel #45
0
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()
Beispiel #46
0
 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 ""
Beispiel #47
0
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()
Beispiel #49
0
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()
Beispiel #50
0
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()
Beispiel #51
0
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()
Beispiel #52
0
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()
Beispiel #53
0
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)
Beispiel #54
0
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)