Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/appauth-android-response-values.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"react-native-app-auth": patch
---

Decode JSON objects and arrays once, preserve nested null values, accept null native values without a crash, and retain scalar/malformed strings. Iterate map entries directly and share the base authorization response serializer when adding a PKCE verifier.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import java.util.HashMap;
import java.util.Iterator;
Expand All @@ -39,24 +40,24 @@ public static HashMap<String, String> readableMapToHashMap(@Nullable ReadableMap
public static final WritableMap createAdditionalParametersMap(Map<String, String> additionalParameters) {
WritableMap additionalParametersMap = Arguments.createMap();

if (!additionalParameters.isEmpty()) {

Iterator<String> iterator = additionalParameters.keySet().iterator();

while(iterator.hasNext()) {
String key = iterator.next();
String value = additionalParameters.get(key);
// Try to parse to JSON
for (Map.Entry<String, String> entry : additionalParameters.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (value != null) {
try {
JSONObject jsonObject = new JSONObject(value);
WritableMap json = convertJsonToMap(jsonObject);
additionalParametersMap.putMap(key, json);
continue;
Object parsed = new JSONTokener(value).nextValue();
if (parsed instanceof JSONObject) {
additionalParametersMap.putMap(key, convertJsonToMap((JSONObject) parsed));
continue;
}
if (parsed instanceof JSONArray) {
additionalParametersMap.putArray(key, convertJsonToArray((JSONArray) parsed));
continue;
}
} catch (JSONException ignored) {

}
additionalParametersMap.putString(key, additionalParameters.get(key));
}
additionalParametersMap.putString(key, value);
}

return additionalParametersMap;
Expand All @@ -69,7 +70,9 @@ private static WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONEx
while (iterator.hasNext()) {
String key = iterator.next();
Object value = jsonObject.get(key);
if (value instanceof JSONObject) {
if (value == JSONObject.NULL) {
map.putNull(key);
} else if (value instanceof JSONObject) {
map.putMap(key, convertJsonToMap((JSONObject) value));
} else if (value instanceof JSONArray) {
map.putArray(key, convertJsonToArray((JSONArray) value));
Expand Down Expand Up @@ -97,7 +100,9 @@ private static WritableArray convertJsonToArray(JSONArray jsonArray) throws JSON

for (int i = 0; i < jsonArray.length(); i++) {
Object value = jsonArray.get(i);
if (value instanceof JSONObject) {
if (value == JSONObject.NULL) {
array.pushNull();
} else if (value instanceof JSONObject) {
array.pushMap(convertJsonToMap((JSONObject) value));
} else if (value instanceof JSONArray) {
array.pushArray(convertJsonToArray((JSONArray) value));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,7 @@ public static final WritableMap authorizationResponseToMap(AuthorizationResponse
* Read raw authorization into a React Native map with codeVerifier value added if present to be passed down the bridge
*/
public static final WritableMap authorizationCodeResponseToMap(AuthorizationResponse authResponse, String codeVerifier) {
WritableMap map = Arguments.createMap();
map.putString("authorizationCode", authResponse.authorizationCode);
map.putString("accessToken", authResponse.accessToken);
map.putMap("additionalParameters", MapUtil.createAdditionalParametersMap(authResponse.additionalParameters));
map.putString("idToken", authResponse.idToken);
map.putString("tokenType", authResponse.tokenType);
map.putArray("scopes", createScopeArray(authResponse.scope));

if (authResponse.accessTokenExpirationTime != null) {
map.putString("accessTokenExpirationTime", DateUtil.formatTimestamp(authResponse.accessTokenExpirationTime));
}
WritableMap map = authorizationResponseToMap(authResponse);

if (!TextUtils.isEmpty(codeVerifier)) {
map.putString("codeVerifier", codeVerifier);
Expand Down