Stephan Richter
2 months ago
5 changed files with 246 additions and 47 deletions
@ -1,71 +1,183 @@ |
|||||||
/* © SRSoftware 2024 */ |
/* © SRSoftware 2024 */ |
||||||
package de.srsoftware.oidc.datastore.sqlite; |
package de.srsoftware.oidc.datastore.sqlite; |
||||||
|
|
||||||
|
import static de.srsoftware.oidc.api.Constants.*; |
||||||
|
|
||||||
import de.srsoftware.oidc.api.MailConfig; |
import de.srsoftware.oidc.api.MailConfig; |
||||||
import jakarta.mail.Authenticator; |
import jakarta.mail.Authenticator; |
||||||
|
import jakarta.mail.PasswordAuthentication; |
||||||
import java.sql.Connection; |
import java.sql.Connection; |
||||||
|
import java.sql.SQLException; |
||||||
|
|
||||||
public class SqliteMailConfig implements MailConfig { |
public class SqliteMailConfig extends SqliteStore implements MailConfig { |
||||||
public SqliteMailConfig(Connection connection) { |
private static final String STORE_VERSION = "mail_config_store_version"; |
||||||
} |
private static final String CREATE_STORE_VERSION = "INSERT INTO metainfo (key,value) VALUES ('" + STORE_VERSION + "','0')"; |
||||||
|
private static final String SELECT_STORE_VERSION = "SELECT * FROM metainfo WHERE key = '" + STORE_VERSION + "'"; |
||||||
|
private static final String SET_STORE_VERSION = "UPDATE metainfo SET value = ? WHERE key = '" + STORE_VERSION + "'"; |
||||||
|
private static final String CREATE_MAIL_CONFIG_TABLE = "CREATE TABLE mail_config (key VARCHAR(64) PRIMARY KEY, value VARCHAR(255));"; |
||||||
|
private static final String SAVE_MAILCONFIG = "INSERT INTO mail_config (key, value) VALUES (?, ?) ON CONFLICT DO UPDATE SET value = ?"; |
||||||
|
private static final String SELECT_MAILCONFIG = "SELECT * FROM mail_config"; |
||||||
|
private String smtpHost, senderAddress, password; |
||||||
|
|
||||||
@Override |
private int smtpPort; |
||||||
public String smtpHost() { |
private boolean smtpAuth, startTls; |
||||||
return ""; |
private Authenticator auth; |
||||||
} |
|
||||||
|
|
||||||
@Override |
public SqliteMailConfig(Connection connection) throws SQLException { |
||||||
public MailConfig smtpHost(String newValue) { |
super(connection); |
||||||
return null; |
smtpHost = ""; |
||||||
|
smtpPort = 0; |
||||||
|
senderAddress = ""; |
||||||
|
password = ""; |
||||||
|
smtpAuth = true; |
||||||
|
startTls = true; |
||||||
|
var rs = conn.prepareStatement(SELECT_MAILCONFIG).executeQuery(); |
||||||
|
while (rs.next()) { |
||||||
|
var key = rs.getString(1); |
||||||
|
switch (key) { |
||||||
|
case SMTP_PORT -> smtpPort = rs.getInt(2); |
||||||
|
case SMTP_HOST -> smtpHost = rs.getString(2); |
||||||
|
case START_TLS -> startTls = rs.getBoolean(2); |
||||||
|
case SMTP_AUTH -> smtpAuth = rs.getBoolean(2); |
||||||
|
case SMTP_PASSWORD -> password = rs.getString(2); |
||||||
|
case SMTP_USER -> senderAddress = rs.getString(2); |
||||||
|
} |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
@Override |
private void createStoreTables() throws SQLException { |
||||||
public int smtpPort() { |
conn.prepareStatement(CREATE_MAIL_CONFIG_TABLE).execute(); |
||||||
return 0; |
|
||||||
} |
} |
||||||
|
|
||||||
@Override |
|
||||||
public MailConfig smtpPort(int newValue) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
@Override |
||||||
public String senderAddress() { |
protected void initTables() throws SQLException { |
||||||
return ""; |
var rs = conn.prepareStatement(SELECT_STORE_VERSION).executeQuery(); |
||||||
} |
int availableVersion = 1; |
||||||
|
int currentVersion; |
||||||
|
if (rs.next()) { |
||||||
|
currentVersion = rs.getInt("value"); |
||||||
|
rs.close(); |
||||||
|
} else { |
||||||
|
rs.close(); |
||||||
|
conn.prepareStatement(CREATE_STORE_VERSION).execute(); |
||||||
|
currentVersion = 0; |
||||||
|
} |
||||||
|
|
||||||
@Override |
conn.setAutoCommit(false); |
||||||
public MailConfig senderAddress(String newValue) { |
var stmt = conn.prepareStatement(SET_STORE_VERSION); |
||||||
return null; |
while (currentVersion < availableVersion) { |
||||||
|
try { |
||||||
|
switch (currentVersion) { |
||||||
|
case 0: |
||||||
|
createStoreTables(); |
||||||
|
break; |
||||||
|
} |
||||||
|
stmt.setInt(1, ++currentVersion); |
||||||
|
stmt.execute(); |
||||||
|
conn.commit(); |
||||||
|
} |
||||||
|
catch (Exception e) { |
||||||
|
conn.rollback(); |
||||||
|
LOG.log(System.Logger.Level.ERROR, "Failed to update at {} = {}", STORE_VERSION, currentVersion); |
||||||
|
break; |
||||||
|
} |
||||||
} |
} |
||||||
|
conn.setAutoCommit(true); |
||||||
|
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public String senderPassword() { |
public String smtpHost() { |
||||||
return ""; |
return smtpHost; |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public MailConfig senderPassword(String newValue) { |
public MailConfig smtpHost(String newValue) { |
||||||
return null; |
smtpHost = newValue; |
||||||
} |
return this; |
||||||
|
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public MailConfig startTls(boolean newValue) { |
public int smtpPort() { |
||||||
return null; |
return smtpPort; |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public MailConfig smtpAuth(boolean newValue) { |
public MailConfig smtpPort(int newValue) { |
||||||
return null; |
smtpPort = newValue; |
||||||
} |
return this; |
||||||
|
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public Authenticator authenticator() { |
public String senderAddress() { |
||||||
return null; |
return senderAddress; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public MailConfig senderAddress(String newValue) { |
||||||
|
senderAddress = newValue; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String senderPassword() { |
||||||
|
return password; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public MailConfig senderPassword(String newValue) { |
||||||
|
password = newValue; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean startTls() { |
||||||
|
return startTls; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean smtpAuth() { |
||||||
|
return smtpAuth; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public MailConfig startTls(boolean newValue) { |
||||||
|
startTls = newValue; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public MailConfig smtpAuth(boolean newValue) { |
||||||
|
smtpAuth = newValue; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Authenticator authenticator() { |
||||||
|
if (auth == null) { |
||||||
|
auth = new Authenticator() { |
||||||
|
// override the getPasswordAuthentication method
|
||||||
|
protected PasswordAuthentication getPasswordAuthentication() { |
||||||
|
return new PasswordAuthentication(senderAddress(), senderPassword()); |
||||||
|
} |
||||||
|
}; |
||||||
} |
} |
||||||
|
return auth; |
||||||
|
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public MailConfig save() { |
public MailConfig save() { |
||||||
return null; |
try { |
||||||
|
var stmt = conn.prepareStatement(SAVE_MAILCONFIG); |
||||||
|
for (var entry : map().entrySet()) { |
||||||
|
stmt.setString(1, entry.getKey()); |
||||||
|
stmt.setObject(2, entry.getValue()); |
||||||
|
stmt.setObject(3, entry.getValue()); |
||||||
|
stmt.execute(); |
||||||
|
} |
||||||
|
return this; |
||||||
|
} catch (SQLException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
} |
} |
||||||
} |
} |
||||||
|
} |
||||||
|
@ -0,0 +1,37 @@ |
|||||||
|
/* © SRSoftware 2024 */ |
||||||
|
package de.srsoftware.oidc.datastore.sqlite; |
||||||
|
|
||||||
|
import static de.srsoftware.utils.Strings.uuid; |
||||||
|
|
||||||
|
import de.srsoftware.oidc.api.MailConfig; |
||||||
|
import de.srsoftware.oidc.api.MailConfigTest; |
||||||
|
import java.io.File; |
||||||
|
import java.sql.SQLException; |
||||||
|
import org.junit.jupiter.api.BeforeEach; |
||||||
|
|
||||||
|
public class SqliteMailConfigTest extends MailConfigTest { |
||||||
|
private SqliteMailConfig mailConfig; |
||||||
|
private File dbFile; |
||||||
|
|
||||||
|
@Override |
||||||
|
protected MailConfig mailConfig() { |
||||||
|
return mailConfig; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void reOpen() { |
||||||
|
try { |
||||||
|
var conn = new ConnectionProvider().get(dbFile); |
||||||
|
mailConfig = new SqliteMailConfig(conn); |
||||||
|
} catch (SQLException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@BeforeEach |
||||||
|
public void setup() throws SQLException { |
||||||
|
dbFile = new File("/tmp/" + uuid() + ".sqlite"); |
||||||
|
var conn = new ConnectionProvider().get(dbFile); |
||||||
|
mailConfig = new SqliteMailConfig(conn); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue