Revision: 29790
          http://sourceforge.net/p/bibdesk/svn/29790
Author:   hofman
Date:     2025-11-13 17:43:52 +0000 (Thu, 13 Nov 2025)
Log Message:
-----------
Need to declare item classes for secure decoding of array or dictionary

Modified Paths:
--------------
    trunk/bibdesk/BDSKCategoryGroup.m
    trunk/bibdesk/BDSKComplexString.m
    trunk/bibdesk/BDSKExternalGroup.m
    trunk/bibdesk/BDSKFileSearchIndex.m
    trunk/bibdesk/BDSKFilter.m
    trunk/bibdesk/BDSKLinkedFile.m
    trunk/bibdesk/BDSKParentGroup.m
    trunk/bibdesk/BDSKScriptGroup.m
    trunk/bibdesk/BDSKSearchGroup.m
    trunk/bibdesk/BDSKServerInfo.m
    trunk/bibdesk/BDSKSharedGroup.m
    trunk/bibdesk/BDSKSmartGroup.m
    trunk/bibdesk/BDSKStaticGroup.m
    trunk/bibdesk/BDSKTreeNode.m
    trunk/bibdesk/BDSKURLGroup.m
    trunk/bibdesk/BibAuthor.m
    trunk/bibdesk/BibDocument.m
    trunk/bibdesk/BibItem.m

Modified: trunk/bibdesk/BDSKCategoryGroup.m
===================================================================
--- trunk/bibdesk/BDSKCategoryGroup.m   2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKCategoryGroup.m   2025-11-13 17:43:52 UTC (rev 29790)
@@ -94,6 +94,8 @@
     [coder encodeObject:key forKey:@"key"];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
        return [[[self class] alloc] initWithName:name key:key];
 }

Modified: trunk/bibdesk/BDSKComplexString.m
===================================================================
--- trunk/bibdesk/BDSKComplexString.m   2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKComplexString.m   2025-11-13 17:43:52 UTC (rev 29790)
@@ -367,7 +367,7 @@
         self = [super init];
         if (self) {
             BDSKASSERT([coder isKindOfClass:[NSKeyedUnarchiver class]]);
-            nodes = [coder decodeObjectOfClass:[NSArray class] 
forKey:@"nodes"];
+            nodes = [coder decodeObjectOfClasses:[NSSet 
setWithObjects:[NSArray class], [BDSKStringNode class], nil] forKey:@"nodes"];
             isComplex = [coder decodeBoolForKey:@"complex"];
             isInherited = [coder decodeBoolForKey:@"inherited"];
             macroResolver = [[self class] macroResolverForUnarchiving];
@@ -376,7 +376,7 @@
             defaultModification = 0;
         }
     } else {
-        self = [NSKeyedUnarchiver unarchiveObjectWithData:[coder 
decodeDataObject]];
+        self = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSString class] 
fromData:[coder decodeDataObject] error:NULL];
     }
     return self;
 }
