66// Copyright (c) 2013-2018 Adjust GmbH. All rights reserved.
77//
88
9+ #include < string.h>
10+
911#import " ADJUtil.h"
1012#import " ADJAttribution.h"
1113#import " ADJAdjustFactory.h"
@@ -295,28 +297,40 @@ - (void)signWithSigV2Plugin:(ADJActivityPackage *)activityPackage {
295297 if (signerClass == nil ) {
296298 return ;
297299 }
298-
299300 SEL signSEL = NSSelectorFromString (@" sign:withActivityKind:withSdkVersion:" );
300301 if (![signerClass respondsToSelector: signSEL]) {
301302 return ;
302303 }
303304
304- NSMutableDictionary * parameters = activityPackage.parameters ;
305- const char * activityKindChar = [[ADJActivityKindUtil activityKindToString: activityPackage.activityKind] UTF8String ];
306- const char * sdkVersionChar = [activityPackage.clientSdk UTF8String ];
305+ NSMutableDictionary *parameters = activityPackage.parameters ;
306+ const char *activityKindChar = [[ADJActivityKindUtil activityKindToString: activityPackage.activityKind] UTF8String ];
307+ const char *sdkVersionChar = [activityPackage.clientSdk UTF8String ];
308+
309+ // Stack allocated strings to ensure their lifetime stays until the next iteration
310+ static char activityKind[51 ], sdkVersion[21 ];
311+ strncpy (activityKind, activityKindChar, strlen (activityKindChar) + 1 );
312+ strncpy (sdkVersion, sdkVersionChar, strlen (sdkVersionChar) + 1 );
313+
314+ // NSInvocation setArgument requires lvalue references with exact matching types to the executed function signature.
315+ // With this usage we ensure that the lifetime of the object remains until the next iteration, as it points to the
316+ // stack allocated string where we copied the buffer.
317+ const char *lvalActivityKind = activityKind;
318+ const char *lvalSdkVersion = sdkVersion;
319+
307320 /*
308321 [ADJSigner sign:parameters
309- withActivityKind:activityKindChar
310- withSdkVersion:sdkVersionChar];
322+ withActivityKind:activityKindChar
323+ withSdkVersion:sdkVersionChar];
311324 */
325+
312326 NSMethodSignature *signMethodSignature = [signerClass methodSignatureForSelector: signSEL];
313327 NSInvocation *signInvocation = [NSInvocation invocationWithMethodSignature: signMethodSignature];
314- [signInvocation setSelector: signSEL];
328+ [signInvocation setSelector: signSEL];
315329 [signInvocation setTarget: signerClass];
316330
317- [signInvocation setArgument: ¶meters atIndex: 2 ];
318- [signInvocation setArgument: &activityKindChar atIndex: 3 ];
319- [signInvocation setArgument: &sdkVersionChar atIndex: 4 ];
331+ [signInvocation setArgument: ¶meters atIndex: 2 ];
332+ [signInvocation setArgument: &lvalActivityKind atIndex: 3 ];
333+ [signInvocation setArgument: &lvalSdkVersion atIndex: 4 ];
320334
321335 [signInvocation invoke ];
322336
@@ -325,17 +339,14 @@ - (void)signWithSigV2Plugin:(ADJActivityPackage *)activityPackage {
325339 return ;
326340 }
327341 /*
328- NSString *signerVersion = [ADJSigner getVersion];
342+ NSString *signerVersion = [ADJSigner getVersion];
329343 */
330344 IMP getVersionIMP = [signerClass methodForSelector: getVersionSEL];
331345 if (!getVersionIMP) {
332346 return ;
333347 }
334-
335348 id (*getVersionFunc)(id , SEL ) = (void *)getVersionIMP;
336-
337349 id signerVersion = getVersionFunc (signerClass, getVersionSEL);
338-
339350 if (![signerVersion isKindOfClass: [NSString class ]]) {
340351 return ;
341352 }
@@ -344,7 +355,6 @@ - (void)signWithSigV2Plugin:(ADJActivityPackage *)activityPackage {
344355 [ADJPackageBuilder parameters: parameters
345356 setString: signerVersionString
346357 forKey: @" native_version" ];
347-
348358}
349359
350360- (NSMutableDictionary *)getSessionParameters : (BOOL )isInDelay {
@@ -364,9 +374,7 @@ - (NSMutableDictionary *)getSessionParameters:(BOOL)isInDelay {
364374 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
365375 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
366376 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
367- if (self.adjustConfig .allowIdfaReading == YES ) {
368- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
369- }
377+ [self addIdfaIfPossibleToParameters: parameters];
370378 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
371379 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
372380 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -431,9 +439,7 @@ - (NSMutableDictionary *)getEventParameters:(BOOL)isInDelay forEventPackage:(ADJ
431439 [ADJPackageBuilder parameters: parameters setString: event.eventToken forKey: @" event_token" ];
432440 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
433441 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
434- if (self.adjustConfig .allowIdfaReading == YES ) {
435- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
436- }
442+ [self addIdfaIfPossibleToParameters: parameters];
437443 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
438444 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
439445 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -518,9 +524,7 @@ - (NSMutableDictionary *)getInfoParameters:(NSString *)source {
518524 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
519525 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
520526 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
521- if (self.adjustConfig .allowIdfaReading == YES ) {
522- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
523- }
527+ [self addIdfaIfPossibleToParameters: parameters];
524528 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
525529 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
526530 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -589,9 +593,7 @@ - (NSMutableDictionary *)getAdRevenueParameters:(NSString *)source payload:(NSDa
589593 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
590594 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
591595 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
592- if (self.adjustConfig .allowIdfaReading == YES ) {
593- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
594- }
596+ [self addIdfaIfPossibleToParameters: parameters];
595597 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
596598 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
597599 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -651,9 +653,7 @@ - (NSMutableDictionary *)getAdRevenueParameters:(ADJAdRevenue *)adRevenue isInDe
651653 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
652654 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
653655 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
654- if (self.adjustConfig .allowIdfaReading == YES ) {
655- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
656- }
656+ [self addIdfaIfPossibleToParameters: parameters];
657657 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
658658 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
659659 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -735,9 +735,7 @@ - (NSMutableDictionary *)getClickParameters:(NSString *)source {
735735 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
736736 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
737737 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
738- if (self.adjustConfig .allowIdfaReading == YES ) {
739- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
740- }
738+ [self addIdfaIfPossibleToParameters: parameters];
741739 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
742740 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
743741 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -804,9 +802,7 @@ - (NSMutableDictionary *)getAttributionParameters:(NSString *)initiatedBy {
804802 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.environment forKey: @" environment" ];
805803 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
806804 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
807- if (self.adjustConfig .allowIdfaReading == YES ) {
808- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
809- }
805+ [self addIdfaIfPossibleToParameters: parameters];
810806 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
811807 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
812808 [ADJPackageBuilder parameters: parameters setString: initiatedBy forKey: @" initiated_by" ];
@@ -857,9 +853,7 @@ - (NSMutableDictionary *)getGdprParameters {
857853 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.environment forKey: @" environment" ];
858854 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
859855 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
860- if (self.adjustConfig .allowIdfaReading == YES ) {
861- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
862- }
856+ [self addIdfaIfPossibleToParameters: parameters];
863857 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
864858 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
865859 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -915,9 +909,7 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters {
915909 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
916910 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
917911 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
918- if (self.adjustConfig .allowIdfaReading == YES ) {
919- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
920- }
912+ [self addIdfaIfPossibleToParameters: parameters];
921913 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
922914 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
923915 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -982,9 +974,7 @@ - (NSMutableDictionary *)getThirdPartySharingParameters:(nonnull ADJThirdPartySh
982974 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
983975 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
984976 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
985- if (self.adjustConfig .allowIdfaReading == YES ) {
986- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
987- }
977+ [self addIdfaIfPossibleToParameters: parameters];
988978 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
989979 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
990980 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -1055,9 +1045,7 @@ - (NSMutableDictionary *)getMeasurementConsentParameters:(BOOL)enabled {
10551045 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
10561046 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
10571047 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
1058- if (self.adjustConfig .allowIdfaReading == YES ) {
1059- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
1060- }
1048+ [self addIdfaIfPossibleToParameters: parameters];
10611049 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
10621050 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
10631051 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -1119,9 +1107,7 @@ - (NSMutableDictionary *)getSubscriptionParameters:(BOOL)isInDelay forSubscripti
11191107 [ADJPackageBuilder parameters: parameters setBool: self .adjustConfig.eventBufferingEnabled forKey: @" event_buffering_enabled" ];
11201108 [ADJPackageBuilder parameters: parameters setString: self .adjustConfig.externalDeviceId forKey: @" external_device_id" ];
11211109 [ADJPackageBuilder parameters: parameters setString: self .packageParams.fbAnonymousId forKey: @" fb_anon_id" ];
1122- if (self.adjustConfig .allowIdfaReading == YES ) {
1123- [ADJPackageBuilder parameters: parameters setString: [ADJUtil idfa ] forKey: @" idfa" ];
1124- }
1110+ [self addIdfaIfPossibleToParameters: parameters];
11251111 [ADJPackageBuilder parameters: parameters setString: self .packageParams.idfv forKey: @" idfv" ];
11261112 [ADJPackageBuilder parameters: parameters setString: self .packageParams.installedAt forKey: @" installed_at" ];
11271113 [ADJPackageBuilder parameters: parameters setBool: YES forKey: @" needs_response_details" ];
@@ -1181,6 +1167,23 @@ - (NSMutableDictionary *)getSubscriptionParameters:(BOOL)isInDelay forSubscripti
11811167 return parameters;
11821168}
11831169
1170+ - (void )addIdfaIfPossibleToParameters : (NSMutableDictionary *)parameters {
1171+ if (! self.adjustConfig .allowIdfaReading ) {
1172+ return ;
1173+ }
1174+
1175+ NSString *idfa = [ADJUtil idfa ];
1176+
1177+ if (idfa == nil
1178+ || idfa.length == 0
1179+ || [idfa isEqualToString: @" 00000000-0000-0000-0000-000000000000" ])
1180+ {
1181+ return ;
1182+ }
1183+
1184+ [ADJPackageBuilder parameters: parameters setString: idfa forKey: @" idfa" ];
1185+ }
1186+
11841187- (ADJActivityPackage *)defaultActivityPackage {
11851188 ADJActivityPackage *activityPackage = [[ADJActivityPackage alloc ] init ];
11861189 activityPackage.clientSdk = self.packageParams .clientSdk ;
0 commit comments