Ejemplo n.º 1
0
def update_preview():

    # Get project name and id
    project_name = request.form.get("project_name")
    project_id = request.form.get("project_id")

    # Get user id from session
    user = session.get("user")
    user_id = str(user["sub"])

    # Ensure dir is created
    temp = db.execute("SELECT dir FROM users WHERE id = ?", user_id)
    if not temp:
        return "Error 400: Bad request"

    dir_id = temp[0]["dir"]

    drive = create_drive()

    # Get project preview
    uploaded_file = request.files.get("file")

    filename = secure_filename(uploaded_file.filename)
    if filename == "":
        return "Error 403: Must provide file name"

    file_ext = os.path.splitext(filename)[1]
    if file_ext in [".html", ".php", ".py"]:
        return "Error 403: Unsupported file format"

    temp_dir = TemporaryDirectory()

    uploaded_file.save(os.path.join(temp_dir.name, filename))

    file_metadata = {"name": project_name, "parents": [dir_id]}

    media = MediaFileUpload(os.path.join(temp_dir.name, filename),
                            resumable=True)

    file = drive.files().create(body=file_metadata,
                                media_body=media,
                                fields="id").execute()

    # Get file search id
    project_preview_id = file.get("id")

    temp_dir.cleanup()

    # Querry for preview
    temp = db.execute("SELECT preview FROM projects WHERE id = ?", project_id)
    if temp[0]["preview"]:
        # Delete from google drive
        drive.files().delete(fileId=temp[0]["preview"]).execute()

    # Update preview in database
    db.execute("UPDATE projects SET preview = ? WHERE id = ?",
               project_preview_id, project_id)

    return redirect(
        url_for(".project", project_name=project_name, project_id=project_id))
Ejemplo n.º 2
0
def clone(file_id):

    # Querry for file search id
    temp = db.execute("SELECT search_id, name FROM files WHERE id = ?",
                      file_id)

    # Validate file id
    if len(temp) != 1:
        return "Error 404: File not found"

    file_search_id = temp[0]["search_id"]

    # Get name of file
    name = temp[0]["name"]

    drive = create_drive()

    request = drive.files().get_media(fileId=file_search_id)

    temp_dir = TemporaryDirectory()

    fh = io.FileIO(temp_dir.name + "/" + name, "wb")
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print(int(status.progress() * 100))

    return send_from_directory(temp_dir.name + "/", name, as_attachment=True)
Ejemplo n.º 3
0
def clone_commit():

    # Get commit id
    commit_id = request.form.get("commit_id")

    project_name = request.form.get("project_name")

    # Validate commit id
    temp = db.execute("SELECT search_id FROM commits WHERE id = ?", commit_id)
    if len(temp) != 1:
        return "Error 404: Commit not found"

    # Querry for files in commit
    files = db.execute("SELECT search_id, name FROM files WHERE commit_id = ?",
                       commit_id)

    drive = create_drive()

    temp_dir = TemporaryDirectory()

    # Download each file into a folder
    for file in files:

        name = file["name"]

        request_drive = drive.files().get_media(fileId=file["search_id"])

        fh = io.FileIO(temp_dir.name + "/" + name, "wb")
        downloader = MediaIoBaseDownload(fh, request_drive)
        done = False
        while done is False:
            status, done = downloader.next_chunk()
            print(int(status.progress() * 100))

    temp_zip = TemporaryDirectory()
    zipf = ZipFile(temp_zip.name + "/" + project_name + ".zip", "w",
                   ZIP_DEFLATED)
    for root, dirs, files in os.walk(temp_dir.name):
        for file in files:
            zipf.write(temp_dir.name + "/" + file)
    zipf.close()
    return send_from_directory(temp_zip.name + "/",
                               project_name + ".zip",
                               as_attachment=True)
