Hi Summers
Referring to
http://aerogear-dev.1069024.n5.nabble.com/aerogear-dev-Fallback-Strat-for...
where we might have async API for store in JS, I think we might
benefit of async for native apps too, specially in the case of
encrypted stores.
Something like
https://github.com/rnapier/RNCryptor#asynchronous-use
Of course, it can be done in later releases. Encrypting large field,
you don't want to have your UI sluggish.
wdyt?
The DataManager/Data Store API is synchronous, Pipes and Piplines are
asynchronous. That is a key difference.
I don't know about iOS but on Android not everything happens on the
main thread, for instance we could be dealing with a processing a
service intent for instance.
++
Corinne
On 5 November 2013 17:44, Summers Pittman <supittma(a)redhat.com
<mailto:supittma@redhat.com>> wrote:
On 11/05/2013 02:41 AM, Corinne Krych wrote:
> Hello all,
>
> I've got 2 points:
>
> - modularity: AeroGear libs are small and modular: we have a
separate aerogear-otp-ios, aerogear-push-ios-registration so that
if the user wants to use aerogear without push, he can use
aerogear-ios, if he needs the push-registration, he uses both. For
encryption store, where do we want to put EncryptedStore?
aerogear-android depends on aerogear-crypto.
On Android it is going into the main library. We can research slicing
the client library up for 2.0, but I would like to, for now, make
getting up and running with anything AeroGear on Android as simple as
including the dependency.
>
> - Encrypting data takes time. It would be nice to have
EncryptedStore encrypts data on separate thread and provide
callbacks on completion.
> thoughts?
Then we would have an encrypted Pipe. One of the things about
Stores is
that they are synchronous, Pipes are asynchronous.
>
> ++
> Corinne
> On Nov 4, 2013, at 5:30 PM, Daniel Passos <daniel(a)passos.me
<mailto:daniel@passos.me>> wrote:
>
>> The idea is implementing only save(add/update) and delete,
using the stores we already have today by just adding crypt /
decrypt and scheduling Query (readWithFilter) for the next release
>> DataManager
>>
>> public Store encryptedStore(String storeName, String passphrase) {
>> // TODO Create a default passphrase-based KeyStore
>> KeyStore keyStore = null;
>> return encryptedStore(storeName, keyStore);
>> }
>>
>> public Store encryptedStore(String storeName, KeyStore keyStore) {
>> StoreConfig storeConfig = new StoreConfig();
>> storeConfig.setType(StoreTypes.ENCRYPTED_MEMORY);
>> return encryptedStore(storeName, storeConfig, keyStore);
>> }
>>
>> public Store encryptedStore(String storeName, StoreConfig
config, String passphrase) {
>> // TODO Create a default passphrase-based KeyStore
>> KeyStore keyStore = null;
>> return encryptedStore(storeName, config, keyStore);
>> }
>>
>> public Store encryptedStore(String storeName, StoreConfig
config, KeyStore keyStore) {
>> config.setKeyStore(keyStore);
>> Store store = storeFactory.createStore(config);
>> stores.put(storeName, store);
>> return store;
>> }
>>
>> EncryptedMemoryStore
>>
>> public class EncryptedMemoryStore<T> implements Store<T> {
>>
>> private final MemoryStorage<T> memoryStorage;
>> private final CryptoUtils<T> cryptoUtils;
>>
>> public EncryptedMemoryStore(IdGenerator idGenerator,
KeyStore keyStore) {
>> memoryStorage = new MemoryStorage(idGenerator);
>> cryptoUtils = new CryptoUtils<T>(keyStore);
>> }
>>
>> @Override
>> public StoreType getType() {
>> return StoreTypes.ENCRYPTED_MEMORY;
>> }
>>
>> @Override
>> public Collection<T> readAll() throws InvalidKeyException {
>> Collection<T> encryptedCollection =
memoryStorage.readAll();
>> return cryptoUtils.decrypt(encryptedCollection);
>> }
>>
>> @Override
>> public T read(Serializable id) throws InvalidKeyException {
>> T encryptedItem = memoryStorage.read(id);
>> return cryptoUtils.decrypt(encryptedItem);
>> }
>>
>> @Override
>> public List<T> readWithFilter(ReadFilter filter) throws
InvalidKeyException {
>> List<T> encryptedList =
memoryStorage.readWithFilter(filter);
>> return cryptoUtils.decrypt(encryptedList);
>> }
>>
>> @Override
>> public void save(T item) {
>> memoryStorage.save(cryptoUtils.encrypt(item));
>> }
>>
>> @Override
>> public void reset() {
>> memoryStorage.reset();
>> }
>>
>> @Override
>> public void remove(Serializable id) {
>> memoryStorage.remove(id);
>> }
>>
>> @Override
>> public boolean isEmpty() {
>> return memoryStorage.isEmpty();
>> }
>>
>> }
>>
>> CryptoUtils
>>
>> Here is where the magic happens.
>>
>>
>> public class CryptoUtils<T> {
>>
>> private final KeyStore keyStore;
>>
>> public CryptoUtils(KeyStore keyStore) {
>> this.keyStore = keyStore;
>> }
>>
>> public Collection<T> decrypt(Collection<T>
encryptedCollection) {
>> List<T> decryptedList = new ArrayList<T>();
>> for (T item : encryptedCollection) {
>> decryptedList.add(decrypt(item));
>> }
>> return decryptedList;
>> }
>>
>> public List<T> decrypt(List<T> encryptedList) {
>> List<T> decryptedList = new ArrayList<T>();
>> for (T item : encryptedList) {
>> decryptedList.add(decrypt(item));
>> }
>> return decryptedList;
>> }
>>
>> public T decrypt(T item) {
>> // TODO Read all fields and decrypt
>> return item;
>> }
>>
>> public T encrypt(T item) {
>> // TODO Read all fields and encrypt
>> return item;
>> }
>>
>> }
>>
>> _______________________________________________
>> aerogear-dev mailing list
>> aerogear-dev(a)lists.jboss.org <mailto:aerogear-dev@lists.jboss.org>
>>
https://lists.jboss.org/mailman/listinfo/aerogear-dev
>
> _______________________________________________
> aerogear-dev mailing list
> aerogear-dev(a)lists.jboss.org <mailto:aerogear-dev@lists.jboss.org>
>
https://lists.jboss.org/mailman/listinfo/aerogear-dev
_______________________________________________
aerogear-dev mailing list
aerogear-dev(a)lists.jboss.org <mailto:aerogear-dev@lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/aerogear-dev
_______________________________________________
aerogear-dev mailing list
aerogear-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/aerogear-dev