2022-01-11 06:20:32 +00:00
|
|
|
package databag
|
|
|
|
|
|
|
|
import (
|
2022-01-19 04:46:45 +00:00
|
|
|
"crypto"
|
|
|
|
"crypto/rand"
|
|
|
|
"crypto/sha256"
|
|
|
|
"crypto/rsa"
|
2022-01-11 06:20:32 +00:00
|
|
|
"net/http"
|
2022-01-19 04:46:45 +00:00
|
|
|
"encoding/json"
|
|
|
|
"encoding/base64"
|
2022-01-18 08:40:39 +00:00
|
|
|
"time"
|
2022-01-11 06:20:32 +00:00
|
|
|
)
|
|
|
|
|
2022-01-13 05:23:18 +00:00
|
|
|
func Authorize(w http.ResponseWriter, r *http.Request) {
|
2022-01-18 08:30:27 +00:00
|
|
|
|
2022-01-19 04:46:45 +00:00
|
|
|
account, res := BearerAppToken(r, true);
|
2022-01-18 08:30:27 +00:00
|
|
|
if res != nil {
|
|
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if account.Disabled {
|
|
|
|
w.WriteHeader(http.StatusGone);
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-01-18 08:40:39 +00:00
|
|
|
// extract token from body
|
|
|
|
var token string
|
2022-01-19 04:46:45 +00:00
|
|
|
err := ParseRequest(r, w, &token)
|
|
|
|
if err != nil {
|
2022-01-19 08:03:46 +00:00
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2022-01-18 08:40:39 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// load details to sign data
|
2022-01-19 04:46:45 +00:00
|
|
|
if account.AccountDetail.KeyType != "RSA4096" {
|
|
|
|
w.WriteHeader(http.StatusServiceUnavailable)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
privateKey, res := ParseRsaPrivateKeyFromPemStr(account.AccountDetail.PrivateKey);
|
|
|
|
if res != nil {
|
|
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
2022-01-18 08:40:39 +00:00
|
|
|
|
|
|
|
// generate message
|
|
|
|
auth := Authenticate{
|
|
|
|
Guid: account.Guid,
|
|
|
|
Token: token,
|
|
|
|
Timestamp: time.Now().Unix(),
|
|
|
|
}
|
2022-01-19 04:46:45 +00:00
|
|
|
var data []byte
|
|
|
|
data, err = json.Marshal(auth);
|
|
|
|
if err != nil {
|
|
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
hash := sha256.Sum256(data);
|
|
|
|
var signature []byte
|
|
|
|
signature, err = rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:])
|
|
|
|
if err != nil {
|
|
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
msg := DataMessage{
|
|
|
|
MessageType: "authenticate",
|
|
|
|
Message: base64.StdEncoding.EncodeToString([]byte(data)),
|
|
|
|
KeyType: account.AccountDetail.KeyType,
|
|
|
|
PublicKey: base64.StdEncoding.EncodeToString([]byte(account.AccountDetail.PublicKey)),
|
|
|
|
Signature: base64.StdEncoding.EncodeToString(signature),
|
|
|
|
SignatureType: "PKCS1v15",
|
|
|
|
}
|
2022-01-18 08:40:39 +00:00
|
|
|
|
2022-01-19 04:46:45 +00:00
|
|
|
WriteResponse(w, msg)
|
2022-01-11 06:20:32 +00:00
|
|
|
}
|