Hi Quincey,

I am unable to reproduce your exception. Is this something related to swift 
interoperability? In pure objective-c environments it seems to work fine, that 
is, securely decode without an exception!

- Michael

> On 15 Feb 2016, at 12:43, Dave <d...@looktowindward.com> wrote:
> 
> Hi Quincey,
> 
> Thank you so much for the "heads-up" on this, I will be changing my App to 
> use Secure Coding in the new future and it’s littered with NSArrays and 
> NSDictionary properties. 
> 
> Do you know if same thing applies to dictionaries as well as arrays?
> 
> All the Best
> Dave
> 
>> On 14 Feb 2016, at 08:45, Quincey Morris 
>> <quinceymor...@rivergatesoftware.com> wrote:
>> 
>> I might be late to this party, but since I just spent hours on it, I’ll 
>> document this for anyone who hasn’t run into it yet.
>> 
>> If you’re using NSSecureCoding, there’s a problem decoding NSArray objects. 
>> You can’t use this:
>> 
>>      myArray = [coder decodeObjectForKey: @“myArray”];
>> 
>> and you can’t use this:
>> 
>>      myArray = [coder decodeObjectOfClass: [NSArray class] forKey: 
>> @“myArray”];
>> 
>> The error message in the resulting exception won’t be very helpful, but it 
>> means that the class of the array elements is invalid. What you actually 
>> need to do is this:
>> 
>>      myArray = [coder decodeObjectOfClasses: [NSSet setWithObjects: [NSArray 
>> class], [MyElementClass class], nil] forKey: @“myArray”];
>> 
>> Besides being obscure, this is also semantically incorrect, in that it 
>> appears to allow decoding of objects that are not strictly arrays of 
>> MyElementClass objects. (I guess this is not a security violation, since it 
>> doesn’t permit an attack to substitute objects of arbitrary classes, but it 
>> sure is annoying.]
>> 
>> Now, if you want to do this in Swift, you might be tempted to try the 
>> obvious translation:
>> 
>>      let classes = Set<AnyClass> (arrayLiteral: [… anything here… ])
>>      let myArray = coder.decodeObjectOfClasses (classes, forKey: “myArray”)
>> 
>> but that won’t work because AnyClass isn’t Hashable. So you might try (well, 
>> I tried) something like this:
>> 
>>      let classes = Set<NSObject> (arrayLiteral: [NSArray.self, 
>> MyElementClass.self])
>>      let myArray = coder.decodeObjectOfClasses (classes, forKey: “myArray”)
>> 
>> This compiles, but it fails at run-time, with a message saying it found an 
>> object of class ‘NSArray’, but only objects of classes ‘NSArray’ and 
>> ‘MyElementClass’ are allowed. (!)
>> 
>> The solution is to fall back to an explicit NSSet object:
>> 
>>      let classes = NSSet (objects: NSArray.self, MyElementClass.self)
>>      let myArray = coder.decodeObjectOfClasses (classes, forKey: “myArray”)
>> 
>> There really needs to be (radar #24646135) API to decode a NSArray and 
>> specify the class (or classes) of the elements. In Obj-C, something like:
>> 
>>      myArray = [coder decodeArrayWithObjectsOfClass: [MyElementClass class] 
>> forKey: @“myArray”];
>> 
>> or in Swift:
>> 
>>      let myArray = coder.decodeArrayWithObjectsOfClass (MyElementClass.self, 
>> forKey: “myArray”)
>> 
>> This would be particular useful in Swift, because it would give you 
>> compile-time checking of the types in the assignment. (There is already a 
>> Swift-only version of ‘decodeObjectOfClass’ that’s generic, so you get  the 
>> “correct” return type.)
>> 
>> 
>> 
>> _______________________________________________
>> 
>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>> 
>> Please do not post admin requests or moderator comments to the list.
>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>> 
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/cocoa-dev/dave%40looktowindward.com
>> 
>> This email sent to d...@looktowindward.com
> 
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/cocoa-dev/michael.starke%40hicknhack-software.com
> 
> This email sent to michael.sta...@hicknhack-software.com


___m i c h a e l   s t a r k e____ 
       geschäftsführer
       HicknHack Software GmbH
       www.hicknhack-software.com
       
___k o n t a k t____
       +49 (170) 3686136
       cont...@hicknhack.com
       
___H i c k n H a c k   S o f t w a r e   G m b H____
       geschäftsführer - maik lathan | andreas reischuck | michael starke
       bayreuther straße 32
       01187 dresden
       amtsgericht dresden HRB 30351
       sitz - dresden


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to