rpaste/modules/paste/fpaste.go

90 lines
2.3 KiB
Go

// support for fpaste
package paste
import (
"bytes"
"fmt"
"io"
"net/http"
"net/url"
"os"
"os/user"
"strings"
)
var (
// paste.centos.org does things in minutes
fpasteTimeMap = map[string]string{
"1hour": "60",
"1day": "1440",
"1week": "10080",
}
rawSlug = "view/raw"
// I'll ask the maintainer of the paste site if I could potentially obtain
// our own API key instead of using the one from the fpaste script
fpasteBaseURL = "https://paste.centos.org"
fpasteAPIKey = "5uZ30dTZE1a5V0WYhNwcMddBRDpk6UzuzMu-APKM38iMHacxdA0n4vCqA34avNyt"
fpasteURL = "https://paste.centos.org/api/create"
fpasteUserAgent = "rpaste/0.2.0"
fpasteTitle = "UNTITLED" // we'll need to make this changeable in the future
fpastePrivate = "1"
fpasteUserName = "user"
)
func Fpaste(life string, lexer string, fileContent string) error {
// Set username as the author
user, err := user.Current()
if err != nil {
fmt.Println("Username could not be found")
} else {
fpasteUserName = user.Name
}
// Stikkit doesn't seem to take in json data. It takes in form data and
// general headers.
form := url.Values{}
form.Add("title", fpasteTitle)
form.Add("expire", fpasteTimeMap[life])
form.Add("private", fpastePrivate)
form.Add("lang", lexer)
form.Add("name", fpasteUserName)
form.Add("text", fileContent)
rurl, err := url.Parse(fpasteURL)
if err != nil {
fmt.Println("Failed to construct URL")
os.Exit(1)
}
// This helps us do a proper urlencode for the API key, instead of just
// stashing it in the var itself.
vs := rurl.Query()
vs.Add("apikey", fpasteAPIKey)
rurl.RawQuery = vs.Encode()
fmt.Println("Uploading...")
resp, err := http.PostForm(rurl.String(), form)
if err != nil {
fmt.Printf("Could not contact fpaste endpoint (%s)\n", fpasteURL)
os.Exit(1)
}
// The response comes back as bytes, so we copy the response buffer into io
// and string it out
buf := &bytes.Buffer{}
io.Copy(buf, resp.Body)
pasteURL := buf.String()
if resp.StatusCode == 200 {
urlish := strings.Replace(pasteURL, "\n", "", -1)
ss := strings.Split(urlish, "/")
slug := ss[len(ss)-1]
fmt.Printf("Paste URL: %s", pasteURL)
fmt.Printf("Raw URL: %s/%s/%s\n", fpasteBaseURL, rawSlug, slug)
} else {
fmt.Printf("%s", http.StatusText(resp.StatusCode))
}
return nil
}