org.panbox.mobile.android.identitymgmt.IdentityDebugApp.java Source code

Java tutorial

Introduction

Here is the source code for org.panbox.mobile.android.identitymgmt.IdentityDebugApp.java

Source

/*
 * 
 *               Panbox - encryption for cloud storage 
 *      Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG 
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Additonally, third party code may be provided with notices and open source
 * licenses from communities and third parties that govern the use of those
 * portions, and any licenses granted hereunder do not alter any rights and
 * obligations you may have under such open source licenses, however, the
 * disclaimer of warranty and limitation of liability provisions of the GPLv3 
 * will apply to all the product.
 * 
 */
package org.panbox.mobile.android.identitymgmt;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyPair;
import java.util.Collection;
import java.util.LinkedList;

import org.panbox.Settings;
import org.panbox.core.crypto.CryptCore;
import org.panbox.core.exception.RandomDataGenerationException;
import org.panbox.core.identitymgmt.AbstractAddressbookManager;
import org.panbox.core.identitymgmt.AbstractIdentity;
import org.panbox.core.identitymgmt.AbstractIdentityManager;
import org.panbox.core.identitymgmt.CloudProviderInfo;
import org.panbox.core.identitymgmt.Identity;
import org.panbox.core.identitymgmt.PanboxContact;
import org.panbox.core.identitymgmt.SimpleAddressbook;
import org.panbox.core.identitymgmt.VCardProtector;
import org.panbox.core.identitymgmt.exceptions.ContactExistsException;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import ezvcard.VCard;

public class IdentityDebugApp {

    private final String accountName = "Panbox";
    private final String accountType = "org.panbox";

    private ContentResolver cr = null;
    private Context context = null;

    private AccountManager am = null;
    private Account panboxAccount = null;

    private AbstractIdentity identity = null;

    public IdentityDebugApp(Context context, ContentResolver contentResolver) {
        this.cr = contentResolver;
        this.context = context;

        am = AccountManager.get(context);
    }

    public void createPanboxAccount() {

        panboxAccount = new Account(accountName, accountType);
        am.addAccountExplicitly(panboxAccount, null, null);

        Log.i(IdentityDebugApp.class.getSimpleName(), "Created Panbox Account");
    }

    public void deletePanboxAccount() {

        Account[] accounts = am.getAccountsByType(accountType);
        Account ac = null;

        String[] names = new String[accounts.length];
        for (int i = 0; i < names.length; i++) {
            if (accounts[i].type.equals(accountType)) {
                ac = accounts[i];
            }
        }

        if (null != ac) {
            am.removeAccount(ac, null, null);
            Log.i(IdentityDebugApp.class.getSimpleName(), "Removed Panbox Account");
        }

        //
        // for(int i=2; i<5; i++)
        // {
        // String where = RawContacts._ID + "=?";
        // String[] selectionArgs = new String[] { String.valueOf(i) };
        //
        // Uri uri = RawContacts.CONTENT_URI;
        // Uri updateUri =
        // uri.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER,
        // "true").build();
        //
        // int res = cr.delete(updateUri, where, selectionArgs);
        //
        // System.out.println("Delete result: " + res);
        // }
    }

