Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package google-guest-oslogin for
openSUSE:Factory checked in at 2021-08-05 20:48:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/google-guest-oslogin (Old)
and /work/SRC/openSUSE:Factory/.google-guest-oslogin.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "google-guest-oslogin"
Thu Aug 5 20:48:07 2021 rev:10 rq:910303 version:20210728.00
Changes:
--------
---
/work/SRC/openSUSE:Factory/google-guest-oslogin/google-guest-oslogin.changes
2021-07-20 15:40:00.525530828 +0200
+++
/work/SRC/openSUSE:Factory/.google-guest-oslogin.new.1899/google-guest-oslogin.changes
2021-08-05 20:48:42.083891749 +0200
@@ -1,0 +2,6 @@
+Wed Aug 4 07:35:45 UTC 2021 - John Paul Adrian Glaubitz
<[email protected]>
+
+- Update to version 20210728.00 (bsc#1188992, bsc#1189041)
+ * JSON object cleanup (#65)
+
+-------------------------------------------------------------------
Old:
----
google-guest-oslogin-20210707.00.tar.gz
New:
----
google-guest-oslogin-20210728.00.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ google-guest-oslogin.spec ++++++
--- /var/tmp/diff_new_pack.5M1LRp/_old 2021-08-05 20:48:42.727891026 +0200
+++ /var/tmp/diff_new_pack.5M1LRp/_new 2021-08-05 20:48:42.735891017 +0200
@@ -17,7 +17,7 @@
Name: google-guest-oslogin
-Version: 20210707.00
+Version: 20210728.00
Release: 0
Summary: Google Cloud Guest OS Login
License: Apache-2.0
++++++ google-guest-oslogin-20210707.00.tar.gz ->
google-guest-oslogin-20210728.00.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/guest-oslogin-20210707.00/src/nss/nss_cache_oslogin.c
new/guest-oslogin-20210728.00/src/nss/nss_cache_oslogin.c
--- old/guest-oslogin-20210707.00/src/nss/nss_cache_oslogin.c 2021-07-07
20:38:48.000000000 +0200
+++ new/guest-oslogin-20210728.00/src/nss/nss_cache_oslogin.c 2021-07-24
00:28:39.000000000 +0200
@@ -72,6 +72,10 @@
static enum nss_status _nss_cache_oslogin_setpwent_locked(void) {
DEBUG("%s %s\n", "Opening", OSLOGIN_PASSWD_CACHE_PATH);
+ if (p_file) {
+ fclose(p_file);
+ }
+
p_file = fopen(OSLOGIN_PASSWD_CACHE_PATH, "re");
if (p_file) {
@@ -208,7 +212,10 @@
// Internal setup routine
static enum nss_status _nss_cache_oslogin_setgrent_locked(void) {
- DEBUG("%s %s\n", "Opening", OSLOGIN_GROUP_CACHE_PATH);
+ if (g_file) {
+ fclose(g_file);
+ }
+
g_file = fopen(OSLOGIN_GROUP_CACHE_PATH, "re");
if (g_file) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/guest-oslogin-20210707.00/src/nss/nss_oslogin.cc
new/guest-oslogin-20210728.00/src/nss/nss_oslogin.cc
--- old/guest-oslogin-20210707.00/src/nss/nss_oslogin.cc 2021-07-07
20:38:48.000000000 +0200
+++ new/guest-oslogin-20210728.00/src/nss/nss_oslogin.cc 2021-07-24
00:28:39.000000000 +0200
@@ -119,15 +119,20 @@
memset(grp, 0, sizeof(struct group));
// Copy from userbuf to user-provided buffer.
- if (!buffer_manager.AppendString(user.pw_name, &grp->gr_name, errnop))
+ if (!buffer_manager.AppendString(user.pw_name, &grp->gr_name, errnop))
{
+ fclose(p_file);
return *errnop == ERANGE ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND;
+ }
// Add user to group.
std::vector<string> members;
members.push_back(string(user.pw_name));
- if (!AddUsersToGroup(members, grp, &buffer_manager, errnop))
+ if (!AddUsersToGroup(members, grp, &buffer_manager, errnop)) {
+ fclose(p_file);
return *errnop == ERANGE ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND;
+ }
+ fclose(p_file);
return NSS_STATUS_SUCCESS;
}
}
@@ -187,9 +192,12 @@
// Add user to group.
std::vector<string> members;
members.push_back(string(name));
- if (!AddUsersToGroup(members, grp, &buffer_manager, errnop))
+ if (!AddUsersToGroup(members, grp, &buffer_manager, errnop)) {
+ fclose(p_file);
return *errnop == ERANGE ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND;
+ }
+ fclose(p_file);
return NSS_STATUS_SUCCESS;
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/guest-oslogin-20210707.00/src/oslogin_utils.cc
new/guest-oslogin-20210728.00/src/oslogin_utils.cc
--- old/guest-oslogin-20210707.00/src/oslogin_utils.cc 2021-07-07
20:38:48.000000000 +0200
+++ new/guest-oslogin-20210728.00/src/oslogin_utils.cc 2021-07-24
00:28:39.000000000 +0200
@@ -26,7 +26,7 @@
#include <cstring>
#include <iostream>
#include <sstream>
-#include "json_object.h"
+#include <json_object.h>
#if defined(__clang__) || __GNUC__ > 4 || \
(__GNUC__ == 4 && \
@@ -124,57 +124,78 @@
bool NssCache::LoadJsonUsersToCache(string response) {
Reset();
+
json_object* root = NULL;
root = json_tokener_parse(response.c_str());
if (root == NULL) {
return false;
}
+
+ bool ret = false;
+ int arraylen = 0;
+ json_object* login_profiles = NULL;
+
// First grab the page token.
json_object* page_token_object;
if (json_object_object_get_ex(root, "nextPageToken", &page_token_object)) {
page_token_ = json_object_get_string(page_token_object);
} else {
- return false;
+ goto cleanup;
}
+
// A page_token of 0 means we are done. This response will not contain any
// login profiles.
if (page_token_ == "0") {
page_token_ = "";
on_last_page_ = true;
- return true;
+ ret = true;
+ goto cleanup;
}
+
// Now grab all of the loginProfiles.
- json_object* login_profiles = NULL;
if (!json_object_object_get_ex(root, "loginProfiles", &login_profiles)) {
- return false;
+ goto cleanup;
}
+
if (json_object_get_type(login_profiles) != json_type_array) {
- return false;
+ goto cleanup;
}
- int arraylen = json_object_array_length(login_profiles);
+
+ arraylen = json_object_array_length(login_profiles);
if (arraylen == 0 || arraylen > cache_size_) {
- return false;
+ goto cleanup;
}
+
for (int i = 0; i < arraylen; i++) {
json_object* profile = json_object_array_get_idx(login_profiles, i);
entry_cache_.push_back(json_object_to_json_string_ext(profile,
JSON_C_TO_STRING_PLAIN));
}
- return true;
+ ret = true;
+
+cleanup:
+ json_object_put(root);
+ return ret;
}
bool NssCache::LoadJsonGroupsToCache(string response) {
Reset();
+
json_object* root = NULL;
root = json_tokener_parse(response.c_str());
if (root == NULL) {
return false;
}
+
+ bool ret = false;
+ int arraylen = 0;
+ json_object* groups = NULL;
+
// First grab the page token.
json_object* page_token_object;
if (json_object_object_get_ex(root, "nextPageToken", &page_token_object)) {
page_token_ = json_object_get_string(page_token_object);
} else {
- return false;
+ goto cleanup;
}
// A page_token of 0 for groups is different than for users. This is the last
// page, but it WILL contain groups.
@@ -182,22 +203,25 @@
on_last_page_ = true;
page_token_ = "";
}
- json_object* groups = NULL;
if (!json_object_object_get_ex(root, "posixGroups", &groups)) {
- return false;
+ goto cleanup;
}
if (json_object_get_type(groups) != json_type_array) {
- return false;
+ goto cleanup;
}
- int arraylen = json_object_array_length(groups);
+ arraylen = json_object_array_length(groups);
if (arraylen == 0 || arraylen > cache_size_) {
- return false;
+ goto cleanup;
}
for (int i = 0; i < arraylen; i++) {
json_object* group = json_object_array_get_idx(groups, i);
entry_cache_.push_back(json_object_to_json_string_ext(group,
JSON_C_TO_STRING_PLAIN));
}
- return true;
+ ret = true;
+
+cleanup:
+ json_object_put(root);
+ return ret;
}
// Gets the next entry from the cache, refreshing as needed. Returns true if a
@@ -400,6 +424,7 @@
if (!buf->AppendString("", &result->pw_gecos, errnop)) {
return false;
}
+
return true;
}
@@ -412,19 +437,26 @@
return false;
}
+ bool ret = false;
+
json_object* users = NULL;
if (!json_object_object_get_ex(root, "usernames", &users)) {
- return true;
+ ret = true; // means no users, not invalid.
+ goto cleanup;
}
if (json_object_get_type(users) != json_type_array) {
- return false;
+ goto cleanup;
}
for (int idx=0; idx < (int)json_object_array_length(users); idx++) {
json_object* user = json_object_array_get_idx(users, idx);
const char* username = json_object_get_string(user);
result->push_back(string(username));
}
- return true;
+ ret = true;
+
+cleanup:
+ json_object_put(root);
+ return ret;
}
bool ParseJsonToGroups(const string& json, std::vector<Group>* result) {
@@ -434,24 +466,26 @@
return false;
}
+ bool ret = false;
+
json_object* groups = NULL;
if (!json_object_object_get_ex(root, "posixGroups", &groups)) {
- return false;
+ goto cleanup;
}
if (json_object_get_type(groups) != json_type_array) {
- return false;
+ goto cleanup;
}
for (int idx = 0; idx < (int)json_object_array_length(groups); idx++) {
json_object* group = json_object_array_get_idx(groups, idx);
json_object* gid;
if (!json_object_object_get_ex(group, "gid", &gid)) {
- return false;
+ goto cleanup;
}
json_object* name;
if (!json_object_object_get_ex(group, "name", &name)) {
- return false;
+ goto cleanup;
}
Group g;
@@ -459,70 +493,98 @@
// get_int64 will confusingly return 0 if the string can't be converted to
// an integer. We can't rely on type check as it may be a string in the
API.
+ // Also 0 is invalid because it creates a 'root group'.
if (g.gid == 0) {
- return false;
+ goto cleanup;
}
+
g.name = json_object_get_string(name);
if (g.name == "") {
- return false;
+ goto cleanup;
}
result->push_back(g);
}
- return true;
+ ret = true;
+
+cleanup:
+ json_object_put(root);
+ return ret;
}
-bool ParseJsonToGroup(const string& json, struct group* result, BufferManager*
buf, int* errnop) {
+bool ParseJsonToGroup(const string& json, struct group* result, BufferManager*
+ buf, int* errnop) {
+ *errnop = EINVAL;
+ int gr_gid = 65535;
+
json_object* group = NULL;
group = json_tokener_parse(json.c_str());
- if (group== NULL) {
- *errnop = EINVAL;
+ if (group == NULL) {
return false;
}
+ bool ret = false;
+
json_object* gid;
if (!json_object_object_get_ex(group, "gid", &gid)) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
json_object* name;
if (!json_object_object_get_ex(group, "name", &name)) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
- result->gr_gid = json_object_get_int64(gid);
- // TODO ValidateGroup
- buf->AppendString("", &result->gr_passwd, errnop);
- return buf->AppendString((char*)json_object_get_string(name),
&result->gr_name, errnop);
+ if ((gr_gid = json_object_get_int64(gid)) == 0) {
+ goto cleanup;
+ }
+
+ result->gr_gid = gr_gid;
+ if (!buf->AppendString("", &result->gr_passwd, errnop))
+ goto cleanup;
+ if (!buf->AppendString((char*)json_object_get_string(name), &result->gr_name,
+ errnop))
+ goto cleanup;
+
+ *errnop = 0;
+ ret = true;
+
+cleanup:
+ json_object_put(group);
+ return ret;
}
std::vector<string> ParseJsonToSshKeys(const string& json) {
std::vector<string> result;
+ json_object* ssh_public_keys = NULL;
+
json_object* root = NULL;
root = json_tokener_parse(json.c_str());
if (root == NULL) {
return result;
}
+
// Locate the sshPublicKeys object.
json_object* login_profiles = NULL;
if (!json_object_object_get_ex(root, "loginProfiles", &login_profiles)) {
- return result;
+ goto cleanup;
}
if (json_object_get_type(login_profiles) != json_type_array) {
- return result;
+ goto cleanup;
}
login_profiles = json_object_array_get_idx(login_profiles, 0);
- json_object* ssh_public_keys = NULL;
if (!json_object_object_get_ex(login_profiles, "sshPublicKeys",
&ssh_public_keys)) {
- return result;
+ goto cleanup;
}
if (json_object_get_type(ssh_public_keys) != json_type_object) {
- return result;
+ goto cleanup;
}
+
+ {
+ // Extra braces to indicate scope of key, obj below to compiler. Otherwise
+ // g++ complains that `goto` bypasses initializers.
json_object_object_foreach(ssh_public_keys, key, obj) {
(void)(key);
if (json_object_get_type(obj) != json_type_object) {
@@ -555,33 +617,42 @@
result.push_back(key_to_add);
}
}
+ }
+
+cleanup:
+ json_object_put(root);
return result;
}
bool ParseJsonToPasswd(const string& json, struct passwd* result,
BufferManager*
buf, int* errnop) {
+ *errnop = EINVAL;
json_object* root = NULL;
- root = json_tokener_parse(json.c_str());
+ json_object* origroot = NULL;
+
+ origroot = root = json_tokener_parse(json.c_str());
if (root == NULL) {
- *errnop = EINVAL;
return false;
}
+
+ bool ret = false;
+ json_object* posix_accounts = NULL;
+
json_object* login_profiles = NULL;
// If this is called from getpwent_r, loginProfiles won't be in the response.
if (json_object_object_get_ex(root, "loginProfiles", &login_profiles)) {
if (json_object_get_type(login_profiles) != json_type_array) {
- return false;
+ goto cleanup;
}
+ // This overwrites root but we still have origroot for cleanup;
root = json_object_array_get_idx(login_profiles, 0);
}
// Locate the posixAccounts object.
- json_object* posix_accounts = NULL;
if (!json_object_object_get_ex(root, "posixAccounts", &posix_accounts)) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
if (json_object_get_type(posix_accounts) != json_type_array) {
- return false;
+ goto cleanup;
}
posix_accounts = json_object_array_get_idx(posix_accounts, 0);
@@ -595,9 +666,11 @@
// Iterate through the json response and populate the passwd struct.
if (json_object_get_type(posix_accounts) != json_type_object) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
+ {
+ // Extra braces to indicate scope of key, obj below to compiler. Otherwise
+ // g++ complains that `goto` bypasses initializers.
json_object_object_foreach(posix_accounts, key, val) {
int val_type = json_object_get_type(val);
// Convert char* to c++ string for easier comparison.
@@ -607,12 +680,10 @@
if (val_type == json_type_int || val_type == json_type_string) {
result->pw_uid = (uint32_t)json_object_get_int64(val);
if (result->pw_uid == 0) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
} else {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
} else if (string_key == "gid") {
if (val_type == json_type_int || val_type == json_type_string) {
@@ -622,40 +693,41 @@
result->pw_gid = result->pw_uid;
}
} else {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
} else if (string_key == "username") {
if (val_type != json_type_string) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
if (!buf->AppendString((char*)json_object_get_string(val),
&result->pw_name, errnop)) {
- return false;
+ goto cleanup;
}
} else if (string_key == "homeDirectory") {
if (val_type != json_type_string) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
if (!buf->AppendString((char*)json_object_get_string(val),
&result->pw_dir, errnop)) {
- return false;
+ goto cleanup;
}
} else if (string_key == "shell") {
if (val_type != json_type_string) {
- *errnop = EINVAL;
- return false;
+ goto cleanup;
}
if (!buf->AppendString((char*)json_object_get_string(val),
&result->pw_shell, errnop)) {
- return false;
+ goto cleanup;
}
}
}
+ }
+ *errnop = 0;
+ ret = ValidatePasswd(result, buf, errnop);
- return ValidatePasswd(result, buf, errnop);
+cleanup:
+ json_object_put(origroot);
+ return ret;
}
bool AddUsersToGroup(std::vector<string> users, struct group* result,
@@ -690,22 +762,28 @@
if (root == NULL) {
return false;
}
+
+ bool ret = false;
+ json_object* json_email = NULL;
+
// Locate the email object.
json_object* login_profiles = NULL;
if (!json_object_object_get_ex(root, "loginProfiles", &login_profiles)) {
- return false;
+ goto cleanup;
}
if (json_object_get_type(login_profiles) != json_type_array) {
- return false;
+ goto cleanup;
}
login_profiles = json_object_array_get_idx(login_profiles, 0);
- json_object* json_email = NULL;
if (!json_object_object_get_ex(login_profiles, "name", &json_email)) {
- return false;
+ goto cleanup;
}
-
+ ret = true;
*email = json_object_get_string(json_email);
- return true;
+
+cleanup:
+ json_object_put(root);
+ return ret;
}
bool ParseJsonToSuccess(const string& json) {
@@ -716,59 +794,72 @@
}
json_object* success = NULL;
if (!json_object_object_get_ex(root, "success", &success)) {
+ json_object_put(root);
return false;
}
- return (bool)json_object_get_boolean(success);
+ bool ret = (bool)json_object_get_boolean(success);
+ json_object_put(root);
+ return ret;
}
bool ParseJsonToKey(const string& json, const string& key, string* response) {
json_object* root = NULL;
- json_object* json_response = NULL;
- const char* c_response;
-
root = json_tokener_parse(json.c_str());
if (root == NULL) {
return false;
}
+ bool ret = false;
+ json_object* json_response = NULL;
+ const char* c_response = NULL;
+
+
if (!json_object_object_get_ex(root, key.c_str(), &json_response)) {
- return false;
+ json_object_put(root);
+ goto cleanup;
}
if (!(c_response = json_object_get_string(json_response))) {
- return false;
+ json_object_put(root);
+ goto cleanup;
}
*response = c_response;
- return true;
+ ret = true;
+
+cleanup:
+ json_object_put(root);
+ return ret;
}
bool ParseJsonToChallenges(const string& json, std::vector<Challenge>*
challenges) {
json_object* root = NULL;
-
root = json_tokener_parse(json.c_str());
if (root == NULL) {
return false;
}
+ bool ret = false;
+ json_object* challengeId = NULL;
+ json_object* challengeType = NULL;
+ json_object* challengeStatus = NULL;
json_object* jsonChallenges = NULL;
if (!json_object_object_get_ex(root, "challenges", &jsonChallenges)) {
- return false;
+ goto cleanup;
}
- json_object *challengeId, *challengeType, *challengeStatus = NULL;
for (int i = 0; i < (int)json_object_array_length(jsonChallenges); ++i) {
if (!json_object_object_get_ex(json_object_array_get_idx(jsonChallenges,
i),
"challengeId", &challengeId)) {
- return false;
+ goto cleanup;
}
if (!json_object_object_get_ex(json_object_array_get_idx(jsonChallenges,
i),
"challengeType", &challengeType)) {
- return false;
+ goto cleanup;
}
if (!json_object_object_get_ex(json_object_array_get_idx(jsonChallenges,
i),
"status", &challengeStatus)) {
- return false;
+ goto cleanup;
}
Challenge challenge;
challenge.id = json_object_get_int(challengeId);
@@ -777,8 +868,11 @@
challenges->push_back(challenge);
}
+ ret = true;
- return true;
+cleanup:
+ json_object_put(root);
+ return ret;
}
// ----------------- OS Login functions -----------------
@@ -942,7 +1036,8 @@
bool StartSession(const string& email, string* response) {
bool ret = true;
- struct json_object *jobj, *jarr;
+ json_object* jobj = NULL;
+ json_object* jarr = NULL;
jarr = json_object_new_array();
json_object_array_add(jarr, json_object_new_string(INTERNAL_TWO_FACTOR));
@@ -974,7 +1069,8 @@
bool ContinueSession(bool alt, const string& email, const string& user_token,
const string& session_id, const Challenge& challenge, string* response) {
bool ret = true;
- struct json_object *jobj, *jresp;
+ json_object* jobj = NULL;
+ json_object* jresp = NULL;
jobj = json_object_new_object();
json_object_object_add(jobj, "email", json_object_new_string(email.c_str()));