I would look at subclassing CBLModel instead of NSObject, then you can use 
-didLoadFromDocument and -save to do your work.

On Feb 13, 2014, at 1:01 PM, Alan McKean <[email protected]> wrote:

> I don't understand the role of _changedNames, so I'm not sure where the 
> decryption/encryption should occur:
> 
> - (NSDictionary*) currentProperties {
>     NSMutableDictionary* properties = [_document.properties mutableCopy];
> 
>     // decrypt here?
>     if (!properties)
>         properties = [[NSMutableDictionary alloc] init];
>     for (NSString* key in _changedNames)
>         [properties setValue: _properties[key] forKey: key];
> 
>     // or here?
>     return properties;
> }
> 
> - (NSDictionary*) propertiesToSave {
> 
>     // encrypt here?
>     NSMutableDictionary* properties = [_document.properties mutableCopy];
>     if (!properties)
>         properties = [[NSMutableDictionary alloc] init];
>     for (NSString* key in _changedNames) {
>         id value = _properties[key];
>         [properties setValue: [self externalizePropertyValue: value] forKey: 
> key];
>     }
>     [properties setValue: self.attachmentDataToSave forKey: @"_attachments"];
> 
>     // or here?
>     return properties;
> }
> 
> - (NSDictionary*) attachmentDataToSave {
> 
>     // anything to do here?
>     NSDictionary* attachments = (_document.properties).cbl_attachments;
>     if (!_changedAttachments)
>         return attachments;
>     
>     NSMutableDictionary* nuAttach = attachments ? [attachments mutableCopy]
>                                                 : [NSMutableDictionary 
> dictionary];
>     for (NSString* name in _changedAttachments.allKeys) {
>         // Yes, we are putting CBLAttachment objects into the JSON-compatible 
> dictionary.
>         // The CBLDocument will process & convert these before actually 
> storing the JSON.
>         CBLAttachment* attach = _changedAttachments[name];
>         if ([attach isKindOfClass: [CBLAttachment class]])
>             nuAttach[name] = attach;
>         else
>             [nuAttach removeObjectForKey: name];
>     }
>     return nuAttach;
> }
> 
> 
> On Thursday, February 13, 2014 10:24:45 AM UTC-8, Jens Alfke wrote:
> 
> On Feb 13, 2014, at 9:59 AM, Alan McKean <[email protected]> wrote:
> 
>> On another note, I would like an opinion on the decryption/encryption that I 
>> am using. I have a subclass of CBLMode called OTSCBLModel. It overrides 
>> modelForDocument:encrypted: like this:
> 
> (Nit: Technically that's not an override, it's a separate method with a 
> different name.)
> 
>> + (CBLModel *) modelForDocument:(CBLDocument *)document 
>> encrypted:(BOOL)encrypted {
> ...
>>     [document putProperties:dictionary error:&error];
> 
> This isn't a safe thing to do. Instantiating a model for a document should 
> not modify the document or have other side-effects.
> 
>> What I want is to leave the original in the db encrypted and the in-memory 
>> properties unencrypted.
> 
> I don't think you'll be able to manage this without modifying CBLModel. If 
> you look through its source code you'll see there are three places where 
> `document.properties` is referenced. Those are places where the decryption 
> would need to be inserted.
> 
> In addition, there is one call to -propertiesToSave in the -justSave: method. 
> Right after this is where the encryption would need to happen.
> 
> Keep in mind that while this will let you access the actual properties via 
> the CBLModel API, it won't make them available to map functions, so you still 
> won't be able to do any queries against the encrypted properties.
> 
>> Is there a way to 'putProperties' in the document that does not update the 
>> document on disk?
> 
> No. -putProperties is explicitly to save properties back to the database on 
> disk. (And even if you could have this in-memory modification, it still 
> wouldn't be visible to the map function so it still wouldn't work with 
> queries.)
> 
> I think the real solution is going to be to hack some hooks into the 
> replicator so that it can decrypt docs before adding them to the local db and 
> encrypt them before uploading them. I don't have the bandwidth to do this 
> right now, but I can offer advice if you want to do it.
> 
> --Jens
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Couchbase Mobile" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/mobile-couchbase/97982602-5726-4eac-830d-501821bad5a5%40googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

-- 
You received this message because you are subscribed to the Google Groups 
"Couchbase Mobile" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/mobile-couchbase/A192AC44-4D81-4ACB-9410-03057D720170%40gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to