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