Ejemplo n.º 4
0
def branch():

    project_name = request.form.get("project_name")
    project_id = request.form.get("project_id")

    # Error check
    if not project_name or not project_id:
        return "Error 400: Bad request"

    # Get user id from session
    user = session.get("user")
    user_id = str(user["sub"])

    # Querry database for project
    project = db.execute(
        "SELECT user_id, search_id, current_branch FROM projects WHERE id = ?",
        project_id)

    # Ensure user owns this project
    if str(project[0]["user_id"]) != str(user_id):
        return "Error 401: Unauthorized"

    # Generate new branch
    drive = create_drive()

    # Get branch name
    name = request.form.get("name")

    # Determine currect date and time from SQL
    time = db.execute("SELECT now()")
    time = str(time[0]["now"])

    # Get project search id
    project_search_id = project[0]["search_id"]

    branch_id = generate_password_hash(name.lower() + " " + time,
                                       method="pbkdf2:sha256",
                                       salt_length=8)

    # Create branch
    file_metadata = {
        "name": branch_id,
        "parents": [project_search_id],
        "mimeType": "application/vnd.google-apps.folder"
    }

    file = drive.files().create(body=file_metadata, fields="id").execute()

    # Get branch search id
    branch_search_id = file.get("id")

    # Add branch to database
    db.execute(
        "INSERT INTO branches (project_id, id, search_id, name) VALUES (?, ?, ?, ?)",
        project_id, branch_id, branch_search_id, name)

    # Update currect branch to database
    db.execute("UPDATE projects SET current_branch = ? WHERE id = ?",
               branch_id, project_id)

    return redirect(
        url_for(".project", project_name=project_name, project_id=project_id))
Ejemplo n.º 5
0
def homepage():

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        # Get user id from session
        user = session.get("user")
        user_id = str(user["sub"])

        # Ensure dir is created
        temp = db.execute("SELECT dir FROM users WHERE id = ?", user_id)
        if not temp[0]["dir"]:
            # Create new project
            drive = create_drive()

            file_metadata = {
                "name": "OneProjectFile: Project Preview",
                "mimeType": "application/vnd.google-apps.folder"
            }

            file = drive.files().create(body=file_metadata,
                                        fields="id").execute()

            # Get project dir id from Drive
            dir_id = file.get("id")

            # Update dir in database
            db.execute("UPDATE users SET dir = ? WHERE id = ?", dir_id,
                       user_id)
        else:
            dir_id = temp[0]["dir"]

        # Get project name
        name = request.form.get("name")

        # Ensure name is provided
        if not name:
            return "Error 403: Must provide name"

        # Determine currect date and time from SQL
        time = db.execute("SELECT now()")
        time = str(time[0]["now"])

        # Generate project id
        project_id = generate_password_hash(name.lower() + " " + time,
                                            method="pbkdf2:sha256",
                                            salt_length=8)

        # Create new project
        drive = create_drive()

        file_metadata = {
            "name": project_id,
            "parents": ["appDataFolder"],
            "mimeType": "application/vnd.google-apps.folder"
        }

        file = drive.files().create(body=file_metadata, fields="id").execute()

        # Get project search id from Drive
        project_search_id = file.get("id")

        # Add project to database
        db.execute(
            "INSERT INTO projects (user_id, id, search_id, name, created, modified) VALUES (?, ?, ?, ?, ?, ?)",
            user_id, project_id, project_search_id, name, time, time)

        # Save project name for dynamic routes
        project_name = name

        # Generate default branch master id
        name = "Master"
        branch_id = generate_password_hash(name.lower() + " " + time,
                                           method="pbkdf2:sha256",
                                           salt_length=8)

        # Create branch
        file_metadata = {
            "name": branch_id,
            "parents": [project_search_id],
            "mimeType": "application/vnd.google-apps.folder"
        }

        file = drive.files().create(body=file_metadata, fields="id").execute()

        # Get branch search id
        branch_search_id = file.get("id")

        # Add branch to database
        db.execute(
            "INSERT INTO branches (project_id, id, search_id, name) VALUES (?, ?, ?, ?)",
            project_id, branch_id, branch_search_id, name)

        # Update currect branch to database
        db.execute("UPDATE projects SET current_branch = ? WHERE id = ?",
                   branch_id, project_id)

        # Get project preview
        preview = request.files["preview"]
        if preview:

            filename = secure_filename(preview.filename)
            if filename == "":
                return "Error 403: Must provide file name"

            file_ext = os.path.splitext(filename)[1]
            if file_ext not in [".png", ".jpg", ".jpeg"]:
                return "Error 403: Unsupported file format"

            temp_dir = TemporaryDirectory()

            preview.save(os.path.join(temp_dir.name, filename))

            file_metadata = {"name": project_name, "parents": [dir_id]}

            media = MediaFileUpload(os.path.join(temp_dir.name, filename),
                                    resumable=True)

            file = drive.files().create(body=file_metadata,
                                        media_body=media,
                                        fields="id").execute()

            # Get file search id
            project_preview = file.get("id")

            # Add project preview to database
            db.execute("UPDATE projects SET preview = ? WHERE id = ?",
                       project_preview, project_id)

            temp_dir.cleanup()

        # Flash message
        flash(project_name + " sucessfully created!")

        return redirect(
            url_for(".project",
                    project_name=secure_filename(project_name),
                    project_id=project_id))

    # User reached route via GET (as by clicking a link or via redirect)
    else:

        # Get user id from session
        user = session.get("user")
        user_id = str(user["sub"])

        # Query database for projects
        projects = db.execute(
            "SELECT * FROM projects WHERE user_id = ? ORDER BY modified DESC",
            user_id)

        if len(projects) == 0:
            return render_template("index.html")

        return render_template("index.html", projects=projects)
