package com.xabber.android.data.database.realm;
import android.support.annotation.Nullable;
import com.xabber.android.data.account.ArchiveMode;
import com.xabber.android.data.account.StatusMode;
import com.xabber.android.data.connection.ProxyType;
import com.xabber.android.data.connection.TLSMode;
import com.xabber.android.data.extension.mam.LoadHistorySettings;
import org.jivesoftware.smackx.mam.element.MamPrefsIQ;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Date;
import java.util.UUID;
import io.realm.RealmObject;
import io.realm.annotations.Index;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.Required;
public class AccountRealm extends RealmObject {
public static class Fields {
public static final String ID = "id";
public static final String CLEAR_HISTORY_ON_EXIT = "clearHistoryOnExit";
public static final String MAM_DEFAULT_BEHAVIOR = "mamDefaultBehavior";
public static final String LOAD_HISTORY_SETTINGS = "loadHistorySettings";
public static final String SUCCESSFUL_CONNECTION_HAPPENED = "successfulConnectionHappened";
}
@PrimaryKey
@Required
private String id;
@Index
private boolean enabled;
private String serverName;
private String userName;
private String resource;
private boolean custom;
private String host;
private int port;
private boolean storePassword;
private String password;
private int colorIndex;
private int priority;
private String statusMode;
private String statusText;
private boolean saslEnabled;
private String tlsMode;
private boolean compression;
private String proxyType;
private String proxyHost;
private int proxyPort;
private String proxyUser;
private String proxyPassword;
private boolean syncable;
private byte[] publicKeyBytes;
private byte[] privateKeyBytes;
private long lastSync;
private String archiveMode;
private boolean clearHistoryOnExit;
private String mamDefaultBehavior;
private String loadHistorySettings;
/**
* Flag indication that successful connection and authorization
* happen at least ones with current connection settings
*/
private boolean successfulConnectionHappened;
public AccountRealm(String id) {
this.id = id;
}
public AccountRealm() {
this.id = UUID.randomUUID().toString();
}
public String getId() {
return id;
}
public boolean isCustom() {
return custom;
}
public void setCustom(boolean custom) {
this.custom = custom;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getResource() {
return resource;
}
public void setResource(String resource) {
this.resource = resource;
}
public boolean isStorePassword() {
return storePassword;
}
public void setStorePassword(boolean storePassword) {
this.storePassword = storePassword;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getColorIndex() {
return colorIndex;
}
public void setColorIndex(int colorIndex) {
this.colorIndex = colorIndex;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public StatusMode getStatusMode() {
return StatusMode.valueOf(this.statusMode);
}
public void setStatusMode(StatusMode statusMode) {
this.statusMode = statusMode.name();
}
public String getStatusText() {
return statusText;
}
public void setStatusText(String statusText) {
this.statusText = statusText;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isSaslEnabled() {
return saslEnabled;
}
public void setSaslEnabled(boolean saslEnabled) {
this.saslEnabled = saslEnabled;
}
public TLSMode getTlsMode() {
return TLSMode.valueOf(this.tlsMode);
}
public void setTlsMode(TLSMode tlsMode) {
this.tlsMode = tlsMode.name();
}
public boolean isCompression() {
return compression;
}
public void setCompression(boolean compression) {
this.compression = compression;
}
public ProxyType getProxyType() {
return ProxyType.valueOf(this.proxyType);
}
public void setProxyType(ProxyType proxyType) {
this.proxyType = proxyType.name();
}
public String getProxyHost() {
return proxyHost;
}
public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
public int getProxyPort() {
return proxyPort;
}
public void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
public String getProxyUser() {
return proxyUser;
}
public void setProxyUser(String proxyUser) {
this.proxyUser = proxyUser;
}
public String getProxyPassword() {
return proxyPassword;
}
public void setProxyPassword(String proxyPassword) {
this.proxyPassword = proxyPassword;
}
public boolean isSyncable() {
return syncable;
}
public void setSyncable(boolean syncable) {
this.syncable = syncable;
}
public KeyPair getKeyPair() {
if (this.privateKeyBytes == null || this.publicKeyBytes == null) {
return null;
}
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PublicKey publicKey;
PrivateKey privateKey;
KeyFactory keyFactory;
try {
keyFactory = KeyFactory.getInstance("DSA");
publicKey = keyFactory.generatePublic(publicKeySpec);
privateKey = keyFactory.generatePrivate(privateKeySpec);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new RuntimeException(e);
}
return new KeyPair(publicKey, privateKey);
}
public void setKeyPair(KeyPair keyPair) {
if (keyPair == null) {
publicKeyBytes = null;
privateKeyBytes = null;
} else {
PublicKey publicKey = keyPair.getPublic();
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey.getEncoded());
PrivateKey privateKey = keyPair.getPrivate();
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
this.publicKeyBytes = x509EncodedKeySpec.getEncoded();
this.privateKeyBytes = pkcs8EncodedKeySpec.getEncoded();
}
}
public Date getLastSync() {
return new Date(this.lastSync);
}
public void setLastSync(Date lastSync) {
if (lastSync == null) {
this.lastSync = 0;
} else {
this.lastSync = lastSync.getTime();
}
}
public ArchiveMode getArchiveMode() {
return ArchiveMode.valueOf(this.archiveMode);
}
public void setArchiveMode(ArchiveMode archiveMode) {
this.archiveMode = archiveMode.name();
}
public boolean isClearHistoryOnExit() {
return clearHistoryOnExit;
}
public void setClearHistoryOnExit(boolean clearHistoryOnExit) {
this.clearHistoryOnExit = clearHistoryOnExit;
}
@Nullable
public MamPrefsIQ.DefaultBehavior getMamDefaultBehavior() {
if (mamDefaultBehavior == null) {
return null;
}
return MamPrefsIQ.DefaultBehavior.valueOf(mamDefaultBehavior);
}
public void setMamDefaultBehavior(MamPrefsIQ.DefaultBehavior mamDefaultBehavior) {
this.mamDefaultBehavior = mamDefaultBehavior.toString();
}
@Nullable
public LoadHistorySettings getLoadHistorySettings() {
if (loadHistorySettings == null) {
return null;
}
return LoadHistorySettings.valueOf(loadHistorySettings);
}
public void setLoadHistorySettings(LoadHistorySettings loadHistorySettings) {
this.loadHistorySettings = loadHistorySettings.toString();
}
public boolean isSuccessfulConnectionHappened() {
return successfulConnectionHappened;
}
public void setSuccessfulConnectionHappened(boolean successfulConnectionHappened) {
this.successfulConnectionHappened = successfulConnectionHappened;
}
}