Skip to content

Latest commit

 

History

History
76 lines (59 loc) · 2.68 KB

File metadata and controls

76 lines (59 loc) · 2.68 KB

Мутация поискового запроса от BMC к LDAP-серверу

Данная операция необходима для реализации мутации поискового запроса от 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