package main import ( "crypto/sha1" "database/sql" "encoding/base64" "encoding/json" "encoding/xml" "fmt" "html" "io" "log" "net/http" "github.com/dchest/uniuri" "github.com/ewhal/pygments" _ "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" ) const ( ADDRESS = "http://localhost:9900" LENGTH = 6 PORT = ":9900" USERNAME = "" PASS = "" NAME = "" DATABASE = USERNAME + ":" + PASS + "@/" + NAME + "?charset=utf8" ) type Response struct { ID string `json:"id"` HASH string `json:"hash"` URL string `json:"url"` SIZE int `json:"size"` DELKEY string `json:"delkey"` } func check(err error) { if err != nil { fmt.Println(err) } } func generateName() string { s := uniuri.NewLen(LENGTH) db, err := sql.Open("mysql", DATABASE) check(err) query, err := db.Query("select id from pastebin") for query.Next() { var id string err := query.Scan(&id) if err != nil { } if id == s { generateName() } } db.Close() return s } func hash(paste string) string { hasher := sha1.New() hasher.Write([]byte(paste)) sha := base64.URLEncoding.EncodeToString(hasher.Sum(nil)) return sha } func save(raw string, lang string) []string { db, err := sql.Open("mysql", DATABASE) check(err) sha := hash(raw) query, err := db.Query("select id, hash, data, delkey from pastebin") for query.Next() { var id, hash, paste, delkey string err := query.Scan(&id, &hash, &paste, &delkey) check(err) if hash == sha { url := ADDRESS + "/p/" + id return []string{id, hash, url, paste, delkey} } } id := generateName() var url string if lang == "" { url = ADDRESS + "/p/" + id } else { url = ADDRESS + "/p/" + id + "/" + lang } delKey := uniuri.NewLen(40) paste := html.EscapeString(raw) stmt, err := db.Prepare("INSERT INTO pastebin(id, hash, data, delkey) values(?,?,?,?)") check(err) _, err = stmt.Exec(id, sha, paste, delKey) check(err) db.Close() return []string{id, sha, url, paste, delKey} } func delHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) paste := vars["pasteId"] delkey := vars["delKey"] db, err := sql.Open("mysql", DATABASE) check(err) stmt, err := db.Prepare("delete from pastebin where delkey=? id=?") check(err) res, err := stmt.Exec(html.EscapeString(delkey), html.EscapeString(paste)) check(err) affect, err := res.RowsAffected() check(err) io.WriteString(w, string(affect)) db.Close() } func saveHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) output := vars["output"] switch r.Method { case "POST": paste := r.FormValue("p") lang := r.FormValue("lang") if paste == "" { http.Error(w, "Empty paste", 500) } values := save(paste, lang) b := &Response{ ID: values[0], HASH: values[1], URL: values[2], SIZE: len(values[3]), DELKEY: values[4], } switch output { case "json": w.Header().Set("Content-Type", "application/json") err := json.NewEncoder(w).Encode(b) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } case "xml": x, err := xml.MarshalIndent(b, "", " ") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/xml") w.Write(x) case "html": w.Header().Set("Content-Type", "text/html") io.WriteString(w, "
ID
"+b.ID+"
hash
"+string(b.HASH)+"
URL
"+b.URL+"hash
"+string(b.SIZE)+"