bool NssCache::NssGetgrentHelper()

in src/oslogin_utils.cc [366:403]


bool NssCache::NssGetgrentHelper(BufferManager* buf, struct group* result, int* errnop) {
  if (!HasNextEntry() && !OnLastPage()) {
    std::stringstream url;
    url << kMetadataServerUrl << "groups?pagesize=" << cache_size_;
    string page_token = GetPageToken();
    if (!page_token.empty()) {
      url << "&pagetoken=" << page_token;
    }
    string response;
    long http_code = 0;
    bool status = HttpGet(url.str(), &response, &http_code);
    // 404 means OS Login is not enabled.
    if (http_code == 404) {
      *errnop = ENOMSG;
      return false;
    }
    // Failed to make the request or empty response.
    if (!status || http_code != 200 || response.empty()) {
      *errnop = ENOENT;
      return false;
    }
    // General failure to load the cache occurred.
    if (!LoadJsonGroupsToCache(response, errnop)) {
      return false;
    }
  }

  if (!HasNextEntry() || !GetNextGroup(buf, result, errnop)) {
    return false;
  }

  std::vector<string> users;
  std::string name(result->gr_name);
  if (!GetUsersForGroup(name, &users, errnop)) {
    return false;
  }
  return AddUsersToGroup(users, result, buf, errnop);
}