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
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
|
|
}
|