Explorar o código

Handle sso token exchange errors in zerotier client

Grant Limberg %!s(int64=3) %!d(string=hai) anos
pai
achega
4151749dc9
Modificáronse 2 ficheiros con 19 adicións e 4 borrados
  1. 18 3
      service/OneService.cpp
  2. 1 1
      zeroidc/src/ext.rs

+ 18 - 3
service/OneService.cpp

@@ -1729,9 +1729,24 @@ public:
 					NetworkState& ns = _nets[id];
 					NetworkState& ns = _nets[id];
 					char* code = zeroidc::zeroidc_get_url_param_value("code", path.c_str());
 					char* code = zeroidc::zeroidc_get_url_param_value("code", path.c_str());
 					char *ret = ns.doTokenExchange(code);
 					char *ret = ns.doTokenExchange(code);
-					scode = 200;
-					sprintf(resBuf, ssoResponseTemplate, "Authentication Successful. You may now access the network.");
-					responseBody = std::string(resBuf);
+					json ssoResult = json::parse(ret);
+					if (ssoResult.is_object()) {
+						if (ssoResult.contains("errorMessage")) {
+							std::string errorMessage = ssoResult["errorMessage"];
+							char errBuff[256] = {0};
+							sprintf(errBuff, "ERROR: %s", errorMessage.c_str());
+							sprintf(resBuf, ssoResponseTemplate, errBuff);
+							scode = 500;
+						} else {
+							scode = 200;
+							sprintf(resBuf, ssoResponseTemplate, "Authentication Successful. You may now access the network.");
+							responseBody = std::string(resBuf);
+						}
+					} else {
+						// not an object? We got a problem
+						sprintf(resBuf, ssoResponseTemplate, "Error: Unknown SSO response.");
+						scode= 500;
+					}
 
 
 					zeroidc::free_cstr(code);
 					zeroidc::free_cstr(code);
 					zeroidc::free_cstr(ret);
 					zeroidc::free_cstr(ret);

+ 1 - 1
zeroidc/src/ext.rs

@@ -275,7 +275,7 @@ pub extern "C" fn zeroidc_token_exchange(idc: *mut ZeroIDC, code: *const c_char
 
 
         },
         },
         Err(e) => {
         Err(e) => {
-            let errstr = format!("{{\"message\":\"{}\"\"}}", e).to_string();
+            let errstr = format!("{{\"errorMessage\":\"{}\"\"}}", e).to_string();
             let ret = CString::new(errstr).unwrap();
             let ret = CString::new(errstr).unwrap();
             return ret.into_raw();
             return ret.into_raw();
         }
         }