bool PluginRootContext::parsePluginConfig()

in plugins/wasm-cpp/extensions/hmac_auth/plugin.cc [173:279]


bool PluginRootContext::parsePluginConfig(const json& configuration,
                                          HmacAuthConfigRule& rule) {
  if ((configuration.find("consumers") != configuration.end()) &&
      (configuration.find("credentials") != configuration.end())) {
    LOG_WARN(
        "The consumers field and the credentials field cannot appear at the "
        "same level");
    return false;
  }
  if (!JsonArrayIterate(
          configuration, "credentials", [&](const json& credential) -> bool {
            auto item = credential.find("key");
            if (item == credential.end()) {
              LOG_WARN("can't find 'key' field in credential.");
              return false;
            }
            auto key = JsonValueAs<std::string>(item.value());
            if (key.second != Wasm::Common::JsonParserResultDetail::OK ||
                !key.first) {
              return false;
            }
            item = credential.find("secret");
            if (item == credential.end()) {
              LOG_WARN("can't find 'secret' field in credential.");
              return false;
            }
            auto secret = JsonValueAs<std::string>(item.value());
            if (secret.second != Wasm::Common::JsonParserResultDetail::OK ||
                !secret.first) {
              return false;
            }
            auto result = rule.credentials.emplace(
                std::make_pair(key.first.value(), secret.first.value()));
            if (!result.second) {
              LOG_WARN(absl::StrCat("duplicate credential key: ",
                                    key.first.value()));
              return false;
            }
            return true;
          })) {
    LOG_WARN("failed to parse configuration for credentials.");
    return false;
  }
  if (!JsonArrayIterate(
          configuration, "consumers", [&](const json& consumer) -> bool {
            auto item = consumer.find("key");
            if (item == consumer.end()) {
              LOG_WARN("can't find 'key' field in consumer.");
              return false;
            }
            auto key = JsonValueAs<std::string>(item.value());
            if (key.second != Wasm::Common::JsonParserResultDetail::OK ||
                !key.first) {
              return false;
            }
            item = consumer.find("secret");
            if (item == consumer.end()) {
              LOG_WARN("can't find 'secret' field in consumer.");
              return false;
            }
            auto secret = JsonValueAs<std::string>(item.value());
            if (secret.second != Wasm::Common::JsonParserResultDetail::OK ||
                !secret.first) {
              return false;
            }
            item = consumer.find("name");
            if (item == consumer.end()) {
              LOG_WARN("can't find 'name' field in consumer.");
              return false;
            }
            auto name = JsonValueAs<std::string>(item.value());
            if (name.second != Wasm::Common::JsonParserResultDetail::OK ||
                !name.first) {
              return false;
            }
            if (rule.credentials.find(key.first.value()) !=
                rule.credentials.end()) {
              LOG_WARN(
                  absl::StrCat("duplicate consumer key: ", key.first.value()));
              return false;
            }
            rule.credentials.emplace(
                std::make_pair(key.first.value(), secret.first.value()));
            rule.key_to_name.emplace(
                std::make_pair(key.first.value(), name.first.value()));
            return true;
          })) {
    LOG_WARN("failed to parse configuration for credentials.");
    return false;
  }
  if (rule.credentials.empty()) {
    LOG_INFO("at least one credential has to be configured for a rule.");
    return false;
  }

  auto it = configuration.find("date_offset");
  if (it != configuration.end()) {
    auto date_offset = JsonValueAs<int64_t>(it.value());
    if (date_offset.second != Wasm::Common::JsonParserResultDetail::OK ||
        !date_offset.first) {
      LOG_WARN("failed to parse 'date_offset' field in configuration.");
      return false;
    }
    rule.date_nano_offset = date_offset.first.value() * NANO_SECONDS;
  }
  return true;
}