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 2024-05-16 17:17:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/google-guest-oslogin (Old) and /work/SRC/openSUSE:Factory/.google-guest-oslogin.new.1880 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "google-guest-oslogin" Thu May 16 17:17:08 2024 rev:27 rq:1174489 version:20240415.00 Changes: -------- --- /work/SRC/openSUSE:Factory/google-guest-oslogin/google-guest-oslogin.changes 2024-04-23 18:55:34.645391570 +0200 +++ /work/SRC/openSUSE:Factory/.google-guest-oslogin.new.1880/google-guest-oslogin.changes 2024-05-16 17:19:32.341411645 +0200 @@ -1,0 +2,6 @@ +Thu May 16 12:29:28 UTC 2024 - John Paul Adrian Glaubitz <adrian.glaub...@suse.com> + +- Update to version 20240415.00 + * Log clearly when the initial parsing of a JSON object fails (#132) + +------------------------------------------------------------------- Old: ---- google-guest-oslogin-20240311.00.tar.gz New: ---- google-guest-oslogin-20240415.00.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ google-guest-oslogin.spec ++++++ --- /var/tmp/diff_new_pack.1f7dJ0/_old 2024-05-16 17:19:32.733425854 +0200 +++ /var/tmp/diff_new_pack.1f7dJ0/_new 2024-05-16 17:19:32.737425999 +0200 @@ -19,7 +19,7 @@ %{!?_pam_moduledir: %define _pam_moduledir %{_pamdir}} Name: google-guest-oslogin -Version: 20240311.00 +Version: 20240415.00 Release: 0 Summary: Google Cloud Guest OS Login License: Apache-2.0 ++++++ google-guest-oslogin-20240311.00.tar.gz -> google-guest-oslogin-20240415.00.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-oslogin-20240311.00/src/oslogin_utils.cc new/guest-oslogin-20240415.00/src/oslogin_utils.cc --- old/guest-oslogin-20240311.00/src/oslogin_utils.cc 2024-03-07 19:57:15.000000000 +0100 +++ new/guest-oslogin-20240415.00/src/oslogin_utils.cc 2024-04-04 20:35:23.000000000 +0200 @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Requires libcurl4-openssl-dev libjson0 and libjson0-dev +// Requires libcurl4-openssl-dev, libjson-c5, and libjson-c-dev #include <curl/curl.h> #include <errno.h> #include <grp.h> @@ -192,11 +192,29 @@ return ParseJsonToGroup(cached_passwd, result, buf, errnop); } +// ParseJsonRoot is declared early here, away from the other parsing functions +// found later (in the "JSON Parsing" section), so LoadJsonUsersToCache can +// take advantage of the improved error handling ParseJsonRoot offers. +json_object* ParseJsonRoot(const string& json) { + json_object* root = NULL; + struct json_tokener* tok = json_tokener_new(); + + root = json_tokener_parse_ex(tok, json.c_str(), -1); + if (root == NULL) { + enum json_tokener_error jerr = json_tokener_get_error(tok); + string error_message = json_tokener_error_desc(jerr); + SysLogErr("Failed to parse root JSON element: \"%s\", from input \"%s\"", + error_message, json); + } + + json_tokener_free(tok); + return root; +} + bool NssCache::LoadJsonUsersToCache(string response) { Reset(); - json_object* root = NULL; - root = json_tokener_parse(response.c_str()); + json_object* root = ParseJsonRoot(response); if (root == NULL) { return false; } @@ -525,14 +543,12 @@ // ----------------- JSON Parsing ----------------- bool ParseJsonToUsers(const string& json, std::vector<string>* result) { - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); - if (root == NULL) { - return false; - } - bool ret = false; + json_object* root = ParseJsonRoot(json); + if (root == NULL) { + return ret; + } json_object* users = NULL; if (!json_object_object_get_ex(root, "usernames", &users)) { ret = true; // means no users, not invalid. @@ -554,19 +570,22 @@ } bool ParseJsonToGroups(const string& json, std::vector<Group>* result) { - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); - if (root == NULL) { - return false; - } - bool ret = false; - json_object* groups = NULL; + json_object* root = ParseJsonRoot(json); + if (root == NULL) { + return ret; + } + json_object* groups; + json_type groupType; if (!json_object_object_get_ex(root, "posixGroups", &groups)) { + SysLogErr("failed to parse POSIX groups from \"%s\"", json); goto cleanup; } - if (json_object_get_type(groups) != json_type_array) { + groupType = json_object_get_type(groups); + if (groupType != json_type_array) { + SysLogErr("parsed unexpected type for field \"posixGroups\"; " + "want a list, got %s", groupType); goto cleanup; } for (int idx = 0; idx < (int)json_object_array_length(groups); idx++) { @@ -574,11 +593,12 @@ json_object* gid; if (!json_object_object_get_ex(group, "gid", &gid)) { + SysLogErr("failed to parse gid from group %s", json_object_get_string(group)); goto cleanup; } - json_object* name; if (!json_object_object_get_ex(group, "name", &name)) { + SysLogErr("failed to parse name from group %s", json_object_get_string(group)); goto cleanup; } @@ -608,22 +628,19 @@ bool ParseJsonToGroup(const string& json, struct group* result, BufferManager* buf, int* errnop) { + bool ret = false; *errnop = EINVAL; int gr_gid = 65535; - json_object* group = NULL; - group = json_tokener_parse(json.c_str()); + json_object* group = ParseJsonRoot(json); if (group == NULL) { return false; } - bool ret = false; - json_object* gid; if (!json_object_object_get_ex(group, "gid", &gid)) { goto cleanup; } - json_object* name; if (!json_object_object_get_ex(group, "name", &name)) { goto cleanup; @@ -650,16 +667,13 @@ 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()); + json_object* root = ParseJsonRoot(json); if (root == NULL) { return result; } // Locate the sshPublicKeys object. - json_object* login_profiles = NULL; + json_object* login_profiles; if (!json_object_object_get_ex(root, "loginProfiles", &login_profiles)) { goto cleanup; } @@ -668,6 +682,7 @@ } login_profiles = json_object_array_get_idx(login_profiles, 0); + json_object* ssh_public_keys; if (!json_object_object_get_ex(login_profiles, "sshPublicKeys", &ssh_public_keys)) { goto cleanup; } @@ -720,16 +735,14 @@ std::vector<string> ParseJsonToSshKeysSk(const string& json) { std::vector<string> result; - json_object* security_keys = NULL; - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); + json_object* root = ParseJsonRoot(json); if (root == NULL) { return result; } // Locate the securityKeys array. - json_object* login_profiles = NULL; + json_object* login_profiles; if (!json_object_object_get_ex(root, "loginProfiles", &login_profiles)) { goto cleanup; } @@ -739,9 +752,11 @@ login_profiles = json_object_array_get_idx(login_profiles, 0); + json_object* security_keys; if (!json_object_object_get_ex(login_profiles, "securityKeys", &security_keys)) { goto cleanup; } + if (json_object_get_type(security_keys) != json_type_array) { goto cleanup; } @@ -776,19 +791,18 @@ bool ParseJsonToPasswd(const string& json, struct passwd* result, BufferManager* buf, int* errnop) { + bool ret = false; *errnop = EINVAL; json_object* root = NULL; json_object* origroot = NULL; - origroot = root = json_tokener_parse(json.c_str()); + origroot = root = ParseJsonRoot(json); if (root == NULL) { return false; } - bool ret = false; - json_object* posix_accounts = NULL; - - json_object* login_profiles = NULL; + json_object* posix_accounts; + json_object* login_profiles; // 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) { @@ -907,17 +921,16 @@ } bool ParseJsonToEmail(const string& json, string* email) { - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); + bool ret = false; + + json_object* root = ParseJsonRoot(json); if (root == NULL) { - return false; + return ret; } - bool ret = false; - json_object* json_email = NULL; - // Locate the email object. - json_object* login_profiles = NULL; + json_object* login_profiles; + json_object* json_email; if (!json_object_object_get_ex(root, "loginProfiles", &login_profiles)) { goto cleanup; } @@ -937,8 +950,7 @@ } bool ParseJsonToSuccess(const string& json) { - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); + json_object* root = ParseJsonRoot(json); if (root == NULL) { return false; } @@ -953,17 +965,15 @@ } bool ParseJsonToKey(const string& json, const string& key, string* response) { - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); + bool ret = false; + + json_object* root = ParseJsonRoot(json); if (root == NULL) { - return false; + return ret; } - 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)) { goto cleanup; } @@ -981,13 +991,13 @@ } bool ParseJsonToChallenges(const string& json, std::vector<Challenge>* challenges) { - json_object* root = NULL; - root = json_tokener_parse(json.c_str()); + bool ret = false; + + json_object* root = ParseJsonRoot(json); if (root == NULL) { - return false; + return ret; } - bool ret = false; json_object* challengeId = NULL; json_object* challengeType = NULL; json_object* challengeStatus = NULL;