    /**
     * Call Create Identity first!
     */
    public void addContactTest() {

        if (null == identity) {
            Toast.makeText(context, "Create one ID first that we can load afterwards", Toast.LENGTH_LONG).show();
            System.err.println("No identity to add contact to, please create one");

            return;
        }
        PanboxContact c = new PanboxContact();

        c.setEmail("contactAdded@bla.de");
        c.setName("AddedLastName");
        c.setFirstName("Alice");

        c.setTrustLevel(2);

        CloudProviderInfo cpi1 = new CloudProviderInfo("Cloud1", "Alice-Cloud1");
        c.addCloudProvider(cpi1);

        KeyPair cSigKey = CryptCore.generateKeypair();
        KeyPair cEncKey = CryptCore.generateKeypair();

        c.setCertEnc(CryptCore.createSelfSignedX509Certificate(cEncKey.getPrivate(), cEncKey.getPublic(), c));
        c.setCertSign(CryptCore.createSelfSignedX509Certificate(cSigKey.getPrivate(), cSigKey.getPublic(), c));

        try {
            identity.getAddressbook().addContact(c);
        } catch (ContactExistsException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // change cpi of a contact

        //      PanboxContact pbc = identity.getAddressbook().contactExists(
        //            "contact1@test.de");
        //      CloudProviderInfo cpInfo = pbc.getCloudProvider("Skydrive");
        //      cpInfo.setUsername("changed-Bobs-Skydriveuser");
        //
        //      // remove cpi in contact
        //      cpInfo = pbc.getCloudProvider("Dropbox");
        //      pbc.removeCloudProvider(cpInfo);
        //
        //      // add cpi to contact
        //      CloudProviderInfo cpi123 = new CloudProviderInfo("Wuala", "Bobs-Wuala");
        //      pbc.addCloudProvider(cpi123);
        //
        //      // change name, email etc of contact
        //      pbc.setEmail("12345@12345.com");
        //      pbc.setName("12Name");
        //      pbc.setFirstName("12Firstname");
        //
        //      // change mail
        //      identity.setEmail("newMail@testing.org");
        //
        //      identity.setName("NewLastName");
        //      identity.setFirstName("NewFirstName");
        //
        //      // del cpi
        //      CloudProviderInfo del = null;
        //      for (CloudProviderInfo cpi : identity.getCloudProviders().values()) {
        //         if (cpi.getProviderName().equals("Dropbox")) {
        //            del = cpi;
        //         }
        //      }
        //      identity.delCloudProvider(del.getProviderName());
        //
        //      // add new cpi
        //      CloudProviderInfo newCPI = new CloudProviderInfo("NewCloud",
        //            "myNewuser@bla.com");
        //      identity.addCloudProvider(newCPI);
        //
        //      Settings pbSettings = Settings.getInstance();
        //      pbSettings.setConfDir(context.getFilesDir().getAbsolutePath());
        //      // pbSettings.setPanboxIdentityDBFile(context.getFilesDir()
        //      // + File.separator + "identity.db");
        //      // pbSettings.setPanboxKeystore(context.getFilesDir() + File.separator
        //      // + "keystore.jks");

        AbstractIdentityManager idm = IdentityManagerAndroid.getInstance(context);

        idm.storeMyIdentity(identity);

    }

    public void deleteContactsTest() {

        if (null == identity) {
            Toast.makeText(context, "Create one ID first that we can load afterwards", Toast.LENGTH_LONG).show();
            System.err.println("No identity to add contact to, please create one");

            return;
        }

        identity.deleteContact("contact1@test.de");

        Settings pbSettings = Settings.getInstance();
        pbSettings.setConfDir(context.getFilesDir().getAbsolutePath());
        // pbSettings.setPanboxIdentityDBFile(context.getFilesDir()
        // + File.separator + "identity.db");
        // pbSettings.setPanboxKeystore(context.getFilesDir() + File.separator
        // + "keystore.jks");

        AbstractIdentityManager idm = IdentityManagerAndroid.getInstance(context);

        idm.storeMyIdentity(identity);

        // String where = RawContacts.ACCOUNT_TYPE + "=?";
        // String[] selectionArgs = new String[] { accountType };
        //
        // // delete
        // Uri uri = RawContacts.CONTENT_URI;
        //
        // Uri updateUri = uri
        // .buildUpon()
        // .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER,
        // "true").build();
        //
        // int res = cr.delete(updateUri, where, selectionArgs);
        // System.out.println("Delete result: " + res);
    }

    public void createIdentity() {
        //      AbstractAddressbookManager adm = (AbstractAddressbookManager) new AddressbookManagerAndroid(
        //            context, cr);

        AddressbookManagerAndroid adm = new AddressbookManagerAndroid(context, cr);

        Settings pbSettings = Settings.getInstance();
        pbSettings.setConfDir(context.getFilesDir().getAbsolutePath());
        // pbSettings.setPanboxIdentityDBFile(context.getFilesDir()
        // + File.separator + "identity.db");
        // pbSettings.setPanboxKeystore(context.getFilesDir() + File.separator
        // + "keystore.jks");

        AbstractIdentityManager idm = IdentityManagerAndroid.getInstance(context);

        //IMPORTANT TO INIT ADDRESSBOOKMANAGER HERE!!!
        //DO THIS BEFORE ANY OTHER CALL ON THE IDENTITYMANAGER
        idm.init(adm);
        //IMPORTANT TO INIT ADDRESSBOOKMANAGER HERE!!!

        AbstractIdentity id = null;

        System.out.println("Create identity in file: " + pbSettings.getIdentityPath());

        SimpleAddressbook ab = new SimpleAddressbook();
        id = new Identity(ab);

        id.setFirstName("Panbox");
        id.setName("Tester");
        id.setEmail("panbox@tester.org");

        KeyPair ownerKeySign = CryptCore.generateKeypair();
        KeyPair ownerKeyEnc = CryptCore.generateKeypair();
        KeyPair deviceKey = CryptCore.generateKeypair();

        id.setOwnerKeySign(ownerKeySign, "test".toCharArray());
        id.setOwnerKeyEnc(ownerKeyEnc, "test".toCharArray());
        id.addDeviceKey(deviceKey, "laptop");

        CloudProviderInfo cpi = new CloudProviderInfo("Dropbox", "myUser@domain.com");

        id.addCloudProvider(cpi);

        //      PanboxContact cs = new PanboxContact();
        //      cs.setEmail("contact1@test.de");
        //      cs.setName("BobLastname");
        //      cs.setFirstName("Bob");
        //      
        //      cs.setTrustLevel(1);
        //
        //      CloudProviderInfo cpiContact = new CloudProviderInfo("Dropbox",
        //            "myUser123@bla.com");
        //      cs.addCloudProvider(cpiContact);
        //
        //      CloudProviderInfo cpiContact2 = new CloudProviderInfo("Skydrive",
        //            "test@hallo.com");
        //      cs.addCloudProvider(cpiContact2);
        //
        //      id.getAddressbook().addContact(cs);
        //
        //      KeyPair cSigKey = CryptCore.generateKeypair();
        //      KeyPair cEncKey = CryptCore.generateKeypair();
        //
        //      cs.setCertEnc(CryptCore.createSelfSignedX509Certificate(
        //            cEncKey.getPrivate(), cEncKey.getPublic(), cs));
        //      cs.setCertSign(CryptCore.createSelfSignedX509Certificate(
        //            cSigKey.getPrivate(), cSigKey.getPublic(), cs));

        idm.storeMyIdentity(id);

        // for local testing
        // identity = idm.loadMyIdentity(new SimpleAddressbook(), adm);
        identity = id;

    }

    public void deleteIdentity() {

        // boolean dbDeleted = context.deleteDatabase(context.getFilesDir() +
        // File.separator + "identity.db");
        boolean dbDeleted = context.deleteDatabase("identity.db");

        System.out.println("DB deleted?: " + dbDeleted);

        File f = new File(context.getFilesDir() + File.separator + "keystore.jks");

        System.out.println("Trying to delete file: " + f.getAbsolutePath());

        if (f.exists()) {
            f.delete();
        } else {
            System.err.println("Could not find keystore file to delete it.");
        }

        // deleteContactsTest();

    }

    public void loadIdentityTest() {

        // if(identity == null)
        // {
        // Toast.makeText(context,
        // "Create one ID first that we can load afterwards",
        // Toast.LENGTH_LONG).show();
        // System.out.println("Create one ID first that we can load");
        // return;
        // }

        AbstractAddressbookManager adm = (AbstractAddressbookManager) new AddressbookManagerAndroid(context, cr);

        Settings pbSettings = Settings.getInstance();
        pbSettings.setConfDir(context.getFilesDir().getAbsolutePath());
        // pbSettings.setPanboxIdentityDBFile(context.getFilesDir()
        // + File.separator + "identity.db");
        // pbSettings.setPanboxKeystore(context.getFilesDir() + File.separator
        // + "keystore.jks");

        AbstractIdentityManager idm = IdentityManagerAndroid.getInstance(context);
        idm.init(adm);

        AbstractIdentity id = idm.loadMyIdentity(new SimpleAddressbook());

        System.out.println("ID loaded: " + id.getFirstName() + " " + id.getName() + " " + id.getEmail());

        identity = id;

    }

    public void exportAddressbook() {
        File[] files = ContextCompat.getExternalFilesDirs(this.context, null);

        for (File f : files) {
            System.out.println(f.getAbsolutePath());
        }

        String rootPath = files[0].getAbsolutePath();

        boolean createdDirs = files[0].mkdirs();
        System.out.println("created dirs? " + createdDirs);

        File aBookFileTMP = new File(rootPath + File.separator + "abookTMP.vcf");

        Collection<PanboxContact> contacts = identity.getAddressbook().getContacts();

        LinkedList<VCard> vcards = new LinkedList<VCard>();
        for (PanboxContact c : contacts) {
            vcards.add(AbstractAddressbookManager.contact2VCard(c));
        }

        //export myself too
        vcards.add(AbstractAddressbookManager.contact2VCard(identity));

        //temporary vcf file
        AbstractAddressbookManager.exportContacts(vcards, aBookFileTMP);

        char[] pass = null;
        try {
            pass = VCardProtector.generatePassword();
        } catch (RandomDataGenerationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.err.println("Export password is: " + String.valueOf(pass));

        //TODO: HACK for testing
        //      pass = new char[]{'1','2','3'};

        File aBookFile = new File(rootPath + File.separator + "abook.zip");

        try {
            VCardProtector.protectVCF(aBookFile, aBookFileTMP, pass);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (aBookFileTMP.exists()) {
            aBookFileTMP.delete();
        }

    }

    public void importContacts() {
        File[] files = ContextCompat.getExternalFilesDirs(this.context, null);

        String rootPath = files[0].getAbsolutePath();

        AbstractIdentityManager idm = IdentityManagerAndroid.getInstance(context);

        File aBookFileTMP = new File(rootPath + File.separator + "abookTMP.vcf");

        File sourceFile = new File(rootPath + File.separator + "abook.zip");
        /*      try {
        boolean hashMatch;
           hashMatch = VCardProtector.unwrapVCF(sourceFile, aBookFileTMP, new char[]{'6','w','2','y','r','a'});
           System.out.println("Hash match?: " + hashMatch);
        } catch (Exception e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
        */
        //import example without password check
        try {
            try {
                VCardProtector.unwrapVCF(sourceFile, aBookFileTMP);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //         idm.getAddressBookManager().importContacts(identity, aBookFileTMP);
            idm.getAddressBookManager().importContacts(identity, aBookFileTMP, true);
        } catch (ContactExistsException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (aBookFileTMP.exists()) {
            aBookFileTMP.delete();
        }
    }

}