diff --git a/go.sum b/go.sum index 43134d3..b12d580 100644 --- a/go.sum +++ b/go.sum @@ -4,10 +4,6 @@ gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9 h1:tBkXWNIt8icmkMMnq gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9/go.mod h1:sanhSL8aEsfcq21P+eItYiAnKAre+B67nGJmDfk2cf0= gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 h1:jDVeUhGBTXBibmW5dmtJg2m2+z5z2Rf6J4G0LpjVoJ0= gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735/go.mod h1:gdd+vOT6up9STkEbxa2qESLIMZFjCmRbkcheFQCVgZU= -gitea.pena/SQuiz/common v0.0.0-20250903090208-2fbd1b556911 h1:1VzRWsYYzVoMdNewLAopZajB7OukQrs3oKoONYTe2aA= -gitea.pena/SQuiz/common v0.0.0-20250903090208-2fbd1b556911/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= -gitea.pena/SQuiz/common v0.0.0-20251016081003-2570379dd06f h1:lEWOJbcMQFijve7gSZIF/nf4OfqgnE5AZQntRMZAoX8= -gitea.pena/SQuiz/common v0.0.0-20251016081003-2570379dd06f/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= gitea.pena/SQuiz/common v0.0.0-20251121152952-1bc243df2c0b h1:k78BlCMIefxmvQ+mmskTS7QYEtxLYmrCZG0fVnSgJh0= gitea.pena/SQuiz/common v0.0.0-20251121152952-1bc243df2c0b/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= diff --git a/internal/controllers/webhook.go b/internal/controllers/webhook.go index 3bc764b..8065c2a 100644 --- a/internal/controllers/webhook.go +++ b/internal/controllers/webhook.go @@ -1,7 +1,9 @@ package controllers import ( + "encoding/base64" "fmt" + "gitea.pena/SQuiz/bitrix/internal/service" "github.com/gofiber/fiber/v2" "go.uber.org/zap" @@ -25,7 +27,13 @@ func (c *WebhookController) WebhookCreate(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusBadRequest).SendString("State cannot be empty") } - accountID, err := c.encrypt.DecryptStr([]byte(state)) + decodedState, err := base64.URLEncoding.DecodeString(state) + if err != nil { + c.logger.Error("Error decoding state", zap.Error(err)) + return ctx.Status(fiber.StatusBadRequest).SendString("Invalid state encoding") + } + + accountID, err := c.encrypt.DecryptStr(decodedState) if err != nil { c.logger.Error("Error deserializing Protobuf message", zap.Error(err)) return ctx.Status(fiber.StatusInternalServerError).SendString("Failed to process state parameter") diff --git a/internal/service/user.go b/internal/service/user.go index 71c6c9c..3575df4 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -3,11 +3,13 @@ package service import ( "context" "database/sql" + "encoding/base64" + "net/url" + "gitea.pena/SQuiz/bitrix/internal/models" "gitea.pena/SQuiz/common/model" "gitea.pena/SQuiz/common/pj_errors" "go.uber.org/zap" - "net/url" ) func (s *Service) UpdateListUsers(ctx context.Context, accountID string) error { @@ -62,6 +64,8 @@ func (s *Service) ConnectAccount(ctx context.Context, accountID string, clientBi s.logger.Error("error encrypting account state", zap.Error(err)) return nil, err } + + encodedState := base64.URLEncoding.EncodeToString(state) oauthURL := url.URL{ Scheme: "https", @@ -69,7 +73,7 @@ func (s *Service) ConnectAccount(ctx context.Context, accountID string, clientBi Path: "/oauth/authorize/", RawQuery: url.Values{ "client_id": {s.config.BitrixIntegrationID}, - "state": {string(state)}, + "state": {encodedState}, }.Encode(), } diff --git a/tests/unit/encrypt_test.go b/tests/unit/encrypt_test.go new file mode 100644 index 0000000..0afeb84 --- /dev/null +++ b/tests/unit/encrypt_test.go @@ -0,0 +1,72 @@ +package unit + +import ( + "testing" + + "gitea.pena/PenaSide/common/encrypt" +) + +func Test_Encrypt(t *testing.T) { + encr := &encrypt.Encrypt{ + PubKey: `-----BEGIN PUBLIC KEY----- +MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAn/Q3CKvaxK4YR3N3Iy8O +IOs218oDQIwoHpmRh3a9V+vTEqT+rY8/Dkf5cnbTMuEBFP1NYtS+pcSFF7nLlZdm +Vb6rhtjLCV0awogeWxJsXCHBOHF7Fv4iqDa85qMwl7XiVXxKo/9kH9TkPsgFsuYt +vL4Xc1u6ogoYeVHP7ULDMxgmdLd2N9VIVphxsiGDq304NbgWFVr47/J3x3DU0bw+ +F5QdI7ScU/m4T3S0WlhFaG0hblVbH8x+8U81F9OIyJCX9tGZYb6eR3v1pnWP191L +kpJPSlj9cPPJhl3d6bCyYzGv6k8KQClSs8lsSklPrcXl0ut3raC+oEFp2JkHQL7R +UlwPr2ZOt9DTTs7l70gvr8FswO4/N6+t+6spce2s3lwN41BWGWHYcc9PuOHqUQTw +J3IQQU6NmAyZOjDiZJw7uoNG2rtCqWQRykTULZvtfxh3lMXI/qKM1em+Qo3AZnKC +Y01xhCr4ahPs9Rb4eReigTJSzq+IRSJa1+xPaR4dNm6tAgMBAAE= +-----END PUBLIC KEY-----`, + PrivKey: `-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY-----`, + } + state, err := encr.EncryptStr("6755b1ddd5802e9f13663f56") + if err != nil { + t.Fatal(err) + } + t.Log(string(state)) + state2, err := encr.DecryptStr(state) + if err != nil { + t.Fatal(err) + } + t.Log(string(state2)) +}