working on list administration
This commit is contained in:
@@ -70,10 +70,10 @@ public class Database {
|
||||
var keys = new ArrayList<String>();
|
||||
var expressions = new ArrayList<String>();
|
||||
for (var entry : setValues.entrySet()) {
|
||||
expressions.add(" SET "+entry.getKey()+" = ?");
|
||||
expressions.add(entry.getKey()+" = ?");
|
||||
args.add(entry.getValue());
|
||||
}
|
||||
sql.append(String.join(", ",expressions));
|
||||
sql.append(" SET ").append(String.join(", ",expressions));
|
||||
}
|
||||
|
||||
if (!values.isEmpty()){
|
||||
@@ -226,11 +226,12 @@ public class Database {
|
||||
}
|
||||
}
|
||||
|
||||
public Request update(String tableName,String ...expressions) {
|
||||
var sql = new StringBuilder("UPDATE ").append(tableName);
|
||||
if (expressions != null && expressions.length > 0) {
|
||||
sql.append(" SET ").append(String.join(", ",expressions));
|
||||
}
|
||||
return new Request(sql);
|
||||
public Request update(String tableName) {
|
||||
return new Request(new StringBuilder("UPDATE ").append(tableName));
|
||||
}
|
||||
|
||||
public static String xor(Object a, Object b){
|
||||
// https://stackoverflow.com/a/16443025/1285585
|
||||
return "(~("+a+"&"+b+"))&("+a+"|"+b+")";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,16 +5,10 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.stringtemplate.v4.ST;
|
||||
|
||||
import javax.xml.crypto.Data;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.*;
|
||||
|
||||
import static de.srsoftware.widerhall.Constants.*;
|
||||
import static de.srsoftware.widerhall.Constants.STATE;
|
||||
|
||||
public class ListMember {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ListMember.class);
|
||||
@@ -25,7 +19,6 @@ public class ListMember {
|
||||
private static final String LIST_EMAIL = "list_email";
|
||||
private static final String USER_EMAIL = "user_email";
|
||||
private static final String STATE = "state";
|
||||
private static final String TOKEN = "token";
|
||||
private final String listEmail,token,userEmail;
|
||||
private final int state;
|
||||
|
||||
@@ -36,6 +29,27 @@ public class ListMember {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public static User confirm(String token) throws SQLException {
|
||||
var rs = Database.open().select(TABLE_NAME).where(TOKEN,token).exec();
|
||||
while (rs.next()){
|
||||
var lm = new ListMember(rs.getString(LIST_EMAIL),rs.getString(USER_EMAIL),rs.getInt(STATE),rs.getString(TOKEN));
|
||||
User user = User.loadAll(List.of(lm.userEmail)).stream().findAny().orElse(null);
|
||||
if (user != null){
|
||||
int newState = lm.state ^ STATE_AWAITING_CONFIRMATION | STATE_SUBSCRIBER;
|
||||
Database.open()
|
||||
.update(TABLE_NAME)
|
||||
.set(TOKEN,"NULL")
|
||||
.set(STATE, newState) //drop confirmation state, set subscriber state
|
||||
.where(LIST_EMAIL,lm.listEmail)
|
||||
.where(USER_EMAIL,lm.userEmail)
|
||||
.run();
|
||||
}
|
||||
return user;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static ListMember create(MailingList list, User user, int state) throws SQLException {
|
||||
String token = null;
|
||||
if ((state & STATE_AWAITING_CONFIRMATION) > 0){
|
||||
@@ -56,8 +70,8 @@ public class ListMember {
|
||||
Database.open().query(sql).run();
|
||||
}
|
||||
|
||||
public static List<String> listsOwnedBy(User user) {
|
||||
var list = new ArrayList<String>();
|
||||
public static Set<String> listsOwnedBy(User user) {
|
||||
var list = new HashSet<String>();
|
||||
try {
|
||||
var rs = Database.open().select(TABLE_NAME,LIST_EMAIL)
|
||||
.where(USER_EMAIL,user.email())
|
||||
@@ -113,7 +127,7 @@ public class ListMember {
|
||||
.where(USER_EMAIL,user.email())
|
||||
.exec();
|
||||
while (rs.next()){
|
||||
int state = rs.getInt(STATE) ^ STATE_SUBSCRIBER;
|
||||
int state = Util.unset(rs.getInt(STATE),STATE_SUBSCRIBER,STATE_AWAITING_CONFIRMATION);
|
||||
if (state < 1) { // drop entry
|
||||
db.deleteFrom(TABLE_NAME)
|
||||
.where(LIST_EMAIL,list.email())
|
||||
|
||||
@@ -8,10 +8,7 @@ import org.slf4j.LoggerFactory;
|
||||
import javax.mail.MessagingException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
import static de.srsoftware.widerhall.Constants.*;
|
||||
import static de.srsoftware.widerhall.Util.t;
|
||||
@@ -78,48 +75,28 @@ public class MailingList {
|
||||
|
||||
|
||||
public static void enable(String listEmail, boolean enable) throws SQLException {
|
||||
// https://stackoverflow.com/questions/16440831/bitwise-xor-in-sqlite-bitwise-not-not-working-as-i-expect
|
||||
String expression = enable ? "state = state | "+ STATE_ENABLED : "state = (~(state & "+ STATE_ENABLED +"))&(state|"+ STATE_ENABLED +")";
|
||||
Database.open().update(TABLE_NAME,expression).where(EMAIL, listEmail).run();
|
||||
Database.open()
|
||||
.update(TABLE_NAME)
|
||||
.set(STATE,enable ? STATE+" | "+ STATE_ENABLED : Database.xor(STATE,STATE_ENABLED))
|
||||
.where(EMAIL, listEmail).run();
|
||||
}
|
||||
|
||||
public static void hide(String listEmail, boolean hide) throws SQLException {
|
||||
// https://stackoverflow.com/questions/16440831/bitwise-xor-in-sqlite-bitwise-not-not-working-as-i-expect
|
||||
String expression = hide ? "state = (~(state & "+ STATE_PUBLIC +"))&(state|"+ STATE_PUBLIC +")" : ("state = state | "+ STATE_PUBLIC);
|
||||
Database.open().update(TABLE_NAME,expression).where(EMAIL, listEmail).run();
|
||||
Database.open()
|
||||
.update(TABLE_NAME)
|
||||
.set(STATE,hide ? STATE+" | "+ STATE_PUBLIC : Database.xor(STATE,STATE_PUBLIC))
|
||||
.where(EMAIL, listEmail).run();
|
||||
}
|
||||
|
||||
|
||||
public static boolean isOpen(String list) {
|
||||
return openLists().stream().filter(ml -> ml.email.equals(list)).count() > 0;
|
||||
}
|
||||
|
||||
public static List<MailingList> listsOf(User user) {
|
||||
|
||||
List<String> keys = (user.is(ADMIN)) ? null : ListMember.listsOwnedBy(user);
|
||||
var list = new ArrayList<MailingList>();
|
||||
if (keys != null && keys.isEmpty()) return list;
|
||||
try {
|
||||
Database.Request query = Database.open().select(TABLE_NAME);
|
||||
if (keys != null) query.where(EMAIL, keys);
|
||||
var rs = query.exec();
|
||||
while (rs.next()) {
|
||||
var email = rs.getString(EMAIL);
|
||||
var name = rs.getString(NAME);
|
||||
var imapHost = rs.getString(IMAP_HOST);
|
||||
var imapPort = rs.getInt(IMAP_PORT);
|
||||
var imapUser = rs.getString(IMAP_USER);
|
||||
var imapPass = rs.getString(IMAP_PASS);
|
||||
var smtpHost = rs.getString(SMTP_HOST);
|
||||
var smtpPort = rs.getInt(SMTP_PORT);
|
||||
var smtpUser = rs.getString(SMTP_USER);
|
||||
var smtpPass = rs.getString(SMTP_PASS);
|
||||
var state = rs.getInt(STATE);
|
||||
list.add(new MailingList(email, name, imapHost, imapPort, imapUser, imapPass, smtpHost, smtpPort, smtpUser, smtpPass, state));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
LOG.warn("Listing mailing lists failed: ", e);
|
||||
}
|
||||
public static Set<MailingList> listsOf(User user) {
|
||||
var list = openLists();
|
||||
Set<String> keys = (user.is(ADMIN)) ? null : ListMember.listsOwnedBy(user);
|
||||
if (keys == null || keys.isEmpty()) return list;
|
||||
for (String key : keys) list.add(load(key));
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -155,19 +132,17 @@ public class MailingList {
|
||||
return name;
|
||||
}
|
||||
|
||||
public static List<MailingList> openLists() {
|
||||
var list = new ArrayList<MailingList>();
|
||||
public static Set<MailingList> openLists() {
|
||||
var list = new HashSet<MailingList>();
|
||||
try {
|
||||
var rs = Database.open()
|
||||
.select(TABLE_NAME,"*", "(" + STATE + " & " + STATE_PUBLIC + ") as test")
|
||||
.select(TABLE_NAME,EMAIL, "(" + STATE + " & " + STATE_PUBLIC + ") as test")
|
||||
.where("test", STATE_PUBLIC)
|
||||
.exec();
|
||||
while (rs.next()) {
|
||||
var email = rs.getString(EMAIL);
|
||||
var name = rs.getString(NAME);
|
||||
var state = rs.getInt(STATE);
|
||||
list.add(new MailingList(email, name, null, 0, null, null, null, 0, null, null, state));
|
||||
}
|
||||
var emails = new ArrayList<String>();
|
||||
while (rs.next()) emails.add(rs.getString(EMAIL));
|
||||
rs.close();
|
||||
for (String email : emails) list.add(load(email));
|
||||
} catch (SQLException e) {
|
||||
LOG.warn("Listing mailing lists failed: ", e);
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public class User {
|
||||
|
||||
|
||||
private boolean matching(String password) {
|
||||
if (hashedPass == null && password == null) return true;
|
||||
if (hashedPass == null) return password == null;
|
||||
return hashedPass.equals(Util.sha256(password+salt));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user