mirror of
https://github.com/ManyakRus/starter.git
synced 2025-12-05 00:12:51 +02:00
108 lines
3.1 KiB
Go
108 lines
3.1 KiB
Go
package kafka
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/segmentio/kafka-go/protocol/alteruserscramcredentials"
|
|
)
|
|
|
|
// AlterUserScramCredentialsRequest represents a request sent to a kafka broker to
|
|
// alter user scram credentials.
|
|
type AlterUserScramCredentialsRequest struct {
|
|
// Address of the kafka broker to send the request to.
|
|
Addr net.Addr
|
|
|
|
// List of credentials to delete.
|
|
Deletions []UserScramCredentialsDeletion
|
|
|
|
// List of credentials to upsert.
|
|
Upsertions []UserScramCredentialsUpsertion
|
|
}
|
|
|
|
type ScramMechanism int8
|
|
|
|
const (
|
|
ScramMechanismUnknown ScramMechanism = iota // 0
|
|
ScramMechanismSha256 // 1
|
|
ScramMechanismSha512 // 2
|
|
)
|
|
|
|
type UserScramCredentialsDeletion struct {
|
|
Name string
|
|
Mechanism ScramMechanism
|
|
}
|
|
|
|
type UserScramCredentialsUpsertion struct {
|
|
Name string
|
|
Mechanism ScramMechanism
|
|
Iterations int
|
|
Salt []byte
|
|
SaltedPassword []byte
|
|
}
|
|
|
|
// AlterUserScramCredentialsResponse represents a response from a kafka broker to an alter user
|
|
// credentials request.
|
|
type AlterUserScramCredentialsResponse struct {
|
|
// The amount of time that the broker throttled the request.
|
|
Throttle time.Duration
|
|
|
|
// List of altered user scram credentials.
|
|
Results []AlterUserScramCredentialsResponseUser
|
|
}
|
|
|
|
type AlterUserScramCredentialsResponseUser struct {
|
|
User string
|
|
Error error
|
|
}
|
|
|
|
// AlterUserScramCredentials sends user scram credentials alteration request to a kafka broker and returns
|
|
// the response.
|
|
func (c *Client) AlterUserScramCredentials(ctx context.Context, req *AlterUserScramCredentialsRequest) (*AlterUserScramCredentialsResponse, error) {
|
|
deletions := make([]alteruserscramcredentials.RequestUserScramCredentialsDeletion, len(req.Deletions))
|
|
upsertions := make([]alteruserscramcredentials.RequestUserScramCredentialsUpsertion, len(req.Upsertions))
|
|
|
|
for deletionIdx, deletion := range req.Deletions {
|
|
deletions[deletionIdx] = alteruserscramcredentials.RequestUserScramCredentialsDeletion{
|
|
Name: deletion.Name,
|
|
Mechanism: int8(deletion.Mechanism),
|
|
}
|
|
}
|
|
|
|
for upsertionIdx, upsertion := range req.Upsertions {
|
|
upsertions[upsertionIdx] = alteruserscramcredentials.RequestUserScramCredentialsUpsertion{
|
|
Name: upsertion.Name,
|
|
Mechanism: int8(upsertion.Mechanism),
|
|
Iterations: int32(upsertion.Iterations),
|
|
Salt: upsertion.Salt,
|
|
SaltedPassword: upsertion.SaltedPassword,
|
|
}
|
|
}
|
|
|
|
m, err := c.roundTrip(ctx, req.Addr, &alteruserscramcredentials.Request{
|
|
Deletions: deletions,
|
|
Upsertions: upsertions,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("kafka.(*Client).AlterUserScramCredentials: %w", err)
|
|
}
|
|
|
|
res := m.(*alteruserscramcredentials.Response)
|
|
responseEntries := make([]AlterUserScramCredentialsResponseUser, len(res.Results))
|
|
|
|
for responseIdx, responseResult := range res.Results {
|
|
responseEntries[responseIdx] = AlterUserScramCredentialsResponseUser{
|
|
User: responseResult.User,
|
|
Error: makeError(responseResult.ErrorCode, responseResult.ErrorMessage),
|
|
}
|
|
}
|
|
ret := &AlterUserScramCredentialsResponse{
|
|
Throttle: makeDuration(res.ThrottleTimeMs),
|
|
Results: responseEntries,
|
|
}
|
|
|
|
return ret, nil
|
|
}
|