Skip to content
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class IterableActionRunner {
static IterableActionRunnerImpl instance = new IterableActionRunnerImpl();

static boolean executeAction(@NonNull Context context, @Nullable IterableAction action, @NonNull IterableActionSource source) {
return instance.executeAction(context, action, source, new String[0]);
return instance.executeAction(context, action, source, IterableApi.getInstance().config.allowedProtocols);
}

static boolean executeAction(@NonNull Context context, @Nullable IterableAction action, @NonNull IterableActionSource source, @NonNull String[] allowedProtocols) {
Expand All @@ -29,7 +29,7 @@ static class IterableActionRunnerImpl {
private static final String TAG = "IterableActionRunner";

boolean executeAction(@NonNull Context context, @Nullable IterableAction action, @NonNull IterableActionSource source) {
return executeAction(context, action, source, new String[0]);
return executeAction(context, action, source, IterableApi.getInstance().config.allowedProtocols);
}

/**
Expand Down Expand Up @@ -66,18 +66,18 @@ boolean executeAction(@NonNull Context context, @Nullable IterableAction action,
* `false` if the handler did not handle this URL and no activity was found to open it with
*/
private boolean openUri(@NonNull Context context, @NonNull Uri uri, @NonNull IterableActionContext actionContext, String[] allowedProtocols) {
// Handle URL: check for deep links within the app
if (!IterableUtil.isUrlOpenAllowed(uri.toString(), allowedProtocols)) {
IterableLogger.e(TAG, "URL was not in the allowed protocols list");
return false;
}

if (IterableApi.sharedInstance.config.urlHandler != null) {
if (IterableApi.sharedInstance.config.urlHandler.handleIterableURL(uri, actionContext)) {
return true;
}
}

// Handle URL: check for deep links within the app
if (!isUrlOpenAllowed(uri.toString(), allowedProtocols)) {
IterableLogger.e(TAG, "URL was not in the allowed protocols list");
return false;
}

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);

Expand Down Expand Up @@ -119,19 +119,5 @@ private boolean callCustomActionIfSpecified(@NonNull IterableAction action, @Non
}
return false;
}

private static boolean isUrlOpenAllowed(@NonNull String url, @NonNull String[] allowedProtocols) {
if (url.startsWith("https")) {
return true;
}

for (String protocol : allowedProtocols) {
if (url.startsWith(protocol)) {
return true;
}
}

return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ public static void initialize(@NonNull Context context, @NonNull String apiKey,

if (sharedInstance.inAppManager == null) {
sharedInstance.inAppManager = new IterableInAppManager(sharedInstance, sharedInstance.config.inAppHandler,
sharedInstance.config.inAppDisplayInterval, sharedInstance.config.allowedProtocols);
sharedInstance.config.inAppDisplayInterval);
}

loadLastSavedConfiguration(context);
Expand Down Expand Up @@ -427,7 +427,7 @@ public void execute(String originalUrl) {
IterableAction action = IterableAction.actionOpenUrl(originalUrl);
IterableActionRunner.executeAction(getInstance().getMainActivityContext(), action, IterableActionSource.APP_LINK);
}
}, config.allowedProtocols);
}, sharedInstance.config.allowedProtocols);
return true;
} else {
IterableAction action = IterableAction.actionOpenUrl(uri);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ static void getAndTrackDeeplink(@Nullable String url, @NonNull IterableHelper.It
*/
static void getAndTrackDeeplink(@Nullable String url, @NonNull IterableHelper.IterableActionHandler callback, @NonNull String[] allowedProtocols) {
if (url != null) {
if (!isUrlOpenAllowed(url, allowedProtocols)) {
if (!IterableUtil.isUrlOpenAllowed(url, allowedProtocols)) {
IterableLogger.e(TAG, "URL was not in the allowed protocols list");
return;
}
Expand Down Expand Up @@ -63,20 +63,6 @@ static boolean isIterableDeeplink(@Nullable String url) {
return false;
}

private static boolean isUrlOpenAllowed(@NonNull String url, @NonNull String[] allowedProtocols) {
if (url.startsWith("https")) {
return true;
}

for (String protocol : allowedProtocols) {
if (url.startsWith(protocol)) {
return true;
}
}

return false;
}

private static class RedirectTask extends AsyncTask<String, Void, String> {
static final String TAG = "RedirectTask";
static final int DEFAULT_TIMEOUT_MS = 3000; //3 seconds
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,20 @@ public interface Listener {
private final IterableInAppStorage storage;
private final IterableInAppHandler handler;
private final IterableInAppDisplayer displayer;
private final String[] allowedProtocols;
private final IterableActivityMonitor activityMonitor;
private final double inAppDisplayInterval;
private final List<Listener> listeners = new ArrayList<>();
private long lastSyncTime = 0;
private long lastInAppShown = 0;
private boolean autoDisplayPaused = false;

IterableInAppManager(IterableApi iterableApi, IterableInAppHandler handler, double inAppDisplayInterval, String[] allowedProtocols) {
IterableInAppManager(IterableApi iterableApi, IterableInAppHandler handler, double inAppDisplayInterval) {
this(iterableApi,
handler,
inAppDisplayInterval,
new IterableInAppFileStorage(iterableApi.getMainActivityContext()),
IterableActivityMonitor.getInstance(),
new IterableInAppDisplayer(IterableActivityMonitor.getInstance()),
allowedProtocols);
new IterableInAppDisplayer(IterableActivityMonitor.getInstance()));
}

@VisibleForTesting
Expand All @@ -67,8 +65,7 @@ public interface Listener {
double inAppDisplayInterval,
IterableInAppStorage storage,
IterableActivityMonitor activityMonitor,
IterableInAppDisplayer displayer,
String[] allowedProtocols) {
IterableInAppDisplayer displayer) {
this.api = iterableApi;
this.context = iterableApi.getMainActivityContext();
this.handler = handler;
Expand All @@ -77,7 +74,6 @@ public interface Listener {
this.displayer = displayer;
this.activityMonitor = activityMonitor;
this.activityMonitor.addCallback(this);
this.allowedProtocols = allowedProtocols;

syncInApp();
}
Expand Down Expand Up @@ -275,17 +271,17 @@ public void handleInAppClick(@NonNull IterableInAppMessage message, @Nullable Ur
if (urlString.startsWith(IterableConstants.URL_SCHEME_ACTION)) {
// This is an action:// URL, pass that to the custom action handler
String actionName = urlString.replace(IterableConstants.URL_SCHEME_ACTION, "");
IterableActionRunner.executeAction(context, IterableAction.actionCustomAction(actionName), IterableActionSource.IN_APP, allowedProtocols);
IterableActionRunner.executeAction(context, IterableAction.actionCustomAction(actionName), IterableActionSource.IN_APP, IterableApi.getInstance().config.allowedProtocols);
} else if (urlString.startsWith(IterableConstants.URL_SCHEME_ITBL)) {
// Handle itbl:// URLs, pass that to the custom action handler for compatibility
String actionName = urlString.replace(IterableConstants.URL_SCHEME_ITBL, "");
IterableActionRunner.executeAction(context, IterableAction.actionCustomAction(actionName), IterableActionSource.IN_APP, allowedProtocols);
IterableActionRunner.executeAction(context, IterableAction.actionCustomAction(actionName), IterableActionSource.IN_APP, IterableApi.getInstance().config.allowedProtocols);
} else if (urlString.startsWith(IterableConstants.URL_SCHEME_ITERABLE)) {
// Handle iterable:// URLs - reserved for actions defined by the SDK only
String actionName = urlString.replace(IterableConstants.URL_SCHEME_ITERABLE, "");
handleIterableCustomAction(actionName, message);
} else {
IterableActionRunner.executeAction(context, IterableAction.actionOpenUrl(urlString), IterableActionSource.IN_APP, allowedProtocols);
IterableActionRunner.executeAction(context, IterableAction.actionOpenUrl(urlString), IterableActionSource.IN_APP, IterableApi.getInstance().config.allowedProtocols);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;

Expand Down Expand Up @@ -277,4 +278,18 @@ boolean writeFile(File file, String content) {
return false;
}
}

static boolean isUrlOpenAllowed(@NonNull String url, @NonNull String[] allowedProtocols) {
if (url.startsWith("https")) {
return true;
}

for (String protocol : allowedProtocols) {
if (url.startsWith(protocol)) {
return true;
}
}

return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class IterableInAppManagerSyncTest extends BaseTest {
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
inAppManager = spy(new IterableInAppManager(iterableApiMock, handlerMock, 30.0, storageMock, activityMonitorMock, inAppDisplayerMock, new String[0]));
inAppManager = spy(new IterableInAppManager(iterableApiMock, handlerMock, 30.0, storageMock, activityMonitorMock, inAppDisplayerMock));
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ public void testHandleActionLink() throws Exception {
IterableActivityMonitor.instance = new IterableActivityMonitor();

IterableInAppDisplayer inAppDisplayerMock = mock(IterableInAppDisplayer.class);
IterableInAppManager inAppManager = spy(new IterableInAppManager(IterableApi.sharedInstance, new IterableDefaultInAppHandler(), 30.0, new IterableInAppMemoryStorage(), IterableActivityMonitor.getInstance(), inAppDisplayerMock, new String[0]));
IterableInAppManager inAppManager = spy(new IterableInAppManager(IterableApi.sharedInstance, new IterableDefaultInAppHandler(), 30.0, new IterableInAppMemoryStorage(), IterableActivityMonitor.getInstance(), inAppDisplayerMock));
IterableApi.sharedInstance = new IterableApi(inAppManager);
IterableTestUtils.createIterableApiNew(new IterableTestUtils.ConfigBuilderExtender() {
@Override
Expand Down Expand Up @@ -328,7 +328,7 @@ public void testHandleCustomActionDelete() throws Exception {
IterableActivityMonitor.instance = new IterableActivityMonitor();

IterableInAppDisplayer inAppDisplayerMock = mock(IterableInAppDisplayer.class);
IterableInAppManager inAppManager = spy(new IterableInAppManager(IterableApi.sharedInstance, new IterableSkipInAppHandler(), 30.0, new IterableInAppMemoryStorage(), IterableActivityMonitor.getInstance(), inAppDisplayerMock, new String[0]));
IterableInAppManager inAppManager = spy(new IterableInAppManager(IterableApi.sharedInstance, new IterableSkipInAppHandler(), 30.0, new IterableInAppMemoryStorage(), IterableActivityMonitor.getInstance(), inAppDisplayerMock));
IterableApi.sharedInstance = new IterableApi(inAppManager);
IterableTestUtils.createIterableApiNew(new IterableTestUtils.ConfigBuilderExtender() {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public void testShowInboxMessageImmediate() throws Exception {

IterableInAppDisplayer inAppDisplayerMock = mock(IterableInAppDisplayer.class);
when(inAppDisplayerMock.showMessage(any(IterableInAppMessage.class), eq(IterableInAppLocation.IN_APP), any(IterableHelper.IterableUrlCallback.class))).thenReturn(true);
IterableInAppManager inAppManager = spy(new IterableInAppManager(IterableApi.sharedInstance, new IterableDefaultInAppHandler(), 30.0, new IterableInAppMemoryStorage(), IterableActivityMonitor.getInstance(), inAppDisplayerMock, new String[0]));
IterableInAppManager inAppManager = spy(new IterableInAppManager(IterableApi.sharedInstance, new IterableDefaultInAppHandler(), 30.0, new IterableInAppMemoryStorage(), IterableActivityMonitor.getInstance(), inAppDisplayerMock));
IterableApi.sharedInstance = new IterableApi(inAppManager);
IterableTestUtils.createIterableApiNew(new IterableTestUtils.ConfigBuilderExtender() {
@Override
Expand Down