From e7fbb4a76eb22ecbe2b81165fd0c583b1fdefcf6 Mon Sep 17 00:00:00 2001
From: sqozz <sqozz@geekify.de>
Date: Wed, 21 Jan 2015 13:42:08 +0100
Subject: [PATCH] initial commit

---
 settings.py              |  11 +++++
 templates/new_paste.html |   2 +
 urlshort.db              | Bin 0 -> 41984 bytes
 urlshort.py              |  90 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 103 insertions(+)
 create mode 100644 settings.py
 create mode 100644 templates/new_paste.html
 create mode 100644 urlshort.db
 create mode 100644 urlshort.py

diff --git a/settings.py b/settings.py
new file mode 100644
index 0000000..bbf6c2a
--- /dev/null
+++ b/settings.py
@@ -0,0 +1,11 @@
+#!/usr/bin/python3
+DEBUG = True
+DATABASE = "urlshort.db"
+FOOBAR = "PONG"
+DEFAULT_SCHEMA = '''
+CREATE TABLE IF NOT EXISTS pastes (id INT PRIMARY KEY, paste_url TEXT NOT NULL, target TEXT NOT NULL, method_id INT NOT NULL, ip TEXT NOT NULL, timestamp TEXT NOT NULL);
+
+CREATE TABLE IF NOT EXISTS methods (id INT PRIMARY KEY, name TEXT NOT NULL);
+
+CREATE TABLE IF NOT EXISTS access (id INT PRIMARY KEY NOT NULL, paste_id TEXT NOT NULL, ip TEXT NOT NULL, user_agent TEXT NOT NULL);
+'''
diff --git a/templates/new_paste.html b/templates/new_paste.html
new file mode 100644
index 0000000..fa314b7
--- /dev/null
+++ b/templates/new_paste.html
@@ -0,0 +1,2 @@
+<!doctype html>
+<a href="http://localhost:5000/{{paste_id}}">http://localhost:5000/{{paste_id}}</a>
diff --git a/urlshort.db b/urlshort.db
new file mode 100644
index 0000000000000000000000000000000000000000..57aceec7e4f8cf548ecdd5d0c40e01ee9eb3667d
GIT binary patch
literal 41984
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
F{u}o2l&Amz

literal 0
HcmV?d00001

diff --git a/urlshort.py b/urlshort.py
new file mode 100644
index 0000000..bf87ca3
--- /dev/null
+++ b/urlshort.py
@@ -0,0 +1,90 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+from flask import Flask, g, request, render_template, redirect
+import sqlite3
+import random
+import string
+import math
+import time
+from flask_limiter import Limiter
+from contextlib import closing
+from urllib.parse import urlparse
+
+app = Flask(__name__)
+app.config.from_object("settings")
+limiter = Limiter(app, global_limits=["2 per minute", "100 per day"])
+
+@app.before_request
+def before_request():
+	g.db = connect_db()
+
+@app.teardown_request
+def teardown_request(exception):
+	db = getattr(g, "db", None)
+	if db is not None:
+		db.close()
+
+@app.route("/")
+@limiter.exempt
+def root():
+	return "Welcome to root!"
+
+@app.route("/<pasteID>")
+@limiter.exempt
+def paste(pasteID):
+	target = query_db("SELECT target FROM pastes WHERE paste_url = ?", [pasteID], one=True)
+	if target is None:
+		return "Shorturl not found!"
+	else:
+		url = urlparse(target["target"])
+		if url.scheme is "":
+			target = "http://" + url.path
+		else:
+			target = url.scheme + "://" + url.netloc + url.path	
+		return redirect(target, 301)
+
+@app.route("/new")
+@limiter.exempt
+def new_paste():
+	target_url = request.args.get("target", "")
+	paste_id = add_redirect(target_url, 1)
+	return render_template("new_paste.html", paste_id=paste_id)
+
+def add_redirect(target_url, method_id):
+	paste_id = gen_new_id(5)
+	ip = request.remote_addr
+	timestamp = int(time.time())
+	db = getattr(g, "db", None)
+	if db is not None:
+		query = "INSERT INTO pastes (paste_url, target, method_id, ip, timestamp) VALUES (:paste_url, :target, :method_id, :ip, :timestamp);"
+		args = {"paste_url" : paste_id, "target" : target_url, "method_id" : "1", "ip" : ip, "timestamp" : timestamp}
+		db.cursor().execute(query, args)
+		db.commit()
+		db.close()
+	return paste_id
+
+def gen_new_id(length):
+	while True:	
+		new_id = "".join([random.choice(string.ascii_letters + string.digits) for n in range(length)])
+		if query_db("SELECT * FROM pastes WHERE paste_url = ?", [new_id], one=True) is None:
+			break	
+	return new_id
+
+def query_db(query, args=(), one=False):
+	with closing(connect_db()) as db:
+		db.row_factory = sqlite3.Row
+		cur = db.cursor().execute(query, args)
+		rv = cur.fetchall()
+		cur.close()
+		return (rv[0] if rv else None) if one else rv
+
+def init_db():
+	with closing(connect_db()) as db:
+		db.cursor().executescript(app.config["DEFAULT_SCHEMA"])
+		db.commit()
+
+def connect_db():
+	return sqlite3.connect(app.config["DATABASE"])
+
+if __name__ == "__main__":
+	app.run(debug=app.config["DEBUG"])