Данная операция необходима для реализации мутации поискового запроса от BMC к LDAP-серверу.
Данная операция реализуется следующим RPC:
service SsoCenter {
rpc MutateLdapInput(MutateLdapInputRequest) returns (MutateLdapInputResponse);
}
message MutateLdapInputRequest {
bytes request = 1;
}
message MutateLdapInputResponse {
bytes mutated_request = 1;
}С полной структурой данных вы можете ознакомиться в прото-файлах.
Дополняем уже имеющийся шаблон реализацией RPC PutSettings.
В реализации RPC распаковываем структуру запроса из формата JSON, мутируем ее, запаковываем обратно в JSON и отправляем результат:
func (r *microservice) MutateLdapInput(ctx context.Context, req *pb.MutateLdapInputRequest) (*pb.MutateLdapInputResponse, error) {
log.Println("got request")
input := SearchRequest{}
if err := json.Unmarshal(req.Request, &input); err != nil {
return nil, fmt.Errorf("unmarshal input data: %s", err)
}
if strings.HasPrefix(input.Filter, "(cn=cn=") {
split := strings.Split(input.Filter, ",")
input.Filter = "(" + strings.TrimPrefix(split[0], "(cn=") + ")"
}
input.Scope = ScopeWholeSubtree
if input.BaseDN == "cn=nerd,dc=bergen,dc=ems" {
input.BaseDN = "dc=bergen,dc=ems"
}
if input.BaseDN == "cn=accounts,ou=groups,dc=bergen,dc=ems" {
input.BaseDN = "cn=accounts,dc=bergen,dc=ems"
}
if strings.TrimSpace(strings.ToLower(input.BaseDN)) == "" {
input.BaseDN = "dc=bergen,dc=ems"
}
if strings.TrimSpace(strings.ToLower(input.BaseDN)) == "administrators" {
input.BaseDN = "dc=bergen,dc=ems"
}
if strings.TrimSpace(strings.ToLower(input.BaseDN)) == "authenticated users" {
input.BaseDN = "dc=bergen,dc=ems"
}
if strings.TrimSpace(strings.ToLower(input.BaseDN)) == "tester" {
input.BaseDN = "dc=bergen,dc=ems"
}
out, err := json.Marshal(input)
if err != nil {
return nil, fmt.Errorf("marshal data: %s", err)
}
return &pb.MutateLdapInputResponse{
MutatedRequest: out,
}, nil
}Пример готового проекта расположен в папке project