Simon Maddocks 26017568f0
All checks were successful
continuous-integration/drone/push Build is passing
Cache api device keys
2021-10-04 00:56:24 +01:00

107 lines
2.1 KiB
Go

package src
import (
"context"
"fmt"
"os"
"encoding/base64"
"encoding/binary"
"github.com/coocood/freecache"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"golang.org/x/crypto/blake2s"
)
const salt = "ENVIRONMENT"
// 30m
const timeout = 1800
// 10m
const cacheSize = 10 * 1024 * 1024
var dbCollection *mongo.Collection
var dbDevices *mongo.Collection
var mongoClient *mongo.Client
var cache *freecache.Cache
func DbConnect() {
mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(getMongoURI()))
if err != nil {
panic(err)
}
if err := mongoClient.Ping(context.TODO(), readpref.Primary()); err != nil {
panic(err)
}
db := mongoClient.Database("Environment")
dbCollection = db.Collection("Main")
dbDevices = db.Collection("Devices")
cache = freecache.NewCache(cacheSize)
}
func GetDeviceKey(api uint64) ([]byte, error) {
cacheKey := Uint64ToBytes(api)
// Check the cache for the user
val, err := cache.Get(cacheKey)
if err == nil {
return val, err
} else {
apiSigned := int64(api)
filter := bson.D{{"ApiID", apiSigned}}
var result bson.M
err := dbDevices.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
return nil, err
}
key, err := DeriveKey(result["Passcode"].(string))
fmt.Printf(base64.StdEncoding.EncodeToString(key))
// We should cache this!
_ = cache.Set(cacheKey, key, timeout)
return key, err
}
}
func Uint64ToBytes(num uint64) []byte {
buf := make([]byte, 8)
binary.BigEndian.PutUint64(buf, num)
return buf
}
func DeriveKey(passcode string) ([]byte, error) {
hash, err := blake2s.New256(nil)
if err != nil {
return nil, err
}
hash.Write([]byte(salt))
hash.Write([]byte(passcode))
fmt.Printf("SALT %s PASS %s\n", salt, passcode)
return hash.Sum(nil), nil
}
func DbDisconnect() {
err := mongoClient.Disconnect(context.TODO())
if err != nil {
panic(err)
}
}
func getMongoURI() string {
dbPath := os.Getenv("GIN_DB_PATH")
if dbPath == "" {
dbPath = "mongodb://192.168.0.159:27017"
}
return dbPath
}