@@ -392,6 +392,8 @@
     }
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)replacementObjectForPortCoder:(NSPortCoder *)encoder
 {
     return [encoder isByref] ? ((id (*)(id, SEL, id))[NSObject 
instanceMethodForSelector:_cmd])(self, _cmd, encoder) : self;

Modified: trunk/bibdesk/BDSKExternalGroup.m
===================================================================
--- trunk/bibdesk/BDSKExternalGroup.m   2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKExternalGroup.m   2025-11-13 17:43:52 UTC (rev 29790)
@@ -78,6 +78,8 @@
     [super encodeWithCoder:coder];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (void)dealloc {
     // should always be on the main thread, see BibDocument, but be sure
     BDSKENSURE_MAIN_THREAD(

Modified: trunk/bibdesk/BDSKFileSearchIndex.m
===================================================================
--- trunk/bibdesk/BDSKFileSearchIndex.m 2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKFileSearchIndex.m 2025-11-13 17:43:52 UTC (rev 29790)
@@ -500,7 +500,7 @@
         if (indexData != NULL) {
             tmpIndex = SKIndexOpenWithMutableData((__bridge 
CFMutableDataRef)indexData, NULL);
             if (tmpIndex) {
-                [signatures setDictionary:[unarchiver 
decodeObjectOfClass:[NSDictionary class] forKey:@"signatures"]];
+                [signatures setDictionary:[unarchiver 
decodeObjectOfClasses:[NSSet setWithObjects:[NSDictionary class], [NSString 
class], [NSData class], [NSData class], nil] forKey:@"signatures"]];
             } else {
                 indexData = nil;
             }

Modified: trunk/bibdesk/BDSKFilter.m
===================================================================
--- trunk/bibdesk/BDSKFilter.m  2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKFilter.m  2025-11-13 17:43:52 UTC (rev 29790)
@@ -84,7 +84,7 @@
 - (instancetype)initWithCoder:(NSCoder *)decoder {
     self = [super init];
     if (self) {
-        conditions = [[NSMutableArray alloc] initWithArray:[decoder 
decodeObjectOfClass:[NSArray class] forKey:@"conditions"]];
+        conditions = [[NSMutableArray alloc] initWithArray:[decoder 
decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [BDSKCondition 
class], nil] forKey:@"conditions"]];
                conjunction = [decoder decodeIntegerForKey:@"conjunction"];
                group = nil;
        }

Modified: trunk/bibdesk/BDSKLinkedFile.m
===================================================================
--- trunk/bibdesk/BDSKLinkedFile.m      2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKLinkedFile.m      2025-11-13 17:43:52 UTC (rev 29790)
@@ -406,6 +406,8 @@
     }
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 // always encode subclasses as BDSKLinkedAliasFile
 - (Class)classForKeyedArchiver { return BDSKLinkedAliasFileClass; }
 - (Class)classForArchiver { return BDSKLinkedAliasFileClass; }
@@ -1018,6 +1020,8 @@
     }
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (NSURL *)URL {
     return URL;
 }
@@ -1072,7 +1076,7 @@
 static NSDictionary *BDSKDictionaryFromArchivedData(NSData *data) {
     NSDictionary *dictionary = nil;
     @try {
-        dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];
+        dictionary = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet 
setWithObjects:[NSDictionary class], [NSString class], [NSData class], nil] 
fromData:data error:NULL];
     }
     @catch(id exception) {
         NSLog(@"Ignoring exception \"%@\" while unarchiving data from base 64 
string.", exception);

Modified: trunk/bibdesk/BDSKParentGroup.m
===================================================================
--- trunk/bibdesk/BDSKParentGroup.m     2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKParentGroup.m     2025-11-13 17:43:52 UTC (rev 29790)
@@ -78,6 +78,8 @@
     [super encodeWithCoder:coder];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
     BDSKASSERT_NOT_REACHED("Parent groups should never be copied");
        return [[[self class] alloc] initWithName:name];
@@ -352,6 +354,8 @@
     [coder encodeObject:key forKey:@"key"];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (BDSKGroupType)groupType { return BDSKCategoryParentGroupType; }
 
 // category parents aren't unique, so we need to use a different identifier 
for remembering expanded state

Modified: trunk/bibdesk/BDSKScriptGroup.m
===================================================================
--- trunk/bibdesk/BDSKScriptGroup.m     2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKScriptGroup.m     2025-11-13 17:43:52 UTC (rev 29790)
@@ -150,6 +150,8 @@
     [coder encodeInteger:scriptType forKey:@"scriptType"];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
        return [[[self class] alloc] initWithName:name scriptPath:scriptPath 
scriptArguments:scriptArguments scriptType:scriptType];
 }

Modified: trunk/bibdesk/BDSKSearchGroup.m
===================================================================
--- trunk/bibdesk/BDSKSearchGroup.m     2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKSearchGroup.m     2025-11-13 17:43:52 UTC (rev 29790)
@@ -180,6 +180,8 @@
     [coder encodeObject:[self serverInfo] forKey:@"serverInfo"];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
        return [[[self class] alloc] initWithServerInfo:[self serverInfo] 
searchTerm:searchTerm];
 }

