feat: add uuid
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
package economy
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha1"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// TestBazaarRSAVerify امضای معتبر را میپذیرد و امضای/دیتای دستکاریشده را رد میکند.
|
||||
func TestBazaarRSAVerify(t *testing.T) {
|
||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
der, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
pubB64 := base64.StdEncoding.EncodeToString(der) // مثلِ خروجیِ کنسولِ کافهبازار
|
||||
|
||||
v, err := NewBazaarRSAVerifier(pubB64)
|
||||
if err != nil {
|
||||
t.Fatalf("new verifier: %v", err)
|
||||
}
|
||||
|
||||
data := `{"orderId":"1","productId":"coin_small","purchaseToken":"tok123","purchaseState":0}`
|
||||
h := sha1.Sum([]byte(data))
|
||||
sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA1, h[:])
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
sigB64 := base64.StdEncoding.EncodeToString(sig)
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
ok, err := v.Verify(ctx, IAPProof{PurchaseData: data, Signature: sigB64})
|
||||
if err != nil || !ok {
|
||||
t.Fatalf("valid signature rejected: ok=%v err=%v", ok, err)
|
||||
}
|
||||
|
||||
// دیتای دستکاریشده ⇒ رد
|
||||
ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data + " ", Signature: sigB64})
|
||||
if ok {
|
||||
t.Fatal("tampered data accepted")
|
||||
}
|
||||
|
||||
// امضای دستکاریشده ⇒ رد
|
||||
bad := base64.StdEncoding.EncodeToString([]byte("not-a-real-signature"))
|
||||
ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data, Signature: bad})
|
||||
if ok {
|
||||
t.Fatal("bad signature accepted")
|
||||
}
|
||||
}
|
||||
|
||||
// TestStoreRouter مسیردهی بر اساس store و fallback را بررسی میکند.
|
||||
func TestStoreRouter(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
// بدونِ پیکربندی و بدونِ fallback ⇒ خطا.
|
||||
r := StoreRouter{}
|
||||
if ok, err := r.Verify(ctx, IAPProof{Store: "myket", Token: "x"}); ok || err == nil {
|
||||
t.Fatal("unconfigured store should error")
|
||||
}
|
||||
|
||||
// با devFallback ⇒ توکنِ غیرخالی معتبر است.
|
||||
r = StoreRouter{DevFallback: true}
|
||||
if ok, err := r.Verify(ctx, IAPProof{Store: "bazaar", Token: "x"}); err != nil || !ok {
|
||||
t.Fatalf("dev fallback failed: ok=%v err=%v", ok, err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user