You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.3 KiB
Go

package chat
// chat server funcs which aren't specific to the server struct
import (
"bytes"
"crypto/md5"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"github.com/golang-jwt/jwt"
)
var Address = "127.0.0.1:8000"
var JwtSecret = os.Getenv("secret")
func checkToken(token string) (username string, ok bool) {
type ParsedToken struct {
Username string
jwt.StandardClaims
}
var t ParsedToken
jwt, err := jwt.ParseWithClaims(token, &t, func(t *jwt.Token) (interface{}, error) {
return []byte(JwtSecret), nil
})
if err != nil {
return "", false
}
if userToken, ok := jwt.Claims.(*ParsedToken); ok && jwt.Valid {
return userToken.Username, true
} else {
fmt.Println(err)
return "", false
}
}
func encodeJson(data interface{}) ([]byte, bool) {
if jsonData, err := json.Marshal(data); err != nil {
fmt.Fprintln(os.Stderr, "Could not marshal json data", data)
return nil, false
} else {
return jsonData, true
}
}
func decodeJson(body *io.ReadCloser, w *http.ResponseWriter, message interface{}) {
if err := json.NewDecoder(*body).Decode(&message); err != nil {
fmt.Fprintln(os.Stderr, "Error decoding", err.Error())
if w != nil && (*w) != nil {
(*w).WriteHeader(http.StatusBadRequest)
(*w).Write([]byte(`{"error":"bad message"}`))
}
}
}
func dbHandleError(body *io.ReadCloser, w *http.ResponseWriter) (message string) {
type ErrorMessage struct {
Error string `json:"error"`
}
var error ErrorMessage
decodeJson(body, w, &error)
return error.Error
}
func isAcceptedMIMEType(mime string) bool {
switch mime {
case "image/bmp",
"image/gif",
"image/jpeg",
"image/png",
"audio/mpeg",
"video/webm":
return true
}
return false
}
func uploadFile(fileContents *[]byte, fileName, mimeType string) (res *http.Response, err error) {
type FileObject struct {
FileName string `json:"filename"`
FileType string `json:"filetype"`
Contents []byte `json:"contents"`
Sum [16]byte `json:"sum"`
}
file := FileObject{
fileName, mimeType, *fileContents, md5.Sum(*fileContents),
}
jsonData, ok := encodeJson(&file)
if !ok {
fmt.Fprintln(os.Stderr, "error encoding file data")
return
}
res, err = http.Post(DbAddress+"/file", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Fprintln(os.Stderr, "file POST error:", err)
}
return
}