/**
*
*/
package org.commcare.android.util;
import java.util.Date;
import net.sqlcipher.database.SQLiteDatabase;
import org.commcare.android.crypt.CryptUtil;
import org.commcare.android.database.DbHelper;
import org.commcare.android.database.DirectDbHelper;
import org.commcare.android.database.SqlStorage;
import org.commcare.android.database.app.models.UserKeyRecord;
import org.commcare.android.database.user.CommCareUserOpenHelper;
import org.commcare.android.database.user.UserSandboxUtils;
import org.commcare.android.database.user.models.User;
import org.commcare.dalvik.application.CommCareApp;
import org.commcare.dalvik.application.CommCareApplication;
import org.javarosa.core.util.PropertyUtils;
import android.content.Context;
/**
* Placeholders for demo user stuff.
*
* @author ctsims
*
*/
public class DemoUserUtil {
public static final String DEMO_USER = "demo_user";
public static synchronized void checkOrCreateDemoUser(Context c, CommCareApp currentApp) {
SqlStorage<UserKeyRecord> keys = currentApp.getStorage(UserKeyRecord.class);
int demoUsers = keys.getIDsForValue(UserKeyRecord.META_USERNAME, DEMO_USER).size();
if(demoUsers > 1) {
//There should _not_ be more than one demo user record here, we should probably
//delete the sandbox
} else if(demoUsers == 0) {
byte[] newRandomKey = CryptUtil.generateSemiRandomKey().getEncoded();
String duserHash = UserKeyRecord.generatePwdHash(DEMO_USER);
//Create us a demo user sandbox
//TODO: D'oh, looks like keys with no expiry arent' working, just make it inestimably long instead.
UserKeyRecord keyRecord = new UserKeyRecord(DEMO_USER, duserHash,
CryptUtil.wrapKey(newRandomKey, DEMO_USER),
new Date(0), new Date(Long.MAX_VALUE - 1), PropertyUtils.genUUID().replace("-",""));
keys.write(keyRecord);
//Ok, so we have a demo user record created, but we also need a user to put in that database
SQLiteDatabase userDatabase = null;
try {
userDatabase = new CommCareUserOpenHelper(CommCareApplication._(), keyRecord.getUuid()).getWritableDatabase(UserSandboxUtils.getSqlCipherEncodedKey(newRandomKey));
//Now we need an arbitrary user record
User demoUser = new User(DEMO_USER, duserHash, DEMO_USER, User.TYPE_DEMO);
SqlStorage<User> userStorage = new SqlStorage<User>(User.STORAGE_KEY, User.class, new DirectDbHelper(c, userDatabase));
userStorage.write(demoUser);
//TODO: Demo fixtures?
} finally {
if(userDatabase != null) {
userDatabase.close();
}
}
}
}
}