Ejemplo n.º 6
0
def commit():

    project_name = request.form.get("project_name")
    project_id = request.form.get("project_id")
    current_branch_id = request.form.get("current_branch_id")

    # Error check
    if not project_name or not project_id or not current_branch_id:
        return "Error 400: Bad request"

    # Get user id from session
    user = session.get("user")
    user_id = str(user["sub"])

    # Querry database for project
    project = db.execute(
        "SELECT user_id, current_branch FROM projects WHERE id = ?",
        project_id)

    # Ensure user owns this project
    if str(project[0]["user_id"]) != str(user_id):
        return "Error 401: Unauthorized"

    # Querry database for branch details
    branch = db.execute("SELECT * FROM branches WHERE id = ?",
                        current_branch_id)

    # Validate branch id
    if len(branch) != 1:
        return "Error 404: Branch not found"

    # Validate project id
    if branch[0]["project_id"] != project_id:
        return "Error 403: Branch not not belong to project"

    # Get branch search id
    branch_search_id = branch[0]["search_id"]

    # Get current commit id in current branch
    current_commit_id = branch[0]["current_commit"]

    if current_commit_id:
        # Querry current commit details
        temp = db.execute("SELECT * FROM commits WHERE id = ?",
                          current_commit_id)
        current_commit = temp[0]

        # Querry for latest commit
        temp = db.execute(
            "SELECT id FROM commits WHERE branch_id = ? ORDER BY created DESC LIMIT 1",
            branch[0]["id"])
        latest_commit = temp[0]["id"]

        # Commiting to older version
        if current_commit["id"] != latest_commit:

            # Get created of current_commit
            temp = db.execute("SELECT created FROM commits WHERE id = ?",
                              current_commit["id"])
            created = temp[0]["created"]

            # Get commits to be deleted
            commits = db.execute(
                "SELECT id, search_id FROM commits WHERE created > ?", created)

            for commit in commits:
                delete_commit(commit["id"], commit["search_id"])

    # Create commit
    drive = create_drive()

    # Get commit message
    message = request.form.get("message")

    # Determine currect date and time from SQL
    time = db.execute("SELECT now()")
    time = str(time[0]["now"])

    # Generate commit id
    commit_id = generate_password_hash(message.lower() + " " + time,
                                       method="pbkdf2:sha256",
                                       salt_length=8)

    file_metadata = {
        "name": commit_id,
        "parents": [branch_search_id],
        "mimeType": "application/vnd.google-apps.folder"
    }

    file = drive.files().create(body=file_metadata, fields="id").execute()

    # Get commit search id
    commit_search_id = file.get("id")

    # Get description
    description = request.form.get("description")
    if description:
        # Add commit to database
        db.execute(
            "INSERT INTO commits (branch_id, id, search_id, message, description, created) VALUES (?, ?, ?, ?, ?, ?)",
            current_branch_id, commit_id, commit_search_id, message,
            description, time)
    else:
        # Add commit to database
        db.execute(
            "INSERT INTO commits (branch_id, id, search_id, message, created) VALUES (?, ?, ?, ?, ?)",
            current_branch_id, commit_id, commit_search_id, message, time)

    # Upload files
    uploaded_files = request.files.getlist("files")

    for uploaded_file in uploaded_files:

        filename = secure_filename(uploaded_file.filename)
        if filename == "":
            return "Error 403: Must provide file name"

        file_ext = os.path.splitext(filename)[1]
        if file_ext in [".html", ".php", ".py"]:
            return "Error 403: Unsupported file format"

        temp_dir = TemporaryDirectory()

        uploaded_file.save(os.path.join(temp_dir.name, filename))

        # Generate file id
        file_id = generate_password_hash(filename.lower() + " " + time,
                                         method="pbkdf2:sha256",
                                         salt_length=8)

        file_metadata = {"name": file_id, "parents": [commit_search_id]}

        media = MediaFileUpload(os.path.join(temp_dir.name, filename),
                                resumable=True)

        file = drive.files().create(body=file_metadata,
                                    media_body=media,
                                    fields="id").execute()

        # Get file search id
        file_search_id = file.get("id")

        # Update file to database
        db.execute(
            "INSERT INTO files (commit_id, id, search_id, name) VALUES (?, ?, ?, ?)",
            commit_id, file_id, file_search_id, filename)

        temp_dir.cleanup()

    # Handel unmodified files
    if current_commit_id:
        # Query for files in current commit
        files = db.execute(
            "SELECT name, id, search_id FROM files WHERE commit_id = ?",
            current_commit_id)

        files_modified = 0
        files_added = 0
        copy = files
        for uploaded_file in uploaded_files:
            modified = False
            filename = secure_filename(uploaded_file.filename)

            for file in files:
                search = file["name"].split(".")
                if re.search("^" + search[0] + "(_[0-9]+)?\." + search[1],
                             filename):
                    # Files modified
                    files_modified = files_modified + 1
                    modified = True

                    # Remove file from  copy
                    copy.remove(file)
                    break

            if not modified:
                # Files added
                files_added = files_added + 1

        # Copy unmodified files into new commit
        for file in copy:

            # Generate new file id
            file_id = generate_password_hash(file["name"].lower() + " " + time,
                                             method="pbkdf2:sha256",
                                             salt_length=8)

            db.execute(
                "INSERT INTO files (commit_id, id, search_id, name) VALUES (?, ?, ?, ?)",
                commit_id, file_id, file["search_id"], file["name"])

        if files_modified:
            num = files_modified
            if num > 1:
                modified = str(num) + " files modified."
            else:
                modified = str(num) + " file modified."
        if files_added:
            num = files_added
            if num > 1:
                added = str(num) + " files added."
            else:
                added = str(num) + " file added."
        if files_modified and files_added:
            flash(modified + " " + added)
        elif files_modified:
            flash(modified)
        elif files_added:
            flash(added)

    # Update currect commit to database
    db.execute("UPDATE branches SET current_commit = ? WHERE id = ?",
               commit_id, current_branch_id)

    # Update last modified to database
    db.execute("UPDATE projects SET modified = ? WHERE id = ?", time,
               project_id)

    return redirect(
        url_for(".project", project_name=project_name, project_id=project_id))