Modified: trunk/bibdesk/BDSKServerInfo.m
===================================================================
--- trunk/bibdesk/BDSKServerInfo.m      2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKServerInfo.m      2025-11-13 17:43:52 UTC (rev 29790)
@@ -156,7 +156,7 @@
         if ([self isEntrez] || [self isISI] || [self isDBLP]) {
             host = nil;
             port = nil;
-            options = [[decoder decodeObjectOfClass:[NSDictionary class] 
forKey:OPTIONS_KEY] mutableCopy];
+            options = [[decoder decodeObjectOfClasses:[NSSet 
setWithObjects:[NSDictionary class], [NSString class], nil] forKey:OPTIONS_KEY] 
mutableCopy];
             if ([options count] == 0)
                 options = nil;
             password = [[options objectForKey:PASSWORD_KEY] copy];
@@ -164,7 +164,7 @@
         } else if ([self isZoom] || [self isSRU]) {
             host = [decoder decodeObjectOfClass:[NSString class] 
forKey:HOST_KEY];
             port = [decoder decodeObjectOfClass:[NSString class] 
forKey:PORT_KEY];
-            options = [[decoder decodeObjectOfClass:[NSDictionary class] 
forKey:OPTIONS_KEY] mutableCopy];
+            options = [[decoder decodeObjectOfClasses:[NSSet 
setWithObjects:[NSDictionary class], [NSString class], nil] forKey:OPTIONS_KEY] 
mutableCopy];
             password = [[options objectForKey:PASSWORD_KEY] copy];
             [options removeObjectForKey:PASSWORD_KEY];
         } else {

Modified: trunk/bibdesk/BDSKSharedGroup.m
===================================================================
--- trunk/bibdesk/BDSKSharedGroup.m     2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKSharedGroup.m     2025-11-13 17:43:52 UTC (rev 29790)
@@ -178,9 +178,9 @@
     
     [NSString setMacroResolverForUnarchiving:[self macroResolver]];
     if (pubsArchive)
-        pubs = [NSKeyedUnarchiver unarchiveObjectWithData:pubsArchive];
+        pubs = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet 
setWithObjects:[NSArray class], [BibItem class], nil] fromData:pubsArchive 
error:NULL];
     if (macrosArchive) {
-        NSDictionary *dict = [NSKeyedUnarchiver 
unarchiveObjectWithData:macrosArchive];
+        NSDictionary *dict = [NSKeyedUnarchiver 
unarchivedObjectOfClasses:[NSSet setWithObjects:[NSDictionary class], [NSString 
class], nil] fromData:macrosArchive error:NULL];
         if (dict) {
             macros = [[NSMapTable alloc] 
initWithKeyPointerFunctions:[NSPointerFunctions 
caseInsensitiveStringPointerFunctions] 
valuePointerFunctions:[NSPointerFunctions strongObjectPointerFunctions] 
capacity:0];
             [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString 
*value, BOOL *stop){

Modified: trunk/bibdesk/BDSKSmartGroup.m
===================================================================
--- trunk/bibdesk/BDSKSmartGroup.m      2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKSmartGroup.m      2025-11-13 17:43:52 UTC (rev 29790)
@@ -105,6 +105,8 @@
     [coder encodeObject:filter forKey:@"filter"];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
        return [[[self class] alloc] initWithName:name filter:filter];
 }

Modified: trunk/bibdesk/BDSKStaticGroup.m
===================================================================
--- trunk/bibdesk/BDSKStaticGroup.m     2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKStaticGroup.m     2025-11-13 17:43:52 UTC (rev 29790)
@@ -99,6 +99,8 @@
     return self;
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
        return [[[self class] alloc] initWithName:name 
publications:publications];
 }

Modified: trunk/bibdesk/BDSKTreeNode.m
===================================================================
--- trunk/bibdesk/BDSKTreeNode.m        2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKTreeNode.m        2025-11-13 17:43:52 UTC (rev 29790)
@@ -68,8 +68,8 @@
 - (instancetype)initWithCoder:(NSCoder *)coder;
 {
     if(self = [super init]){
-        children = [[NSMutableArray alloc] initWithArray:[coder 
decodeObjectOfClass:[NSArray class] forKey:@"children"]];
-        columnValues = [[NSMutableDictionary alloc] initWithDictionary:[coder 
decodeObjectOfClass:[NSDictionary class] forKey:@"columnValues"]];
+        children = [[NSMutableArray alloc] initWithArray:[coder 
decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [BDSKTreeNode 
class], nil] forKey:@"children"]];
+        columnValues = [[NSMutableDictionary alloc] initWithDictionary:[coder 
decodeObjectOfClasses:[NSSet setWithObjects:[NSDictionary class], [NSString 
class], [NSNumber class], [NSURL class], [NSData class], nil] 
forKey:@"columnValues"]];
         parent = [coder decodeObjectOfClass:[BDSKTreeNode class] 
forKey:@"parent"];
     }
     return self;

Modified: trunk/bibdesk/BDSKURLGroup.m
===================================================================
--- trunk/bibdesk/BDSKURLGroup.m        2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BDSKURLGroup.m        2025-11-13 17:43:52 UTC (rev 29790)
@@ -114,6 +114,8 @@
     [coder encodeObject:URL forKey:@"URL"];
 }
 
