From 13532ec72b8c321d4973fc03d38f148501afc739 Mon Sep 17 00:00:00 2001 From: npaine Date: Tue, 21 Oct 2025 09:02:28 -0700 Subject: [PATCH 01/10] Adding sanitizer allow lists --- .../applications/events/Sanitizer.java | 31 +++++++++++++++++++ lib/include/public/Version.hpp | 6 ++-- lib/jni/Sanitizer_jni.cpp | 28 ++++++++++++++++- lib/modules | 2 +- wrappers/obj-c/ODWSanitizer.mm | 20 ++++++++++++ wrappers/obj-c/ODWSanitizer_private.h | 9 ++++++ 6 files changed, 91 insertions(+), 5 deletions(-) diff --git a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java index e23c60ff8..28d1fd604 100644 --- a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java +++ b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java @@ -46,6 +46,37 @@ public static boolean initialize(SanitizerConfiguration config) { config.isEnforceSanitization()); } + /** + * Initializes the sanitizer with the provided configuration. + * + * @param config The configuration settings used to initialize a sanitizer. + * @return true if initialization succeeds, false otherwise. + * @throws IllegalArgumentException if config or any required field is null or invalid. + */ + public static boolean initialize(SanitizerConfiguration config, int sanitizerConfigurationOverrides) { + + // Validate that the configuration object is not null + if(config == null) { + throw new IllegalArgumentException("initConfig cannot be null"); + } + + // Ensure the logger instance is provided + if(config.getLogger() == null) { + throw new IllegalArgumentException(("loggerInstance cannot be null in config.")); + } + + // Ensure the notification event name is not null or empty + if (config.getNotificationEventName() == null || config.getNotificationEventName().isEmpty()) { + throw new IllegalArgumentException(("notificationEventName cannot be null in config.")); + } + + return nativeInitialize( + config.getLogger().getNativeILoggerPtr(), + config.getNotificationEventName(), + config.isEnforceSanitization(), + sanitizerConfigurationOverrides); // TODO, check with Frank if I did this right. + } + /** * Checks if the sanitizer is initialized. * diff --git a/lib/include/public/Version.hpp b/lib/include/public/Version.hpp index 988068d8b..7c629e883 100644 --- a/lib/include/public/Version.hpp +++ b/lib/include/public/Version.hpp @@ -6,8 +6,8 @@ #define MAT_VERSION_HPP // WARNING: DO NOT MODIFY THIS FILE! // This file has been automatically generated, manual changes will be lost. -#define BUILD_VERSION_STR "3.9.267.1" -#define BUILD_VERSION 3,9,267,1 +#define BUILD_VERSION_STR "3.9.293.1" +#define BUILD_VERSION 3,9,293,1 #ifndef RESOURCE_COMPILER_INVOKED #include "ctmacros.hpp" @@ -18,7 +18,7 @@ namespace MAT_NS_BEGIN { uint64_t const Version = ((uint64_t)3 << 48) | ((uint64_t)9 << 32) | - ((uint64_t)267 << 16) | + ((uint64_t)293 << 16) | ((uint64_t)1); } MAT_NS_END diff --git a/lib/jni/Sanitizer_jni.cpp b/lib/jni/Sanitizer_jni.cpp index 2f0378684..7e6d8b58a 100644 --- a/lib/jni/Sanitizer_jni.cpp +++ b/lib/jni/Sanitizer_jni.cpp @@ -35,7 +35,33 @@ Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( return false; } - SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr)); + SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr), static_cast(0)); + + if (notificationEventName != nullptr) { + sanitizerConfig.NotificationEventName = JStringToStdString(env, notificationEventName); + } + + sanitizerConfig.SetAllWarningsToSanitizations = static_cast(warningsToSanitization); + + spSanitizer = std::make_shared(sanitizerConfig); + return true; +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( + JNIEnv *env, jclass /* this */, + jlong iLoggerNativePtr, + jstring notificationEventName, + jboolean warningsToSanitization, + jint sanitizerConfigurationOverrides) { + + if (spSanitizer != nullptr) { + return false; + } + + // Correct cast for overrides (was reinterpret_cast) + SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr), static_cast(sanitizerConfigurationOverrides)); if (notificationEventName != nullptr) { sanitizerConfig.NotificationEventName = JStringToStdString(env, notificationEventName); diff --git a/lib/modules b/lib/modules index e33ca4503..992f564f3 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit e33ca450388210cc41bd79137d1e1b3927ff0da4 +Subproject commit 992f564f37dc30164edcfbfb88ec0da0d96fc5f9 diff --git a/wrappers/obj-c/ODWSanitizer.mm b/wrappers/obj-c/ODWSanitizer.mm index 9ade8cdd3..a4eb9ef97 100644 --- a/wrappers/obj-c/ODWSanitizer.mm +++ b/wrappers/obj-c/ODWSanitizer.mm @@ -1,3 +1,4 @@ + // // Copyright (c) Microsoft Corporation. All rights reserved. // SPDX-License-Identifier: Apache-2.0 @@ -37,6 +38,25 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani LogManager::GetInstance()->SetDataInspector(_sanitizerPtr); } ++(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject overrides:(int)overridesInt +{ + if (_sanitizerPtr != nullptr) + { + return; + } + + SanitizerConfiguration config(logger, overridesInt); + + if ([initConfigObject notificationEventName] != nil) + { + config.NotificationEventName = [[initConfigObject notificationEventName] UTF8String]; + } + config.SetAllWarningsToSanitizations = initConfigObject.setWarningsToSanitization; + + _sanitizerPtr = std::make_shared(config); + LogManager::GetInstance()->SetDataInspector(_sanitizerPtr); +} + +(void)setEnabled:(bool)enabled { if(_sanitizerPtr != nullptr) diff --git a/wrappers/obj-c/ODWSanitizer_private.h b/wrappers/obj-c/ODWSanitizer_private.h index 291c71f25..4eead7911 100644 --- a/wrappers/obj-c/ODWSanitizer_private.h +++ b/wrappers/obj-c/ODWSanitizer_private.h @@ -22,6 +22,15 @@ NS_ASSUME_NONNULL_BEGIN @param initConfigObject the configuration */ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject; + +/*! + @brief Initializes the sanitizer with overrides + @param logger Logger used for reporting concerns + @param initConfigObject the configuration + @param overridesInt Overrides enum value passed as int + */ ++(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject overrides:(int)overridesInt; + @end NS_ASSUME_NONNULL_END From 640aec6dd6778376d01f7d4d199e70b9d6a808c4 Mon Sep 17 00:00:00 2001 From: npaine Date: Tue, 21 Oct 2025 10:36:48 -0700 Subject: [PATCH 02/10] Change constructor for JNI and Java sanitizers --- .../applications/events/Sanitizer.java | 32 +------------------ lib/jni/Sanitizer_jni.cpp | 24 -------------- 2 files changed, 1 insertion(+), 55 deletions(-) diff --git a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java index 28d1fd604..c122a063c 100644 --- a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java +++ b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java @@ -14,7 +14,7 @@ public class Sanitizer { * @param enforceSanitization Flag to control whether sanitization is enforced. * @return true if initialization was successful, false otherwise. */ - private static native boolean nativeInitialize(long loggerNativePtr, String notificationEventName, boolean enforceSanitization); + private static native boolean nativeInitialize(long loggerNativePtr, String notificationEventName, boolean enforceSanitization, int sanitizerConfigurationOverrides); /** * Initializes the sanitizer with the provided configuration. @@ -23,36 +23,6 @@ public class Sanitizer { * @return true if initialization succeeds, false otherwise. * @throws IllegalArgumentException if config or any required field is null or invalid. */ - public static boolean initialize(SanitizerConfiguration config) { - - // Validate that the configuration object is not null - if(config == null) { - throw new IllegalArgumentException("initConfig cannot be null"); - } - - // Ensure the logger instance is provided - if(config.getLogger() == null) { - throw new IllegalArgumentException(("loggerInstance cannot be null in config.")); - } - - // Ensure the notification event name is not null or empty - if (config.getNotificationEventName() == null || config.getNotificationEventName().isEmpty()) { - throw new IllegalArgumentException(("notificationEventName cannot be null in config.")); - } - - return nativeInitialize( - config.getLogger().getNativeILoggerPtr(), - config.getNotificationEventName(), - config.isEnforceSanitization()); - } - - /** - * Initializes the sanitizer with the provided configuration. - * - * @param config The configuration settings used to initialize a sanitizer. - * @return true if initialization succeeds, false otherwise. - * @throws IllegalArgumentException if config or any required field is null or invalid. - */ public static boolean initialize(SanitizerConfiguration config, int sanitizerConfigurationOverrides) { // Validate that the configuration object is not null diff --git a/lib/jni/Sanitizer_jni.cpp b/lib/jni/Sanitizer_jni.cpp index 7e6d8b58a..0538b0d84 100644 --- a/lib/jni/Sanitizer_jni.cpp +++ b/lib/jni/Sanitizer_jni.cpp @@ -23,30 +23,6 @@ Java_com_microsoft_applications_events_Sanitizer_isInitialized(const JNIEnv *env return spSanitizer != nullptr; } -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( - JNIEnv *env, jclass /* this */, - jlong iLoggerNativePtr, - jstring notificationEventName, - jboolean warningsToSanitization) { - - if (spSanitizer != nullptr) { - return false; - } - - SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr), static_cast(0)); - - if (notificationEventName != nullptr) { - sanitizerConfig.NotificationEventName = JStringToStdString(env, notificationEventName); - } - - sanitizerConfig.SetAllWarningsToSanitizations = static_cast(warningsToSanitization); - - spSanitizer = std::make_shared(sanitizerConfig); - return true; -} - extern "C" JNIEXPORT jboolean JNICALL Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( From 2cc410fbc119377e81ef1d82ca1fa8bb2fab36de Mon Sep 17 00:00:00 2001 From: npaine Date: Tue, 21 Oct 2025 15:41:20 -0700 Subject: [PATCH 03/10] Missed part of the wrappers --- wrappers/obj-c/ODWLogger.mm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/wrappers/obj-c/ODWLogger.mm b/wrappers/obj-c/ODWLogger.mm index 98865d1f5..40caf62db 100644 --- a/wrappers/obj-c/ODWLogger.mm +++ b/wrappers/obj-c/ODWLogger.mm @@ -1,3 +1,4 @@ + // // Copyright (c) Microsoft Corporation. All rights reserved. // SPDX-License-Identifier: Apache-2.0 @@ -418,4 +419,10 @@ -(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)i { [ODWSanitizer initializeSanitizer:_wrappedLogger withODWSanitizerInitConfig:initConfigObject]; } + +// Added overload that includes overrides parameter. +-(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject overrides:(int)overridesInt +{ + [ODWSanitizer initializeSanitizer:_wrappedLogger withODWSanitizerInitConfig:initConfigObject overrides:overridesInt]; +} @end From b5fd47d2e208703da20935ad8e3f0a2f2fe50de1 Mon Sep 17 00:00:00 2001 From: npaine Date: Sun, 9 Nov 2025 16:30:10 -0800 Subject: [PATCH 04/10] updated wrappers --- .../applications/events/Sanitizer.java | 28 +++++++++++----- lib/include/public/Version.hpp | 6 ++-- lib/jni/Sanitizer_jni.cpp | 32 +++++++++++++++++-- lib/modules | 2 +- wrappers/obj-c/ODWLogger.h | 13 ++++++++ wrappers/obj-c/ODWLogger.mm | 5 ++- wrappers/obj-c/ODWSanitizer.mm | 27 ++++++++++++++-- wrappers/obj-c/ODWSanitizer_private.h | 12 +++++-- 8 files changed, 101 insertions(+), 24 deletions(-) diff --git a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java index c122a063c..16c24a234 100644 --- a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java +++ b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java @@ -4,26 +4,36 @@ // package com.microsoft.applications.events; -public class Sanitizer { - - /** +public class Sanitizer { /** * Initializes the sanitizer with the given logger pointer and optional notification event name. * * @param loggerNativePtr Native pointer to ILogger. * @param notificationEventName Optional event name for sanitizer notifications. * @param enforceSanitization Flag to control whether sanitization is enforced. + * @param urlDomains Array of URL domains to allow. + * @param emailDomains Array of email domains to allow. + * @param analyzerOptions Analyzer options flags (bitwise OR of values): + * 0 = None (default - no special analyzer behaviors) + * 1 = SitePathStrict (enables strict site path analysis) + * 2 = SitePathLoose (enables loose site path analysis) + * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) * @return true if initialization was successful, false otherwise. */ - private static native boolean nativeInitialize(long loggerNativePtr, String notificationEventName, boolean enforceSanitization, int sanitizerConfigurationOverrides); - - /** + private static native boolean nativeInitialize(long loggerNativePtr, String notificationEventName, boolean enforceSanitization, String[] urlDomains, String[] emailDomains, int analyzerOptions); /** * Initializes the sanitizer with the provided configuration. * * @param config The configuration settings used to initialize a sanitizer. + * @param urlDomains Array of URL domains to allow (can be null for empty list). + * @param emailDomains Array of email domains to allow (can be null for empty list). + * @param analyzerOptions Analyzer options flags (bitwise OR of values): + * 0 = None (default - no special analyzer behaviors) + * 1 = SitePathStrict (enables strict site path analysis) + * 2 = SitePathLoose (enables loose site path analysis) + * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) * @return true if initialization succeeds, false otherwise. * @throws IllegalArgumentException if config or any required field is null or invalid. */ - public static boolean initialize(SanitizerConfiguration config, int sanitizerConfigurationOverrides) { + public static boolean initialize(SanitizerConfiguration config, String[] urlDomains, String[] emailDomains, int analyzerOptions) { // Validate that the configuration object is not null if(config == null) { @@ -44,7 +54,9 @@ public static boolean initialize(SanitizerConfiguration config, int sanitizerCon config.getLogger().getNativeILoggerPtr(), config.getNotificationEventName(), config.isEnforceSanitization(), - sanitizerConfigurationOverrides); // TODO, check with Frank if I did this right. + urlDomains, + emailDomains, + analyzerOptions); } /** diff --git a/lib/include/public/Version.hpp b/lib/include/public/Version.hpp index 7c629e883..2cc64ca75 100644 --- a/lib/include/public/Version.hpp +++ b/lib/include/public/Version.hpp @@ -6,8 +6,8 @@ #define MAT_VERSION_HPP // WARNING: DO NOT MODIFY THIS FILE! // This file has been automatically generated, manual changes will be lost. -#define BUILD_VERSION_STR "3.9.293.1" -#define BUILD_VERSION 3,9,293,1 +#define BUILD_VERSION_STR "3.9.313.1" +#define BUILD_VERSION 3,9,313,1 #ifndef RESOURCE_COMPILER_INVOKED #include "ctmacros.hpp" @@ -18,7 +18,7 @@ namespace MAT_NS_BEGIN { uint64_t const Version = ((uint64_t)3 << 48) | ((uint64_t)9 << 32) | - ((uint64_t)293 << 16) | + ((uint64_t)313 << 16) | ((uint64_t)1); } MAT_NS_END diff --git a/lib/jni/Sanitizer_jni.cpp b/lib/jni/Sanitizer_jni.cpp index 0538b0d84..6d16e2949 100644 --- a/lib/jni/Sanitizer_jni.cpp +++ b/lib/jni/Sanitizer_jni.cpp @@ -30,14 +30,40 @@ Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( jlong iLoggerNativePtr, jstring notificationEventName, jboolean warningsToSanitization, - jint sanitizerConfigurationOverrides) { + jobjectArray urlDomains, + jobjectArray emailDomains, + jint analyzerOptions) { if (spSanitizer != nullptr) { return false; } - // Correct cast for overrides (was reinterpret_cast) - SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr), static_cast(sanitizerConfigurationOverrides)); + std::vector urlDomainsVec; + std::vector emailDomainsVec; + + if (urlDomains != nullptr) { + jsize urlDomainsLength = env->GetArrayLength(urlDomains); + for (jsize i = 0; i < urlDomainsLength; i++) { + jstring domain = static_cast(env->GetObjectArrayElement(urlDomains, i)); + if (domain != nullptr) { + urlDomainsVec.push_back(JStringToStdString(env, domain)); + env->DeleteLocalRef(domain); + } + } + } + + if (emailDomains != nullptr) { + jsize emailDomainsLength = env->GetArrayLength(emailDomains); + for (jsize i = 0; i < emailDomainsLength; i++) { + jstring domain = static_cast(env->GetObjectArrayElement(emailDomains, i)); + if (domain != nullptr) { + emailDomainsVec.push_back(JStringToStdString(env, domain)); + env->DeleteLocalRef(domain); + } + } + } + + SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr), urlDomainsVec, emailDomainsVec, static_cast(analyzerOptions)); if (notificationEventName != nullptr) { sanitizerConfig.NotificationEventName = JStringToStdString(env, notificationEventName); diff --git a/lib/modules b/lib/modules index 992f564f3..331d9fee5 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 992f564f37dc30164edcfbfb88ec0da0d96fc5f9 +Subproject commit 331d9fee589ed01fe4a7710ef1b0c5f03dd28547 diff --git a/wrappers/obj-c/ODWLogger.h b/wrappers/obj-c/ODWLogger.h index 084bea456..3b168012c 100644 --- a/wrappers/obj-c/ODWLogger.h +++ b/wrappers/obj-c/ODWLogger.h @@ -134,6 +134,19 @@ typedef NS_ENUM(NSInteger, ODWSessionState) */ -(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject; +/*! + @brief Initialize the Sanitizer component with domain allow lists. + @param initConfigObject An instance of ODWSanitizerInitConfig that contains the configuration settings for the Sanitizer component. + @param urlDomains Array of URL domains to allow (can be nil for empty list). + @param emailDomains Array of email domains to allow (can be nil for empty list). + @param analyzerOptions Analyzer options flags (bitwise OR of values): + - 0: None (default - no special analyzer behaviors) + - 1: SitePathStrict (enables strict site path analysis) + - 2: SitePathLoose (enables loose site path analysis) + Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) + */ +-(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject urlDomains:(NSArray * _Nullable)urlDomains emailDomains:(NSArray * _Nullable)emailDomains analyzerOptions:(int)analyzerOptions; + #pragma mark Set Context methods /*! diff --git a/wrappers/obj-c/ODWLogger.mm b/wrappers/obj-c/ODWLogger.mm index 40caf62db..594603390 100644 --- a/wrappers/obj-c/ODWLogger.mm +++ b/wrappers/obj-c/ODWLogger.mm @@ -420,9 +420,8 @@ -(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)i [ODWSanitizer initializeSanitizer:_wrappedLogger withODWSanitizerInitConfig:initConfigObject]; } -// Added overload that includes overrides parameter. --(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject overrides:(int)overridesInt +-(void)initializeSanitizerWithODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject urlDomains:(NSArray *)urlDomains emailDomains:(NSArray *)emailDomains analyzerOptions:(int)analyzerOptions { - [ODWSanitizer initializeSanitizer:_wrappedLogger withODWSanitizerInitConfig:initConfigObject overrides:overridesInt]; + [ODWSanitizer initializeSanitizer:_wrappedLogger withODWSanitizerInitConfig:initConfigObject urlDomains:urlDomains emailDomains:emailDomains analyzerOptions:analyzerOptions]; } @end diff --git a/wrappers/obj-c/ODWSanitizer.mm b/wrappers/obj-c/ODWSanitizer.mm index a4eb9ef97..d02044854 100644 --- a/wrappers/obj-c/ODWSanitizer.mm +++ b/wrappers/obj-c/ODWSanitizer.mm @@ -26,7 +26,9 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani return; } - SanitizerConfiguration config(logger); + std::vector urlDomains; + std::vector emailDomains; + SanitizerConfiguration config(logger, urlDomains, emailDomains, 0); if ([initConfigObject notificationEventName] != nil) { @@ -38,14 +40,33 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani LogManager::GetInstance()->SetDataInspector(_sanitizerPtr); } -+(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject overrides:(int)overridesInt ++(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject urlDomains:(NSArray *)urlDomains emailDomains:(NSArray *)emailDomains analyzerOptions:(int)analyzerOptions { if (_sanitizerPtr != nullptr) { return; } - SanitizerConfiguration config(logger, overridesInt); + std::vector urlDomainsVec; + std::vector emailDomainsVec; + + if (urlDomains != nil) + { + for (NSString *domain in urlDomains) + { + urlDomainsVec.push_back([domain UTF8String]); + } + } + + if (emailDomains != nil) + { + for (NSString *domain in emailDomains) + { + emailDomainsVec.push_back([domain UTF8String]); + } + } + + SanitizerConfiguration config(logger, urlDomainsVec, emailDomainsVec, static_cast(analyzerOptions)); if ([initConfigObject notificationEventName] != nil) { diff --git a/wrappers/obj-c/ODWSanitizer_private.h b/wrappers/obj-c/ODWSanitizer_private.h index 4eead7911..89a857fbd 100644 --- a/wrappers/obj-c/ODWSanitizer_private.h +++ b/wrappers/obj-c/ODWSanitizer_private.h @@ -24,12 +24,18 @@ NS_ASSUME_NONNULL_BEGIN +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject; /*! - @brief Initializes the sanitizer with overrides + @brief Initializes the sanitizer with domain allow lists @param logger Logger used for reporting concerns @param initConfigObject the configuration - @param overridesInt Overrides enum value passed as int + @param urlDomains Array of URL domains to allow (can be nil for empty list) + @param emailDomains Array of email domains to allow (can be nil for empty list) + @param analyzerOptions Analyzer options flags (bitwise OR of values): + - 0: None (default - no special analyzer behaviors) + - 1: SitePathStrict (enables strict site path analysis) + - 2: SitePathLoose (enables loose site path analysis) + Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) */ -+(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject overrides:(int)overridesInt; ++(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSanitizerInitConfig *)initConfigObject urlDomains:(NSArray * _Nullable)urlDomains emailDomains:(NSArray * _Nullable)emailDomains analyzerOptions:(int)analyzerOptions; @end From af562e6176cbe8d0daead4c2c4957d963849cfb3 Mon Sep 17 00:00:00 2001 From: npaine Date: Mon, 10 Nov 2025 09:02:43 -0800 Subject: [PATCH 05/10] Frank is looking into test failures --- lib/include/public/Version.hpp | 6 +++--- lib/modules | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/include/public/Version.hpp b/lib/include/public/Version.hpp index 2cc64ca75..f64002010 100644 --- a/lib/include/public/Version.hpp +++ b/lib/include/public/Version.hpp @@ -6,8 +6,8 @@ #define MAT_VERSION_HPP // WARNING: DO NOT MODIFY THIS FILE! // This file has been automatically generated, manual changes will be lost. -#define BUILD_VERSION_STR "3.9.313.1" -#define BUILD_VERSION 3,9,313,1 +#define BUILD_VERSION_STR "3.9.314.1" +#define BUILD_VERSION 3,9,314,1 #ifndef RESOURCE_COMPILER_INVOKED #include "ctmacros.hpp" @@ -18,7 +18,7 @@ namespace MAT_NS_BEGIN { uint64_t const Version = ((uint64_t)3 << 48) | ((uint64_t)9 << 32) | - ((uint64_t)313 << 16) | + ((uint64_t)314 << 16) | ((uint64_t)1); } MAT_NS_END diff --git a/lib/modules b/lib/modules index 331d9fee5..3358a826a 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 331d9fee589ed01fe4a7710ef1b0c5f03dd28547 +Subproject commit 3358a826a9ca2cf8727510ec0c5a20011047d565 From 987d9be75878b5d19a3bd1cf94dd752a69fdd3c4 Mon Sep 17 00:00:00 2001 From: npaine Date: Tue, 11 Nov 2025 09:36:48 -0800 Subject: [PATCH 06/10] Updated wrappers with more comments --- .../microsoft/applications/events/Sanitizer.java | 15 ++++++++++++--- lib/include/public/Version.hpp | 6 +++--- lib/jni/Sanitizer_jni.cpp | 6 +++++- lib/modules | 2 +- wrappers/obj-c/ODWLogger.h | 4 +++- wrappers/obj-c/ODWSanitizer.mm | 6 +++--- wrappers/obj-c/ODWSanitizerInitConfig.h | 6 ++++++ wrappers/obj-c/ODWSanitizerInitConfig.mm | 1 + 8 files changed, 34 insertions(+), 12 deletions(-) diff --git a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java index 16c24a234..e7a70c817 100644 --- a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java +++ b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java @@ -19,7 +19,14 @@ public class Sanitizer { /** * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) * @return true if initialization was successful, false otherwise. */ - private static native boolean nativeInitialize(long loggerNativePtr, String notificationEventName, boolean enforceSanitization, String[] urlDomains, String[] emailDomains, int analyzerOptions); /** + private static native boolean nativeInitialize(long loggerNativePtr, + String notificationEventName, + boolean enforceSanitization, + String[] urlDomains, + String[] emailDomains, + int analyzerOptions, + int sendConcernLimit); + /** * Initializes the sanitizer with the provided configuration. * * @param config The configuration settings used to initialize a sanitizer. @@ -30,10 +37,11 @@ public class Sanitizer { /** * 1 = SitePathStrict (enables strict site path analysis) * 2 = SitePathLoose (enables loose site path analysis) * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) + * @param sendConcernLimit Maximum number of concerns to send. 0 = no concerns sent, 65536+ = all concerns sent. * @return true if initialization succeeds, false otherwise. * @throws IllegalArgumentException if config or any required field is null or invalid. */ - public static boolean initialize(SanitizerConfiguration config, String[] urlDomains, String[] emailDomains, int analyzerOptions) { + public static boolean initialize(SanitizerConfiguration config, String[] urlDomains, String[] emailDomains, int analyzerOptions, int sendConcernLimit) { // Validate that the configuration object is not null if(config == null) { @@ -56,7 +64,8 @@ public static boolean initialize(SanitizerConfiguration config, String[] urlDoma config.isEnforceSanitization(), urlDomains, emailDomains, - analyzerOptions); + analyzerOptions, + sendConcernLimit); } /** diff --git a/lib/include/public/Version.hpp b/lib/include/public/Version.hpp index f64002010..045603915 100644 --- a/lib/include/public/Version.hpp +++ b/lib/include/public/Version.hpp @@ -6,8 +6,8 @@ #define MAT_VERSION_HPP // WARNING: DO NOT MODIFY THIS FILE! // This file has been automatically generated, manual changes will be lost. -#define BUILD_VERSION_STR "3.9.314.1" -#define BUILD_VERSION 3,9,314,1 +#define BUILD_VERSION_STR "3.9.315.1" +#define BUILD_VERSION 3,9,315,1 #ifndef RESOURCE_COMPILER_INVOKED #include "ctmacros.hpp" @@ -18,7 +18,7 @@ namespace MAT_NS_BEGIN { uint64_t const Version = ((uint64_t)3 << 48) | ((uint64_t)9 << 32) | - ((uint64_t)314 << 16) | + ((uint64_t)315 << 16) | ((uint64_t)1); } MAT_NS_END diff --git a/lib/jni/Sanitizer_jni.cpp b/lib/jni/Sanitizer_jni.cpp index 6d16e2949..cf8425228 100644 --- a/lib/jni/Sanitizer_jni.cpp +++ b/lib/jni/Sanitizer_jni.cpp @@ -32,7 +32,9 @@ Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( jboolean warningsToSanitization, jobjectArray urlDomains, jobjectArray emailDomains, - jint analyzerOptions) { + jint analyzerOptions, + jint sendConcernLimit // number of concerns to upload. Set to 0 to upload none, greather than 65536 uploads everything. + ) { if (spSanitizer != nullptr) { return false; @@ -65,6 +67,8 @@ Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( SanitizerConfiguration sanitizerConfig(reinterpret_cast(iLoggerNativePtr), urlDomainsVec, emailDomainsVec, static_cast(analyzerOptions)); + sanitizerConfig.SendConcernLimit = sendConcernLimit; + if (notificationEventName != nullptr) { sanitizerConfig.NotificationEventName = JStringToStdString(env, notificationEventName); } diff --git a/lib/modules b/lib/modules index 3358a826a..7d7102508 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 3358a826a9ca2cf8727510ec0c5a20011047d565 +Subproject commit 7d71025086c871d9aa7c6431ac90a38776f897d7 diff --git a/wrappers/obj-c/ODWLogger.h b/wrappers/obj-c/ODWLogger.h index 3b168012c..ea0c32fad 100644 --- a/wrappers/obj-c/ODWLogger.h +++ b/wrappers/obj-c/ODWLogger.h @@ -136,7 +136,9 @@ typedef NS_ENUM(NSInteger, ODWSessionState) /*! @brief Initialize the Sanitizer component with domain allow lists. - @param initConfigObject An instance of ODWSanitizerInitConfig that contains the configuration settings for the Sanitizer component. + @param initConfigObject An instance of ODWSanitizerInitConfig that contains the configuration settings for the Sanitizer component. +There is a property on initConfigObject named "SendConcernLimit" that controls the maximum number of concerns uploaded. If set to 0, no concerns are uploaded. +If set to 65536 or higher all concerns are uploaded. For n between 0 and 65536, n concerns are uploaded. This number cannot be changed after process start. @param urlDomains Array of URL domains to allow (can be nil for empty list). @param emailDomains Array of email domains to allow (can be nil for empty list). @param analyzerOptions Analyzer options flags (bitwise OR of values): diff --git a/wrappers/obj-c/ODWSanitizer.mm b/wrappers/obj-c/ODWSanitizer.mm index d02044854..654298b8b 100644 --- a/wrappers/obj-c/ODWSanitizer.mm +++ b/wrappers/obj-c/ODWSanitizer.mm @@ -24,8 +24,7 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani if (_sanitizerPtr != nullptr) { return; - } - + } std::vector urlDomains; std::vector emailDomains; SanitizerConfiguration config(logger, urlDomains, emailDomains, 0); @@ -35,6 +34,7 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani config.NotificationEventName = [[initConfigObject notificationEventName] UTF8String]; } config.SetAllWarningsToSanitizations = initConfigObject.setWarningsToSanitization; + config.SendConcernLimit = static_cast(initConfigObject.sendConcernLimit); _sanitizerPtr = std::make_shared(config); LogManager::GetInstance()->SetDataInspector(_sanitizerPtr); @@ -65,7 +65,6 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani emailDomainsVec.push_back([domain UTF8String]); } } - SanitizerConfiguration config(logger, urlDomainsVec, emailDomainsVec, static_cast(analyzerOptions)); if ([initConfigObject notificationEventName] != nil) @@ -73,6 +72,7 @@ +(void)initializeSanitizer:(ILogger *)logger withODWSanitizerInitConfig:(ODWSani config.NotificationEventName = [[initConfigObject notificationEventName] UTF8String]; } config.SetAllWarningsToSanitizations = initConfigObject.setWarningsToSanitization; + config.SendConcernLimit = static_cast(initConfigObject.sendConcernLimit); _sanitizerPtr = std::make_shared(config); LogManager::GetInstance()->SetDataInspector(_sanitizerPtr); diff --git a/wrappers/obj-c/ODWSanitizerInitConfig.h b/wrappers/obj-c/ODWSanitizerInitConfig.h index 6872db0c9..2306ca033 100644 --- a/wrappers/obj-c/ODWSanitizerInitConfig.h +++ b/wrappers/obj-c/ODWSanitizerInitConfig.h @@ -20,6 +20,12 @@ NS_ASSUME_NONNULL_BEGIN */ @property(readwrite, nonatomic) BOOL setWarningsToSanitization; +/*! + @brief (OPTIONAL) Total amount of SendConcerns that can be emitted. If set to 0 no concerns will be uploaded. + If set to 65536 or higher all concerns will be uploaded. Default value is `65536`. + */ +@property(readwrite, nonatomic) NSUInteger sendConcernLimit; + // Initializer - (instancetype)init; diff --git a/wrappers/obj-c/ODWSanitizerInitConfig.mm b/wrappers/obj-c/ODWSanitizerInitConfig.mm index d9bccb615..f3f668a97 100644 --- a/wrappers/obj-c/ODWSanitizerInitConfig.mm +++ b/wrappers/obj-c/ODWSanitizerInitConfig.mm @@ -15,6 +15,7 @@ - (instancetype)init { if (self) { _notificationEventName = @"SanitizerConcerns"; // Default event name _setWarningsToSanitization = YES; // Default to true + _sendConcernLimit = 65536; // Default to 65536 (upload all concerns) } return self; } From 0e2d6fe018998f4d13a91e4ae2177b61ea563d74 Mon Sep 17 00:00:00 2001 From: npaine Date: Tue, 11 Nov 2025 13:22:29 -0800 Subject: [PATCH 07/10] Removing old overloads --- .../main/java/com/microsoft/applications/events/Sanitizer.java | 3 ++- lib/modules | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java index e7a70c817..afe3e127a 100644 --- a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java +++ b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java @@ -4,7 +4,8 @@ // package com.microsoft.applications.events; -public class Sanitizer { /** +public class Sanitizer { + /** * Initializes the sanitizer with the given logger pointer and optional notification event name. * * @param loggerNativePtr Native pointer to ILogger. diff --git a/lib/modules b/lib/modules index 7d7102508..37303124f 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 7d71025086c871d9aa7c6431ac90a38776f897d7 +Subproject commit 37303124f80d12eb6bbe6e13e3c551e2191b3933 From 3065924e566fe0d4fa45e0d962a35b7ca67f3146 Mon Sep 17 00:00:00 2001 From: npaine Date: Wed, 12 Nov 2025 13:21:23 -0800 Subject: [PATCH 08/10] Updating based on feedback --- lib/include/public/Version.hpp | 6 +++--- lib/modules | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/include/public/Version.hpp b/lib/include/public/Version.hpp index 8d3ba5285..c58e45315 100644 --- a/lib/include/public/Version.hpp +++ b/lib/include/public/Version.hpp @@ -6,8 +6,8 @@ #define MAT_VERSION_HPP // WARNING: DO NOT MODIFY THIS FILE! // This file has been automatically generated, manual changes will be lost. -#define BUILD_VERSION_STR "3.9.309.1" -#define BUILD_VERSION 3,9,309,1 +#define BUILD_VERSION_STR "3.9.316.1" +#define BUILD_VERSION 3,9,316,1 #ifndef RESOURCE_COMPILER_INVOKED #include "ctmacros.hpp" @@ -18,7 +18,7 @@ namespace MAT_NS_BEGIN { uint64_t const Version = ((uint64_t)3 << 48) | ((uint64_t)9 << 32) | - ((uint64_t)309 << 16) | + ((uint64_t)316 << 16) | ((uint64_t)1); } MAT_NS_END diff --git a/lib/modules b/lib/modules index 37303124f..3231e85f1 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 37303124f80d12eb6bbe6e13e3c551e2191b3933 +Subproject commit 3231e85f1ddd5e2a7b07c480d3998aeef789346a From b3a90369a10f1144a9933f5e3fa767ca82086261 Mon Sep 17 00:00:00 2001 From: npaine Date: Fri, 14 Nov 2025 14:11:21 -0800 Subject: [PATCH 09/10] Added SitePathLoose --- .../applications/events/Sanitizer.java | 4 ++-- lib/include/public/Version.hpp | 6 ++--- lib/jni/Sanitizer_jni.cpp | 23 +++++++++++++++---- lib/modules | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java index afe3e127a..6b40fb162 100644 --- a/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java +++ b/lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/Sanitizer.java @@ -14,7 +14,7 @@ public class Sanitizer { * @param urlDomains Array of URL domains to allow. * @param emailDomains Array of email domains to allow. * @param analyzerOptions Analyzer options flags (bitwise OR of values): - * 0 = None (default - no special analyzer behaviors) + * 0 = None (default - no special analyzer behaviors). SitePathLoose is the default behavior. * 1 = SitePathStrict (enables strict site path analysis) * 2 = SitePathLoose (enables loose site path analysis) * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) @@ -34,7 +34,7 @@ private static native boolean nativeInitialize(long loggerNativePtr, * @param urlDomains Array of URL domains to allow (can be null for empty list). * @param emailDomains Array of email domains to allow (can be null for empty list). * @param analyzerOptions Analyzer options flags (bitwise OR of values): - * 0 = None (default - no special analyzer behaviors) + * 0 = None (default - no special analyzer behaviors). SitePathLoose is the default behavior. * 1 = SitePathStrict (enables strict site path analysis) * 2 = SitePathLoose (enables loose site path analysis) * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) diff --git a/lib/include/public/Version.hpp b/lib/include/public/Version.hpp index c58e45315..631c28975 100644 --- a/lib/include/public/Version.hpp +++ b/lib/include/public/Version.hpp @@ -6,8 +6,8 @@ #define MAT_VERSION_HPP // WARNING: DO NOT MODIFY THIS FILE! // This file has been automatically generated, manual changes will be lost. -#define BUILD_VERSION_STR "3.9.316.1" -#define BUILD_VERSION 3,9,316,1 +#define BUILD_VERSION_STR "3.9.318.1" +#define BUILD_VERSION 3,9,318,1 #ifndef RESOURCE_COMPILER_INVOKED #include "ctmacros.hpp" @@ -18,7 +18,7 @@ namespace MAT_NS_BEGIN { uint64_t const Version = ((uint64_t)3 << 48) | ((uint64_t)9 << 32) | - ((uint64_t)316 << 16) | + ((uint64_t)318 << 16) | ((uint64_t)1); } MAT_NS_END diff --git a/lib/jni/Sanitizer_jni.cpp b/lib/jni/Sanitizer_jni.cpp index cf8425228..d4e29c2b4 100644 --- a/lib/jni/Sanitizer_jni.cpp +++ b/lib/jni/Sanitizer_jni.cpp @@ -23,9 +23,24 @@ Java_com_microsoft_applications_events_Sanitizer_isInitialized(const JNIEnv *env return spSanitizer != nullptr; } -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( + /** + * Initializes the sanitizer with the provided configuration. + * + * @param iLoggerNativePtr Native pointer to the ILogger instance. + * @param notificationEventName Name of the event to log sanitizer concerns. + * @param warningsToSanitization If true, all warnings are treated as sanitizations. + * @param urlDomains Array of URL domains to allow (can be null for empty list). + * @param emailDomains Array of email domains to allow (can be null for empty list). + * @param analyzerOptions Analyzer options flags (bitwise OR of values): + * 0 = None (default - no special analyzer behaviors). SitePathLoose is the default behavior. + * 1 = SitePathStrict (enables strict site path analysis) + * 2 = SitePathLoose (enables loose site path analysis) + * Multiple flags can be combined with bitwise OR (e.g., 1 | 2 = 3) + * @param sendConcernLimit Maximum number of concerns to send. 0 = no concerns sent, 65536+ = all concerns sent. + * **/ + extern "C" + JNIEXPORT jboolean JNICALL + Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( JNIEnv *env, jclass /* this */, jlong iLoggerNativePtr, jstring notificationEventName, @@ -33,7 +48,7 @@ Java_com_microsoft_applications_events_Sanitizer_nativeInitialize( jobjectArray urlDomains, jobjectArray emailDomains, jint analyzerOptions, - jint sendConcernLimit // number of concerns to upload. Set to 0 to upload none, greather than 65536 uploads everything. + jint sendConcernLimit // number of concerns to upload. Set to 0 to upload none, greater than 65536 uploads everything. ) { if (spSanitizer != nullptr) { diff --git a/lib/modules b/lib/modules index 3231e85f1..1cbb9ab96 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 3231e85f1ddd5e2a7b07c480d3998aeef789346a +Subproject commit 1cbb9ab969fc0dcda3d191023086f3d52b1c3fd2 From adfe7845995be40df83a0c205ccd2a6a394cf04a Mon Sep 17 00:00:00 2001 From: fmarasco Date: Tue, 18 Nov 2025 10:39:53 -0500 Subject: [PATCH 10/10] update submodule --- lib/modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules b/lib/modules index 1cbb9ab96..f29b7f59f 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 1cbb9ab969fc0dcda3d191023086f3d52b1c3fd2 +Subproject commit f29b7f59f8f520d99b93eb1d048a8b2fdf634d45