diff --git a/src/main/java/org/qortal/api/resource/ChatResource.java b/src/main/java/org/qortal/api/resource/ChatResource.java index 4e60eb20..9a8fc8d5 100644 --- a/src/main/java/org/qortal/api/resource/ChatResource.java +++ b/src/main/java/org/qortal/api/resource/ChatResource.java @@ -227,10 +227,14 @@ public class ChatResource { chatTransaction.computeNonce(); + // Re-check, but ignores signature result = chatTransaction.isValidUnconfirmed(); if (result != ValidationResult.OK) throw TransactionsResource.createTransactionInvalidException(request, result); + // Strip zeroed signature + transactionData.setSignature(null); + byte[] bytes = ChatTransactionTransformer.toBytes(transactionData); return Base58.encode(bytes); } catch (TransformationException e) { diff --git a/src/main/java/org/qortal/data/chat/ActiveChats.java b/src/main/java/org/qortal/data/chat/ActiveChats.java index 59a13ca7..28dce56a 100644 --- a/src/main/java/org/qortal/data/chat/ActiveChats.java +++ b/src/main/java/org/qortal/data/chat/ActiveChats.java @@ -12,13 +12,14 @@ public class ActiveChats { public static class GroupChat { private int groupId; private String groupName; - private long timestamp; + // Might not be present for groupId 0 + private Long timestamp; protected GroupChat() { /* JAXB */ } - public GroupChat(int groupId, String groupName, long timestamp) { + public GroupChat(int groupId, String groupName, Long timestamp) { this.groupId = groupId; this.groupName = groupName; this.timestamp = timestamp; @@ -32,7 +33,7 @@ public class ActiveChats { return this.groupName; } - public long getTimestamp() { + public Long getTimestamp() { return this.timestamp; } } diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java index 528f71c2..e8dd2b31 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java @@ -145,6 +145,28 @@ public class HSQLDBChatRepository implements ChatRepository { throw new DataException("Unable to fetch active group chats from repository", e); } + // We need different SQL to handle group-less chat + String grouplessSql = "SELECT created_when " + + "FROM ChatTransactions " + + "JOIN Transactions USING (signature) " + + "WHERE tx_group_id = 0 " + + "AND recipient IS NULL " + + "ORDER BY created_when DESC " + + "LIMIT 1"; + + try (ResultSet resultSet = this.repository.checkedExecute(grouplessSql)) { + Long timestamp = null; + + if (resultSet != null) + // We found a recipient-less, group-less CHAT message, so report its timestamp + timestamp = resultSet.getLong(1); + + GroupChat groupChat = new GroupChat(0, null, timestamp); + groupChats.add(groupChat); + } catch (SQLException e) { + throw new DataException("Unable to fetch active group chats from repository", e); + } + return groupChats; }