All checks were successful
continuous-integration/drone/push Build is passing
107 lines
2.1 KiB
Go
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
|
|
}
|