/*
* Copyright 2017 rootkiwi
*
* AN2Linux-client is licensed under GNU General Public License 3.
*
* See LICENSE for more details.
*/
package kiwi.root.an2linuxclient.data;
/*
Current setup with database:
One database: servers.db
Five tables:
-----------------------
certificates
servers
wifi_servers
mobile_servers
bluetooth_servers
-----------------------
Table certificates is for certificates
Table servers is for server_id and common properties
and it's certificate_id is a foreign key referencing the id in certificates
Then the other tables include server type specific data
and their id is a foreign key referencing the id in table servers
Example:
sqlite> SELECT * FROM certificates;
_id _certificate _fingerprint
---------- ------------ ----------------------------------------------------------------
1 BLOB b7b4fe3fc6b3105d8abbc4ec28c4de27de200dba64c01f71ef9e03d835bcb1ad
2 BLOBĀ 152a37c15304eb14cece3558a2e7a442bc1be58374eac45c6b1fb390a91cffd1
sqlite> SELECT * FROM servers;
_id _is_enabled _certificate_id
---------- ----------- ---------------
1 1 1
2 0 2
3 1 2
sqlite> SELECT * FROM wifi_servers;
_id _ip_or_hostname _port _ssid_whitelist
---------- --------------- ---------- ---------------
1 192.168.15.40 31337 Wifi22
sqlite> SELECT * FROM mobile_servers;
_id _ip_or_hostname _port _roaming_allowed
---------- --------------- ---------- ----------------
2 mobile.com 44325 0
sqlite> SELECT * FROM bluetooth_servers;
_id _bluetooth_mac_address _bluetooth_name
---------- ---------------------- ----------------
3 28-DC-8F-B2-73-79 ChromeLinux_31AE
*/
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Formatter;
import java.util.List;
import kiwi.root.an2linuxclient.crypto.Sha256Helper;
import kiwi.root.an2linuxclient.interfaces.CertificateSpinnerItem;
public class ServerDatabaseHandler extends SQLiteOpenHelper {
private static ServerDatabaseHandler sInstance;
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "servers.db";
private final String TABLE_CERTIFICATES = "certificates";
private final String TABLE_SERVERS = "servers";
private final String TABLE_WIFI_SERVERS = "wifi_servers";
private final String TABLE_MOBILE_SERVERS = "mobile_servers";
private final String TABLE_BLUETOOTH_SERVERS = "bluetooth_servers";
private final String COLUMN_ID = "_id";
private final String COLUMN_CERTIFICATE = "_certificate";
private final String COLUMN_FINGERPRINT = "_fingerprint";
private final String COLUMN_IS_ENABLED = "_is_enabled";
private final String COLUMN_CERTIFICATE_ID = "_certificate_id";
private final String COLUMN_IP_OR_HOSTNAME = "_ip_or_hostname";
private final String COLUMN_PORT_NUMBER = "_port";
private final String COLUMN_SSID_WHITELIST = "_ssid_whitelist";
private final String COLUMN_ROAMING_ALLOWED = "_roaming_allowed";
private final String COLUMN_BLUETOOTH_MAC_ADDRESS = "_bluetooth_mac_address";
private final String COLUMN_BLUETOOTH_NAME = "_bluetooth_name";
private final String TRIGGER_TRIM_UNLINKED_CERTIFICATES = "trim_unlinked_certificates";
private final String CREATE_TABLE_CERTIFICATES = "CREATE TABLE " + TABLE_CERTIFICATES + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY," +
COLUMN_CERTIFICATE + " BLOB UNIQUE NOT NULL," +
COLUMN_FINGERPRINT + " TEXT UNIQUE NOT NULL);";
private final String CREATE_TABLE_SERVERS = "CREATE TABLE " + TABLE_SERVERS + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY," +
COLUMN_IS_ENABLED + " INTEGER NOT NULL," +
COLUMN_CERTIFICATE_ID + " INTEGER NOT NULL," +
"FOREIGN KEY("+COLUMN_CERTIFICATE_ID+") REFERENCES "+TABLE_CERTIFICATES+"("+COLUMN_ID+"));";
private final String CREATE_TABLE_WIFI_SERVERS = "CREATE TABLE " + TABLE_WIFI_SERVERS + "(" +
COLUMN_ID + " INTEGER UNIQUE NOT NULL," +
COLUMN_IP_OR_HOSTNAME + " TEXT NOT NULL," +
COLUMN_PORT_NUMBER + " INTEGER NOT NULL," +
COLUMN_SSID_WHITELIST + " TEXT," +
"FOREIGN KEY("+COLUMN_ID+") REFERENCES "+TABLE_SERVERS+"("+COLUMN_ID+") ON DELETE CASCADE);";
private final String CREATE_TABLE_MOBILE_SERVERS = "CREATE TABLE " + TABLE_MOBILE_SERVERS + "(" +
COLUMN_ID + " INTEGER UNIQUE NOT NULL," +
COLUMN_IP_OR_HOSTNAME + " TEXT NOT NULL," +
COLUMN_PORT_NUMBER + " INTEGER NOT NULL," +
COLUMN_ROAMING_ALLOWED + " INTEGER NOT NULL," +
"FOREIGN KEY("+COLUMN_ID+") REFERENCES "+TABLE_SERVERS+"("+COLUMN_ID+") ON DELETE CASCADE);";
private final String CREATE_TABLE_BLUETOOTH_SERVERS = "CREATE TABLE " + TABLE_BLUETOOTH_SERVERS + "(" +
COLUMN_ID + " INTEGER UNIQUE NOT NULL," +
COLUMN_BLUETOOTH_MAC_ADDRESS + " TEXT NOT NULL," +
COLUMN_BLUETOOTH_NAME + " TEXT," +
"FOREIGN KEY("+COLUMN_ID+") REFERENCES "+TABLE_SERVERS+"("+COLUMN_ID+") ON DELETE CASCADE);";
private final String CREATE_TRIGGER_TRIM_UNLINKED_CERTIFICATES = "CREATE TRIGGER " + TRIGGER_TRIM_UNLINKED_CERTIFICATES +
" AFTER DELETE ON " + TABLE_SERVERS +
" BEGIN DELETE FROM " + TABLE_CERTIFICATES +
" WHERE NOT EXISTS (SELECT " +
COLUMN_CERTIFICATE_ID + " FROM " + TABLE_SERVERS +
" WHERE " + TABLE_CERTIFICATES + "." + COLUMN_ID +
"=" + TABLE_SERVERS + "." + COLUMN_CERTIFICATE_ID +
"); END;";
public static synchronized ServerDatabaseHandler getInstance(Context c) {
if (sInstance == null) {
sInstance = new ServerDatabaseHandler(c.getApplicationContext());
}
return sInstance;
}
private ServerDatabaseHandler(Context c) {
super(c, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_CERTIFICATES);
db.execSQL(CREATE_TABLE_SERVERS);
db.execSQL(CREATE_TABLE_WIFI_SERVERS);
db.execSQL(CREATE_TABLE_MOBILE_SERVERS);
db.execSQL(CREATE_TABLE_BLUETOOTH_SERVERS);
db.execSQL(CREATE_TRIGGER_TRIM_UNLINKED_CERTIFICATES);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
final int DATABASE_VERSION_SHA256 = 2;
if (oldVersion < DATABASE_VERSION_SHA256) {
updateFingerprints(db);
}
}
/**
* Update fingerprints on existing servers from SHA1 to SHA256
*/
private void updateFingerprints(SQLiteDatabase db){
List<Server> serversToUpdate = new ArrayList<>();
Cursor c = db.query(TABLE_CERTIFICATES,
new String[]{COLUMN_ID, COLUMN_CERTIFICATE},
null, null, null, null, null);
if (c.moveToFirst()) {
do {
Server s = new Server(){};
s.setCertificateId(c.getLong(0));
s.setCertificate(c.getBlob(1));
serversToUpdate.add(s);
} while (c.moveToNext());
}
c.close();
for (Server s : serversToUpdate) {
Formatter formatter = new Formatter();
for (byte b : Sha256Helper.sha256(s.getCertificateBytes())){
formatter.format("%02x", b);
}
ContentValues values = new ContentValues();
values.put(COLUMN_FINGERPRINT, formatter.toString());
db.update(TABLE_CERTIFICATES, values,
COLUMN_ID + "=?", new String[]{String.valueOf(s.getCertificateId())});
}
}
@Override
public void onConfigure(SQLiteDatabase db){
db.setForeignKeyConstraintsEnabled(true);
}
private long addCertificate(byte[] certificateBytes){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_CERTIFICATE, certificateBytes);
Formatter formatter = new Formatter();
for (byte b : Sha256Helper.sha256(certificateBytes)){
formatter.format("%02x", b);
}
values.put(COLUMN_FINGERPRINT, formatter.toString());
long rowId = db.insert(TABLE_CERTIFICATES, null, values);
db.close();
return rowId;
}
public List<CertificateSpinnerItem> getSpinnerList(){
List<CertificateSpinnerItem> spinnerList = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.query(TABLE_CERTIFICATES,
new String[]{COLUMN_ID, COLUMN_FINGERPRINT},
null, null, null, null, null);
if (c.moveToFirst()){
do {
spinnerList.add(new CertificateIdAndFingerprint(
c.getLong(0),
c.getString(1)));
} while (c.moveToNext());
}
c.close();
db.close();
return spinnerList;
}
public boolean isThereAnyCertificatesInDatabase(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.query(TABLE_CERTIFICATES,
new String[]{COLUMN_ID},
null, null, null, null, null);
boolean exists = c.getCount() > 0;
c.close();
db.close();
return exists;
}
/**
* @return certificate id or -1 if not found
*/
public long getCertificateId(byte[] certificateBytes){
Formatter formatter = new Formatter();
for (byte b : Sha256Helper.sha256(certificateBytes)){
formatter.format("%02x", b);
}
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.query(TABLE_CERTIFICATES,
new String[]{COLUMN_ID},
COLUMN_FINGERPRINT + "=?", new String[]{formatter.toString()},
null, null, null);
long returnValue;
if (c.moveToFirst()){
returnValue = c.getLong(0);
} else {
returnValue = -1;
}
c.close();
db.close();
return returnValue;
}
public String getCertificateFingerprint(long id){
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.query(TABLE_CERTIFICATES,
new String[]{COLUMN_FINGERPRINT},
COLUMN_ID + "=?", new String[]{String.valueOf(id)},
null, null, null);
c.moveToFirst();
String fingerprint = c.getString(0);
c.close();
db.close();
return fingerprint;
}
// for TABLE_SERVERS
private long addServer(long certificateId){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_IS_ENABLED, boolToInt(true));
values.put(COLUMN_CERTIFICATE_ID, certificateId);
long rowId = db.insert(TABLE_SERVERS, null, values);
db.close();
return rowId;
}
public long addWifiServer(WifiServer wifiServer){
return this.addWifiServer(wifiServer, this.addCertificate(wifiServer.getCertificateBytes()));
}
public long addWifiServer(WifiServer wifiServer, long certificateId){
long serverId = this.addServer(certificateId);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_ID, serverId);
values.put(COLUMN_IP_OR_HOSTNAME, wifiServer.getIpOrHostname());
values.put(COLUMN_PORT_NUMBER, wifiServer.getPortNumber());
values.put(COLUMN_SSID_WHITELIST, wifiServer.getSsidWhitelist());
db.insert(TABLE_WIFI_SERVERS, null, values);
db.close();
return serverId;
}
public long addMobileServer(MobileServer mobileServer){
return this.addMobileServer(mobileServer, this.addCertificate(mobileServer.getCertificateBytes()));
}
public long addMobileServer(MobileServer mobileServer, long certificateId){
long serverId = this.addServer(certificateId);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_ID, serverId);
values.put(COLUMN_IP_OR_HOSTNAME, mobileServer.getIpOrHostname());
values.put(COLUMN_PORT_NUMBER, mobileServer.getPortNumber());
values.put(COLUMN_ROAMING_ALLOWED, boolToInt(mobileServer.isRoamingAllowed()));
db.insert(TABLE_MOBILE_SERVERS, null, values);
db.close();
return serverId;
}
public long addBluetoothServer(BluetoothServer bluetoothServer){
return this.addBluetoothServer(bluetoothServer, this.addCertificate(bluetoothServer.getCertificateBytes()));
}
public long addBluetoothServer(BluetoothServer bluetoothServer, long certificateId){
long serverId = this.addServer(certificateId);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_ID, serverId);
values.put(COLUMN_BLUETOOTH_MAC_ADDRESS, bluetoothServer.getBluetoothMacAddress());
values.put(COLUMN_BLUETOOTH_NAME, bluetoothServer.getBluetoothName());
db.insert(TABLE_BLUETOOTH_SERVERS, null, values);
db.close();
return serverId;
}
public void deleteServer(long id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_SERVERS,
COLUMN_ID + "=?", new String[]{String.valueOf(id)});
db.close();
}
public WifiServer getWifiServer(long id){
SQLiteDatabase db = this.getReadableDatabase();
WifiServer wifiServer = new WifiServer();
wifiServer.setId(id);
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_WIFI_SERVERS +
" USING(" + COLUMN_ID + ")");
Cursor c = qb.query(db,
new String[]{COLUMN_IS_ENABLED,
COLUMN_CERTIFICATE_ID,
COLUMN_IP_OR_HOSTNAME,
COLUMN_PORT_NUMBER,
COLUMN_SSID_WHITELIST},
COLUMN_ID + "=?", new String[]{String.valueOf(id)},
null, null, null);
if (c.moveToFirst()){
wifiServer.setIsEnabled(intToBool(c.getInt(0)));
wifiServer.setCertificateId(c.getLong(1));
wifiServer.setIpOrHostname(c.getString(2));
wifiServer.setPortNumber(c.getInt(3));
wifiServer.setSsidWhitelist(c.getString(4));
}
c.close();
db.close();
return wifiServer;
}
public MobileServer getMobileServer(long id){
SQLiteDatabase db = this.getReadableDatabase();
MobileServer mobileServer = new MobileServer();
mobileServer.setId(id);
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_MOBILE_SERVERS +
" USING(" + COLUMN_ID + ")");
Cursor c = qb.query(db,
new String[]{COLUMN_IS_ENABLED,
COLUMN_CERTIFICATE_ID,
COLUMN_IP_OR_HOSTNAME,
COLUMN_PORT_NUMBER,
COLUMN_ROAMING_ALLOWED},
COLUMN_ID + "=?", new String[]{String.valueOf(id)},
null, null, null);
if (c.moveToFirst()){
mobileServer.setIsEnabled(intToBool(c.getInt(0)));
mobileServer.setCertificateId(c.getLong(1));
mobileServer.setIpOrHostname(c.getString(2));
mobileServer.setPortNumber(c.getInt(3));
mobileServer.setRoamingAllowed(intToBool(c.getInt(4)));
}
c.close();
db.close();
return mobileServer;
}
public BluetoothServer getBluetoothServer(long id){
SQLiteDatabase db = this.getReadableDatabase();
BluetoothServer bluetoothServer = new BluetoothServer();
bluetoothServer.setId(id);
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_BLUETOOTH_SERVERS +
" USING(" + COLUMN_ID + ")");
Cursor c = qb.query(db,
new String[]{COLUMN_IS_ENABLED,
COLUMN_CERTIFICATE_ID,
COLUMN_BLUETOOTH_MAC_ADDRESS,
COLUMN_BLUETOOTH_NAME},
COLUMN_ID + "=?", new String[]{String.valueOf(id)},
null, null, null);
if (c.moveToFirst()){
bluetoothServer.setIsEnabled(intToBool(c.getInt(0)));
bluetoothServer.setCertificateId(c.getLong(1));
bluetoothServer.setBluetoothMacAddress(c.getString(2));
bluetoothServer.setBluetoothName(c.getString(3));
}
c.close();
db.close();
return bluetoothServer;
}
public List<Server> getAllServers(){
List<Server> allServers = new ArrayList<>();
allServers.addAll(getAllMobileServers());
allServers.addAll(getAllWifiServers());
allServers.addAll(getAllBluetoothServers());
Collections.sort(allServers);
return allServers;
}
private List<WifiServer> getAllWifiServers(){
List<WifiServer> allWifiServers = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_WIFI_SERVERS +
" USING(" + COLUMN_ID + ")");
Cursor c = qb.query(db,
new String[]{COLUMN_ID,
COLUMN_IS_ENABLED,
COLUMN_CERTIFICATE_ID,
COLUMN_IP_OR_HOSTNAME,
COLUMN_PORT_NUMBER,
COLUMN_SSID_WHITELIST},
null, null, null, null, null);
if (c.moveToFirst()){
do {
WifiServer wifiServer = new WifiServer();
wifiServer.setId(c.getLong(0));
wifiServer.setIsEnabled(intToBool(c.getInt(1)));
wifiServer.setCertificateId(c.getLong(2));
wifiServer.setIpOrHostname(c.getString(3));
wifiServer.setPortNumber(c.getInt(4));
wifiServer.setSsidWhitelist(c.getString(5));
allWifiServers.add(wifiServer);
} while (c.moveToNext());
}
c.close();
db.close();
return allWifiServers;
}
private List<MobileServer> getAllMobileServers(){
List<MobileServer> allWifiAndMobileServers = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_MOBILE_SERVERS +
" USING(" + COLUMN_ID + ")");
Cursor c = qb.query(db,
new String[]{COLUMN_ID,
COLUMN_IS_ENABLED,
COLUMN_CERTIFICATE_ID,
COLUMN_IP_OR_HOSTNAME,
COLUMN_PORT_NUMBER,
COLUMN_ROAMING_ALLOWED},
null, null, null, null, null);
if (c.moveToFirst()){
do {
MobileServer wifiAndMobileServer = new MobileServer();
wifiAndMobileServer.setId(c.getLong(0));
wifiAndMobileServer.setIsEnabled(intToBool(c.getInt(1)));
wifiAndMobileServer.setCertificateId(c.getLong(2));
wifiAndMobileServer.setIpOrHostname(c.getString(3));
wifiAndMobileServer.setPortNumber(c.getInt(4));
wifiAndMobileServer.setRoamingAllowed(intToBool(c.getInt(5)));
allWifiAndMobileServers.add(wifiAndMobileServer);
} while (c.moveToNext());
}
c.close();
db.close();
return allWifiAndMobileServers;
}
private List<BluetoothServer> getAllBluetoothServers(){
List<BluetoothServer> allBluetoothServers = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_BLUETOOTH_SERVERS +
" USING(" + COLUMN_ID + ")");
Cursor c = qb.query(db,
new String[]{COLUMN_ID,
COLUMN_IS_ENABLED,
COLUMN_CERTIFICATE_ID,
COLUMN_BLUETOOTH_MAC_ADDRESS,
COLUMN_BLUETOOTH_NAME},
null, null, null, null, null);
if (c.moveToFirst()){
do {
BluetoothServer bluetoothServer = new BluetoothServer();
bluetoothServer.setId(c.getLong(0));
bluetoothServer.setIsEnabled(intToBool(c.getInt(1)));
bluetoothServer.setCertificateId(c.getLong(2));
bluetoothServer.setBluetoothMacAddress(c.getString(3));
bluetoothServer.setBluetoothName(c.getString(4));
allBluetoothServers.add(bluetoothServer);
} while (c.moveToNext());
}
c.close();
db.close();
return allBluetoothServers;
}
public List<WifiServer> getAllEnabledWifiServers() {
List<WifiServer> allEnabledWifiServers = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_WIFI_SERVERS +
" USING(" + COLUMN_ID + ")" +
" JOIN " + TABLE_CERTIFICATES + " ON " +
TABLE_SERVERS + "." + COLUMN_CERTIFICATE_ID + "=" +
TABLE_CERTIFICATES + "." + COLUMN_ID);
Cursor c = qb.query(db,
new String[]{COLUMN_CERTIFICATE,
COLUMN_IP_OR_HOSTNAME,
COLUMN_PORT_NUMBER,
COLUMN_SSID_WHITELIST},
COLUMN_IS_ENABLED + "=?", new String[]{String.valueOf(boolToInt(true))},
null, null, null);
if (c.moveToFirst()) {
do {
WifiServer wifiServer = new WifiServer();
wifiServer.setCertificate(c.getBlob(0));
wifiServer.setIpOrHostname(c.getString(1));
wifiServer.setPortNumber(c.getInt(2));
wifiServer.setSsidWhitelist(c.getString(3));
allEnabledWifiServers.add(wifiServer);
} while (c.moveToNext());
}
c.close();
db.close();
return allEnabledWifiServers;
}
public List<MobileServer> getAllEnabledMobileServers() {
List<MobileServer> allEnabledWifiAndMobileServers = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_MOBILE_SERVERS +
" USING(" + COLUMN_ID + ")" +
" JOIN " + TABLE_CERTIFICATES + " ON " +
TABLE_SERVERS + "." + COLUMN_CERTIFICATE_ID + "=" +
TABLE_CERTIFICATES + "." + COLUMN_ID);
Cursor c = qb.query(db,
new String[]{COLUMN_CERTIFICATE,
COLUMN_IP_OR_HOSTNAME,
COLUMN_PORT_NUMBER,
COLUMN_ROAMING_ALLOWED},
COLUMN_IS_ENABLED + "=?", new String[]{String.valueOf(boolToInt(true))},
null, null, null);
if (c.moveToFirst()){
do {
MobileServer mobileServer = new MobileServer();
mobileServer.setCertificate(c.getBlob(0));
mobileServer.setIpOrHostname(c.getString(1));
mobileServer.setPortNumber(c.getInt(2));
mobileServer.setRoamingAllowed(intToBool(c.getInt(3)));
allEnabledWifiAndMobileServers.add(mobileServer);
} while (c.moveToNext());
}
c.close();
db.close();
return allEnabledWifiAndMobileServers;
}
public List<BluetoothServer> getAllEnabledBluetoothServers() {
List<BluetoothServer> allEnabledBluetoothServers = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_SERVERS +
" JOIN " + TABLE_BLUETOOTH_SERVERS +
" USING(" + COLUMN_ID + ")" +
" JOIN " + TABLE_CERTIFICATES + " ON " +
TABLE_SERVERS + "." + COLUMN_CERTIFICATE_ID + "=" +
TABLE_CERTIFICATES + "." + COLUMN_ID);
Cursor c = qb.query(db,
new String[]{COLUMN_CERTIFICATE, COLUMN_BLUETOOTH_MAC_ADDRESS},
COLUMN_IS_ENABLED + "=?", new String[]{String.valueOf(boolToInt(true))},
null, null, null);
if (c.moveToFirst()) {
do {
BluetoothServer bluetoothServer = new BluetoothServer();
bluetoothServer.setCertificate(c.getBlob(0));
bluetoothServer.setBluetoothMacAddress(c.getString(1));
allEnabledBluetoothServers.add(bluetoothServer);
} while (c.moveToNext());
}
c.close();
db.close();
return allEnabledBluetoothServers;
}
private void updateServerCertificateId(long serverId, long certificateId){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_CERTIFICATE_ID, certificateId);
db.update(TABLE_SERVERS, values,
COLUMN_ID + "=?", new String[]{String.valueOf(serverId)});
db.close();
}
public void updateWifiServer(WifiServer wifiServer){
updateWifiServer(wifiServer, this.addCertificate(wifiServer.getCertificateBytes()));
}
public void updateWifiServer(WifiServer wifiServer, long certificateId) {
updateServerCertificateId(wifiServer.getId(), certificateId);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_IP_OR_HOSTNAME, wifiServer.getIpOrHostname());
values.put(COLUMN_PORT_NUMBER, wifiServer.getPortNumber());
values.put(COLUMN_SSID_WHITELIST, wifiServer.getSsidWhitelist());
db.update(TABLE_WIFI_SERVERS, values,
COLUMN_ID + "=?", new String[]{String.valueOf(wifiServer.getId())});
db.close();
}
public void updateMobileServer(MobileServer mobileServer){
updateMobileServer(mobileServer, this.addCertificate(mobileServer.getCertificateBytes()));
}
public void updateMobileServer(MobileServer mobileServer, long certificateId) {
updateServerCertificateId(mobileServer.getId(), certificateId);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_IP_OR_HOSTNAME, mobileServer.getIpOrHostname());
values.put(COLUMN_PORT_NUMBER, mobileServer.getPortNumber());
values.put(COLUMN_ROAMING_ALLOWED, boolToInt(mobileServer.isRoamingAllowed()));
db.update(TABLE_MOBILE_SERVERS, values,
COLUMN_ID + "=?", new String[]{String.valueOf(mobileServer.getId())});
db.close();
}
public void updateBluetoothServer(BluetoothServer bluetoothServer){
updateBluetoothServer(bluetoothServer, this.addCertificate(bluetoothServer.getCertificateBytes()));
}
public void updateBluetoothServer(BluetoothServer bluetoothServer, long certificateId) {
updateServerCertificateId(bluetoothServer.getId(), certificateId);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_BLUETOOTH_NAME, bluetoothServer.getBluetoothName());
db.update(TABLE_BLUETOOTH_SERVERS, values,
COLUMN_ID + "=?", new String[]{String.valueOf(bluetoothServer.getId())});
db.close();
}
public void updateIsEnabled(long id, boolean isEnabled) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_IS_ENABLED, boolToInt(isEnabled));
db.update(TABLE_SERVERS, values,
COLUMN_ID + "=?", new String[] {String.valueOf(id)});
db.close();
}
private boolean intToBool(int num) {
return num == 1;
}
private int boolToInt(boolean bool) {
return bool ? 1 : 0;
}
}