++ (BOOL)supportsSecureCoding { return YES; }
+
 - (id)copyWithZone:(NSZone *)aZone {
        return [[[self class] alloc] initWithName:name URL:URL];
 }

Modified: trunk/bibdesk/BibAuthor.m
===================================================================
--- trunk/bibdesk/BibAuthor.m   2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BibAuthor.m   2025-11-13 17:43:52 UTC (rev 29790)
@@ -125,7 +125,7 @@
         // this should take care of the rest of the ivars
         [self setupNames];
     } else {
-        self = [NSKeyedUnarchiver unarchiveObjectWithData:[coder 
decodeDataObject]];
+        self = [NSKeyedUnarchiver unarchivedObjectOfClass:[BibAuthor class] 
fromData:[coder decodeDataObject] error:NULL];
     }
     return self;
 }

Modified: trunk/bibdesk/BibDocument.m
===================================================================
--- trunk/bibdesk/BibDocument.m 2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BibDocument.m 2025-11-13 17:43:52 UTC (rev 29790)
@@ -555,7 +555,8 @@
     if ([groupData length]) {
         NSSet *allGroups = [NSSet setWithArray:[groups allChildren]];
         NSMutableArray *groupsToSelect = [NSMutableArray array];
-        for (BDSKGroup *group in [NSKeyedUnarchiver 
unarchiveObjectWithData:groupData]) {
+        NSError *e = nil;
+        for (BDSKGroup *group in [NSKeyedUnarchiver 
unarchivedObjectOfClasses:[NSSet setWithObjects:[NSArray class], [BDSKGroup 
class], nil] fromData:groupData error:NULL]) {
             BDSKGroup *currentGroup = [allGroups member:group];
             if (currentGroup)
                 [groupsToSelect addObject:currentGroup];

Modified: trunk/bibdesk/BibItem.m
===================================================================
--- trunk/bibdesk/BibItem.m     2025-11-13 16:52:25 UTC (rev 29789)
+++ trunk/bibdesk/BibItem.m     2025-11-13 17:43:52 UTC (rev 29790)
@@ -278,12 +278,12 @@
 - (instancetype)initWithCoder:(NSCoder *)coder{
     if([coder allowsKeyedCoding]){
         if(self = [super init]){
-            pubFields = [[NSMutableDictionary alloc] initWithDictionary:[coder 
decodeObjectOfClass:[NSDictionary class] forKey:@"pubFields"]];
+            pubFields = [[NSMutableDictionary alloc] initWithDictionary:[coder 
decodeObjectOfClasses:[NSSet setWithObjects:[NSDictionary class], [NSString 
class], nil] forKey:@"pubFields"]];
             [self setCiteKeyString:[coder decodeObjectOfClass:[NSString class] 
forKey:@"citeKey"]];
             [self setPubTypeString:[coder decodeObjectOfClass:[NSString class] 
forKey:@"pubType"]];
             groups = [[NSMutableDictionary alloc] initWithCapacity:5];
             URLs = [[NSMutableDictionary alloc] initWithCapacity:5];
-            files = [[NSMutableArray alloc] initWithArray:[coder 
decodeObjectOfClass:[NSArray class] forKey:@"files"]];
+            files = [[NSMutableArray alloc] initWithArray:[coder 
decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [BDSKLinkedFile 
class], nil] forKey:@"files"]];
             [files setValue:self forKey:@"delegate"];
             // set by the document, which we don't archive
             owner = nil;
@@ -305,7 +305,7 @@
             [self updateMetadataForKey:nil];
         }
     } else {
-        self = [NSKeyedUnarchiver unarchiveObjectWithData:[coder 
decodeDataObject]];
+        self = [NSKeyedUnarchiver unarchivedObjectOfClass:[BibItem class] 
fromData:[coder decodeDataObject] error:NULL];
     }
        return self;
 }
@@ -504,7 +504,7 @@
     
     [NSString setMacroResolverForUnarchiving:aMacroResolver];
     
-    NSArray *pubs = [unarchiver decodeObjectOfClass:[NSArray class] 
forKey:@"publications"];
+    NSArray *pubs = [unarchiver decodeObjectOfClasses:[NSSet 
setWithObjects:[NSArray class], [BibItem class], nil] forKey:@"publications"];
     
     [unarchiver finishDecoding];
     

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to