aboutsummaryrefslogtreecommitdiff
path: root/juick-xmpp/src/main/java/com/juick/components/s2s
diff options
context:
space:
mode:
Diffstat (limited to 'juick-xmpp/src/main/java/com/juick/components/s2s')
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/CleaningUp.java67
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java3
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java30
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java15
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java514
5 files changed, 21 insertions, 608 deletions
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/CleaningUp.java b/juick-xmpp/src/main/java/com/juick/components/s2s/CleaningUp.java
deleted file mode 100644
index 45933141..00000000
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/CleaningUp.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008-2017, Juick
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package com.juick.components.s2s;
-
-import com.juick.components.XMPPServer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.annotation.Scheduled;
-
-import javax.inject.Inject;
-import java.util.Iterator;
-
-/**
- *
- * @author ugnich
- */
-public class CleaningUp {
-
- private static final Logger logger = LoggerFactory.getLogger(CleaningUp.class);
-
- @Inject
- XMPPServer xmpp;
-
- @Scheduled(fixedDelay = 10000)
- public void cleanUp() {
- long now = System.currentTimeMillis();
-
- synchronized (xmpp.getOutConnections()) {
- for (Iterator<ConnectionOut> i = xmpp.getOutConnections().iterator(); i.hasNext(); ) {
- ConnectionOut c = i.next();
- int inactive = (int) ((double) (now - c.tsLocalData) / 1000.0);
- if (inactive > 900) {
- logger.info("closing idle outgoing connection to {}", c.to);
- c.closeConnection();
- i.remove();
- }
- }
- }
-
- synchronized (xmpp.getInConnections()) {
- for (Iterator<ConnectionIn> i = xmpp.getInConnections().iterator(); i.hasNext(); ) {
- ConnectionIn c = i.next();
- int inactive = (int) ((double) (now - c.tsRemoteData) / 1000.0);
- if (inactive > 900) {
- logger.info("closing idle incoming connection from {}", c.from);
- c.closeConnection();
- i.remove();
- }
- }
- }
- }
-}
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java b/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
index 693b278e..7fd036eb 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
@@ -33,6 +33,7 @@ import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.cert.CertificateException;
+import java.util.UUID;
/**
*
@@ -74,7 +75,6 @@ public class Connection {
public Connection(XMPPServer xmpp) throws XmlPullParserException, KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, KeyManagementException {
this.xmpp = xmpp;
tsCreated = System.currentTimeMillis();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
KeyStore ks = KeyStore.getInstance("JKS");
try (InputStream ksIs = new FileInputStream(xmpp.keystore)) {
ks.load(ksIs, xmpp.keystorePassword.toCharArray());
@@ -146,6 +146,7 @@ public class Connection {
}
public void restartParser() throws XmlPullParserException, IOException {
+ streamID = UUID.randomUUID().toString();
parser = factory.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
parser.setInput(new InputStreamReader(socket.getInputStream()));
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java
index eed72a18..e6f404ef 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java
@@ -22,8 +22,8 @@ import com.juick.xmpp.extensions.StreamError;
import com.juick.xmpp.utils.XmlUtils;
import org.apache.commons.lang3.StringUtils;
import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
import rocks.xmpp.addr.Jid;
-import rocks.xmpp.core.session.XmppSessionConfiguration;
import rocks.xmpp.core.stanza.model.Stanza;
import javax.net.ssl.SSLException;
@@ -35,7 +35,13 @@ import java.io.IOException;
import java.io.StringReader;
import java.net.Socket;
import java.net.SocketException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.UUID;
@@ -47,9 +53,8 @@ public class ConnectionIn extends Connection implements Runnable {
final public List<String> from = new ArrayList<>();
public long tsRemoteData = 0;
public long packetsRemote = 0;
- XmppSessionConfiguration configuration;
- public ConnectionIn(XMPPServer xmpp, Socket socket) throws Exception {
+ public ConnectionIn(XMPPServer xmpp, Socket socket) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, XmlPullParserException, KeyManagementException, KeyStoreException, IOException {
super(xmpp);
this.socket = socket;
restartParser();
@@ -83,7 +88,7 @@ public class ConnectionIn extends Connection implements Runnable {
boolean xmppversionnew = parser.getAttributeValue(null, "version") != null;
String from = parser.getAttributeValue(null, "from");
- if (xmpp.bannedHosts.contains(from)) {
+ if (Arrays.asList(xmpp.bannedHosts).contains(from)) {
closeConnection();
return;
}
@@ -121,17 +126,14 @@ public class ConnectionIn extends Connection implements Runnable {
String vid = parser.getAttributeValue(null, "id");
String vkey = XmlUtils.getTagText(parser);
updateTsRemoteData();
- boolean valid = false;
+ final boolean[] valid = {false};
if (vfrom != null && vto != null && vid != null && vkey != null) {
- ConnectionOut c = xmpp.getConnectionOut(vfrom, false);
- if (c == null) {
- logger.warn("outgoing connection to {} not found", vfrom);
- } else {
+ xmpp.getConnectionOut(vfrom, false).ifPresent(c -> {
String dialbackKey = c.dbKey;
- valid = vkey.equals(dialbackKey);
- }
+ valid[0] = vkey.equals(dialbackKey);
+ });
}
- if (valid) {
+ if (valid[0]) {
sendStanza("<db:verify from='" + vto + "' to='" + vfrom + "' id='" + vid + "' type='valid'/>");
logger.info("stream from {} {} dialback verify valid", vfrom, streamID);
} else {
@@ -154,7 +156,7 @@ public class ConnectionIn extends Connection implements Runnable {
String xml = XmlUtils.parseToString(parser, false);
if (type == null || !type.equals("error")) {
logger.info("stream {} iq: {}", streamID, xml);
- xmpp.getRouter().sendStanza(parse(xml));
+ xmpp.onStanzaReceived(parse(xml));
}
} else if (sc != null && !isSecured() && tag.equals("starttls")) {
logger.info("stream {} securing", streamID);
@@ -209,7 +211,7 @@ public class ConnectionIn extends Connection implements Runnable {
xmpp.HOSTNAME + "' id='" + streamID + "' version='1.0'>";
if (xmppversionnew) {
openStream += "<stream:features>";
- if (sc != null && !isSecured() && !xmpp.brokenSSLhosts.contains(from)) {
+ if (sc != null && !isSecured() && !Arrays.asList(xmpp.brokenSSLhosts).contains(from)) {
openStream += "<starttls xmlns=\"" + NS_TLS + "\"><optional/></starttls>";
}
openStream += "</stream:features>";
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java
index 903eec0c..589ed18a 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java
@@ -38,6 +38,7 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
+import java.util.Arrays;
import java.util.UUID;
/**
@@ -97,7 +98,6 @@ public class ConnectionOut extends Connection implements Runnable {
}
logger.info("stream to {} {} open", to, streamID);
- xmpp.addConnectionOut(ConnectionOut.this);
boolean xmppversionnew = parser.getAttributeValue(null, "version") != null;
if (!xmppversionnew) {
processDialback();
@@ -131,15 +131,12 @@ public class ConnectionOut extends Connection implements Runnable {
String type = parser.getAttributeValue(null, "type");
String sid = parser.getAttributeValue(null, "id");
if (from != null && from.equals(to) && sid != null && !sid.isEmpty() && type != null) {
- ConnectionIn c = xmpp.getConnectionIn(sid);
- if (c != null) {
- c.sendDialbackResult(from, type);
- }
+ xmpp.getConnectionIn(sid).ifPresent(c -> c.sendDialbackResult(from, type));
}
XmlUtils.skip(parser);
} else if (tag.equals("features") && parser.getNamespace().equals(NS_STREAM)) {
StreamFeatures features = StreamFeatures.parse(parser);
- if (sc != null && !isSecured() && features.STARTTLS >= 0 && !xmpp.brokenSSLhosts.contains(to)) {
+ if (sc != null && !isSecured() && features.STARTTLS >= 0 && !Arrays.asList(xmpp.brokenSSLhosts).contains(to)) {
logger.info("stream to {} {} securing", to, streamID);
sendStanza("<starttls xmlns=\"" + NS_TLS + "\" />");
} else {
@@ -191,10 +188,4 @@ public class ConnectionOut extends Connection implements Runnable {
sendStanza("<db:verify from='" + xmpp.HOSTNAME + "' to='" + to + "' id='" + sid + "'>" +
key + "</db:verify>");
}
-
- @Override
- public void restartParser() throws XmlPullParserException, IOException {
- super.restartParser();
- streamID = UUID.randomUUID().toString();
- }
}
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java b/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java
deleted file mode 100644
index 2a7e02e9..00000000
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Copyright (C) 2008-2017, Juick
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package com.juick.components.s2s;
-
-import com.juick.User;
-import com.juick.components.XMPPServer;
-import com.juick.formatters.PlainTextFormatter;
-import org.apache.commons.lang3.StringUtils;
-import org.ocpsoft.prettytime.PrettyTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import rocks.xmpp.addr.Jid;
-import rocks.xmpp.core.stanza.model.Message;
-import rocks.xmpp.core.stanza.model.Presence;
-import rocks.xmpp.core.stanza.model.Stanza;
-import rocks.xmpp.core.stanza.model.StanzaError;
-import rocks.xmpp.core.stanza.model.client.ClientMessage;
-import rocks.xmpp.core.stanza.model.client.ClientPresence;
-import rocks.xmpp.core.stanza.model.errors.Condition;
-
-import javax.inject.Inject;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-/**
- *
- * @author ugnich
- */
-public class JuickBot implements StanzaListener, AutoCloseable {
-
- private static final Logger logger = LoggerFactory.getLogger(JuickBot.class);
-
- XMPPServer xmpp;
- PrettyTime pt;
-
- @Inject
- public JuickBot(XMPPServer xmpp) {
- this.xmpp = xmpp;
- xmpp.addStanzaListener(this);
- broadcastPresence(null);
- pt = new PrettyTime(new Locale("ru"));
- }
-
- private static final String HELPTEXT =
- "@username text - Send private message\n"
- + "*tagname Blah-blah-blah - Post a message with tag 'tagname'\n"
- + "#1234 Blah-blah-blah - Answer to message #1234\n"
- + "#1234/5 Blah - Answer to reply #1234/5\n"
- + "! #1234 - Recommend post\n"
- + "\n"
- + "# - Show last messages from your feed (## - second page, ...)\n"
- + "@ - Show recomendations and popular personal blogs\n"
- + "* - Show your tags\n"
- + "#1234 - Show message\n"
- + "#1234+ - Show message with replies\n"
- + "@username - Show user's info\n"
- + "@username+ - Show user's info and last 10 messages\n"
- + "@username *tag - User's messages with this tag\n"
- + "*tag - Show last 10 messages with this tag\n"
- + "? blah - Search posts for 'blah'\n"
- + "? @username blah - Searching among user\'s posts for 'blah'\n"
- + "D #123 - Delete message\n"
- + "D #123/45 - Delete reply\n"
- + "DL - Delete last message/reply\n"
- + "S - Show your subscriptions\n"
- + "S #123 - Subscribe to message replies\n"
- + "S @username - Subscribe to user's blog\n"
- + "U #123 - Unsubscribe from comments\n"
- + "U @username - Unsubscribe from user's blog\n"
- + "BL - Show your blacklist\n"
- + "BL @username - Add/delete user to/from your blacklist\n"
- + "BL *tag - Add/delete tag to/from your blacklist\n"
- + "ON / OFF - Enable/disable subscriptions delivery\n"
- + "PING - Pong\n"
- + "\n"
- + "Read more: http://juick.com/help/";
-
- public boolean incomingPresence(Presence p) {
- final String username = p.getTo().getLocal();
- final boolean toJuick = username.equals(xmpp.getJid().getLocal());
-
- if (p.getType() == null) {
- Presence reply = new Presence();
- reply.setFrom(p.getTo().asBareJid());
- reply.setTo(p.getFrom().asBareJid());
- reply.setType(Presence.Type.UNSUBSCRIBE);
- xmpp.sendOut(ClientPresence.from(reply));
- return true;
- } else if (p.getType().equals(Presence.Type.PROBE)) {
- int uid_to = 0;
- if (!toJuick) {
- uid_to = xmpp.userService.getUIDbyName(username);
- }
-
- if (toJuick || uid_to > 0) {
- Presence reply = new Presence();
- reply.setFrom(p.getTo().withResource(xmpp.getJid().getResource()));
- reply.setTo(p.getFrom());
- reply.setPriority((byte)10);
- xmpp.sendOut(ClientPresence.from(reply));
- } else {
- Presence reply = new Presence();
- reply.setFrom(p.getTo());
- reply.setTo(p.getFrom());
- reply.setType(Presence.Type.ERROR);
- reply.setId(p.getId());
- reply.setError(new StanzaError(StanzaError.Type.CANCEL, Condition.ITEM_NOT_FOUND));
- xmpp.sendOut(ClientPresence.from(reply));
- return true;
- }
- return true;
- } else if (p.getType().equals(Presence.Type.SUBSCRIBE)) {
- boolean canSubscribe = false;
- if (toJuick) {
- canSubscribe = true;
- } else {
- int uid_to = xmpp.userService.getUIDbyName(username);
- if (uid_to > 0) {
- xmpp.pmQueriesService.addPMinRoster(uid_to, p.getFrom().asBareJid().toEscapedString());
- canSubscribe = true;
- }
- }
-
- if (canSubscribe) {
- Presence reply = new Presence();
- reply.setFrom(p.getTo());
- reply.setTo(p.getFrom());
- reply.setType(Presence.Type.SUBSCRIBED);
- xmpp.sendOut(ClientPresence.from(reply));
-
- reply.setFrom(reply.getFrom().withResource(xmpp.getJid().getResource()));
- reply.setPriority((byte) 10);
- reply.setType(null);
- xmpp.sendOut(ClientPresence.from(reply));
-
- return true;
- } else {
- Presence reply = new Presence();
- reply.setFrom(p.getTo());
- reply.setTo(p.getFrom());
- reply.setType(Presence.Type.ERROR);
- reply.setId(p.getId());
- reply.setError(new StanzaError(StanzaError.Type.CANCEL, Condition.ITEM_NOT_FOUND));
- xmpp.sendOut(ClientPresence.from(reply));
- return true;
- }
- } else if (p.getType().equals(Presence.Type.UNSUBSCRIBE)) {
- if (!toJuick) {
- int uid_to = xmpp.userService.getUIDbyName(username);
- if (uid_to > 0) {
- xmpp.pmQueriesService.removePMinRoster(uid_to, p.getFrom().asBareJid().toEscapedString());
- }
- }
-
- Presence reply = new Presence();
- reply.setFrom(p.getTo());
- reply.setTo(p.getFrom());
- reply.setType(Presence.Type.UNSUBSCRIBED);
- xmpp.sendOut(ClientPresence.from(reply));
- }
-
- return false;
- }
-
- public boolean incomingMessage(Message msg) {
- if (StringUtils.isBlank(msg.getBody()) || (msg.getType() != null && msg.getType().equals(Message.Type.ERROR))) {
- return false;
- }
-
- String username = msg.getTo().getLocal();
-
- User user_from;
- String signuphash = StringUtils.EMPTY;
- user_from = xmpp.userService.getUserByJID(msg.getFrom().asBareJid().toEscapedString());
- if (user_from == null) {
- signuphash = xmpp.userService.getSignUpHashByJID(msg.getFrom().asBareJid().toEscapedString());
- }
-
- if (user_from == null) {
- Message reply = new Message();
- reply.setFrom(msg.getTo());
- reply.setTo(msg.getFrom());
- reply.setType(Message.Type.CHAT);
- if (username.equals(xmpp.getJid().getLocal())) {
- reply.setBody("Для того, чтобы начать пользоваться сервисом, пожалуйста пройдите быструю регистрацию: http://juick.com/signup?type=xmpp&hash=" + signuphash + "\nЕсли у вас уже есть учетная запись на Juick, вы сможете присоединить этот JabberID к ней.\n\nTo start using Juick, please sign up: http://juick.com/signup?type=xmpp&hash=" + signuphash + "\nIf you already have an account on Juick, you will be proposed to attach this JabberID to your existing account.");
- } else {
- reply.setBody("Внимание, системное сообщение!\nВаш JabberID не обнаружен в списке доверенных. Для того, чтобы отправить сообщение пользователю " + username + "@juick.com, пожалуйста зарегистрируйте свой JabberID в системе: http://juick.com/signup?type=xmpp&hash=" + signuphash + "\nЕсли у вас уже есть учетная запись на Juick, вы сможете присоединить этот JabberID к ней.\n\nWarning, system message!\nYour JabberID is not found in our server's white list. To send a message to " + username + "@juick.com, please sign up: http://juick.com/signup?type=xmpp&hash=" + signuphash + "\nIf you already have an account on Juick, you will be proposed to attach this JabberID to your existing account.");
- }
- xmpp.sendOut(ClientMessage.from(reply));
- return true;
- }
-
- if (username.equals(xmpp.getJid().getLocal())) {
- return incomingMessageJuick(user_from, msg);
- }
-
- int uid_to = xmpp.userService.getUIDbyName(username);
-
- if (uid_to == 0) {
- Message reply = new Message();
- reply.setFrom(msg.getTo());
- reply.setTo(msg.getFrom());
- reply.setType(Message.Type.ERROR);
- reply.setId(msg.getId());
- reply.setError(new StanzaError(StanzaError.Type.CANCEL, Condition.ITEM_NOT_FOUND));
- xmpp.sendOut(ClientMessage.from(reply));
- return true;
- }
-
- boolean success = false;
- if (!xmpp.userService.isInBLAny(uid_to, user_from.getUid())) {
- success = xmpp.pmQueriesService.createPM(user_from.getUid(), uid_to, msg.getBody());
- }
-
- if (success) {
- Message m = new Message();
- m.setFrom(xmpp.getJid().asBareJid());
- m.setTo(Jid.of(Integer.toString(uid_to), "push.juick.com", null));
- com.juick.Message jmsg = new com.juick.Message();
- jmsg.setUser(user_from);
- jmsg.setText(msg.getBody());
- m.addExtension(jmsg);
- xmpp.getRouter().sendStanza(m);
-
- m.setTo(Jid.of(Integer.toString(uid_to), "ws.juick.com", null));
- xmpp.getRouter().sendStanza(m);
-
- List<String> jids;
- boolean inroster = false;
- jids = xmpp.userService.getJIDsbyUID(uid_to);
- for (String jid : jids) {
- Message mm = new Message();
- mm.setTo(Jid.of(jid));
- mm.setType(Message.Type.CHAT);
- inroster = xmpp.pmQueriesService.havePMinRoster(user_from.getUid(), jid);
- if (inroster) {
- mm.setFrom(Jid.of(jmsg.getUser().getName(), "juick.com", "Juick"));
- mm.setBody(msg.getBody());
- } else {
- mm.setFrom(xmpp.getJid());
- mm.setBody("Private message from @" + jmsg.getUser().getName() + ":\n" + msg.getBody());
- }
- xmpp.sendOut(ClientMessage.from(mm));
- }
- } else {
- Message reply = new Message();
- reply.setFrom(msg.getTo());
- reply.setTo(msg.getFrom());
- reply.setType(Message.Type.ERROR);
- reply.setId(msg.getId());
- reply.setError(new StanzaError(StanzaError.Type.CANCEL, Condition.NOT_ALLOWED));
- xmpp.sendOut(ClientMessage.from(reply));
- }
-
- return false;
- }
- private static Pattern regexPM = Pattern.compile("^\\@(\\S+)\\s+([\\s\\S]+)$");
-
- public boolean incomingMessageJuick(User user_from, Message msg) {
- String command = msg.getBody().trim();
- int commandlen = command.length();
-
- // COMPATIBILITY
- if (commandlen > 7 && command.substring(0, 3).equalsIgnoreCase("PM ")) {
- command = command.substring(3).trim();
- commandlen = command.length();
- }
-
- if (commandlen == 4) {
- if (command.equalsIgnoreCase("PING")) {
- commandPing(msg);
- return true;
- } else if (command.equalsIgnoreCase("HELP")) {
- commandHelp(msg);
- return true;
- }
- } else if (commandlen == 5 && command.equalsIgnoreCase("LOGIN")) {
- commandLogin(msg, user_from);
- return true;
- } else if (command.charAt(0) == '@') {
- Matcher matchPM = regexPM.matcher(command);
- if (matchPM.find()) {
- String user_to = matchPM.group(1);
- String msgtxt = matchPM.group(2);
- commandPM(msg, user_from, user_to, msgtxt);
- return true;
- }
- } else if (commandlen == 2 && command.equalsIgnoreCase("BL")) {
- commandBLShow(msg, user_from);
- return true;
- } else if (commandlen == 2 && command.equalsIgnoreCase("#+")) {
- return commandLast(msg.getFrom());
- } else if (command.equalsIgnoreCase("@")) {
- return commandUsers(msg.getFrom());
- }
-
- return false;
- }
-
- private void commandPing(Message m) {
- Presence p = new Presence(m.getFrom());
- p.setFrom(xmpp.getJid());
- p.setPriority((byte) 10);
- xmpp.sendOut(ClientPresence.from(p));
-
- sendReply(m.getFrom(), "PONG");
- }
-
- private void commandHelp(Message m) {
- sendReply(m.getFrom(), HELPTEXT);
- }
-
- private void commandLogin(Message m, User user_from) {
- sendReply(m.getFrom(), "http://juick.com/login?hash=" + xmpp.userService.getHashByUID(user_from.getUid()));
- }
-
- private void commandPM(Message m, User user_from, String user_to, String body) {
- int ret = 0;
-
- int uid_to = 0;
- List<String> jids_to = null;
- boolean haveInRoster = false;
-
- if (user_to.indexOf('@') > 0) {
- uid_to = xmpp.userService.getUIDbyJID(user_to);
- } else {
- uid_to = xmpp.userService.getUIDbyName(user_to);
- }
-
- if (uid_to > 0) {
- if (!xmpp.userService.isInBLAny(uid_to, user_from.getUid())) {
- if (xmpp.pmQueriesService.createPM(user_from.getUid(), uid_to, body)) {
- jids_to = xmpp.userService.getJIDsbyUID(uid_to);
- ret = 200;
- } else {
- ret = 500;
- }
- } else {
- ret = 403;
- }
- } else {
- ret = 404;
- }
-
- if (ret == 200) {
- Message msg = new Message();
- msg.setFrom(xmpp.getJid().asBareJid());
- msg.setTo(Jid.of(Integer.toString(uid_to), "push.juick.com", null));
- com.juick.Message jmsg = new com.juick.Message();
- jmsg.setUser(user_from);
- jmsg.setText(body);
- msg.addExtension(jmsg);
- xmpp.getRouter().sendStanza(msg);
-
- msg.setTo(Jid.of(Integer.toString(uid_to), "ws.juick.com", null));
- xmpp.getRouter().sendStanza(msg);
-
- for (String jid : jids_to) {
- Message mm = new Message();
- mm.setTo(Jid.of(jid));
- mm.setType(Message.Type.CHAT);
- haveInRoster = xmpp.pmQueriesService.havePMinRoster(user_from.getUid(), jid);
- if (haveInRoster) {
- mm.setFrom(Jid.of(user_from.getName(), "juick.com", "Juick"));
- mm.setBody(body);
- } else {
- mm.setFrom(xmpp.getJid());
- mm.setBody("Private message from @" + user_from.getName() + ":\n" + body);
- }
- xmpp.sendOut(ClientMessage.from(mm));
- }
- }
-
- Message reply = new Message();
- reply.setFrom(m.getTo());
- reply.setTo(m.getFrom());
- if (ret == 200) {
- reply.setType(m.getType());
- reply.setBody("Private message sent");
- } else {
- reply.setType(Message.Type.ERROR);
- reply.setBody("Error " + ret);
- }
- xmpp.sendOut(ClientMessage.from(reply));
- }
-
- private void commandBLShow(Message m, User user_from) {
- List<User> blusers = xmpp.userService.getUserBLUsers(user_from.getUid());
- List<String> bltags = xmpp.tagService.getUserBLTags(user_from.getUid());
-
- String txt = StringUtils.EMPTY;
- if (bltags.size() > 0) {
- for (String bltag : bltags) {
- txt += "*" + bltag + "\n";
- }
-
- if (blusers.size() > 0) {
- txt += "\n";
- }
- }
- if (blusers.size() > 0) {
- for (User bluser : blusers) {
- txt += "@" + bluser.getName() + "\n";
- }
- }
- if (txt.isEmpty()) {
- txt = "You don't have any users or tags in your blacklist.";
- }
-
- sendReply(m.getFrom(), txt);
- }
-
- boolean commandLast(Jid jidFrom) {
- User user = xmpp.userService.getUserByJID(jidFrom.asBareJid().toEscapedString());
- sendReply(jidFrom, "Last messages:\n"
- + printMessages(xmpp.messagesService.getAll(user.getUid(), 0), true));
- return true;
- }
-
- boolean commandUsers(Jid jidFrom) {
- StringBuilder msg = new StringBuilder();
- msg.append("Recommended blogs");
- User currentUser = xmpp.userService.getUserByJID(jidFrom.asBareJid().toEscapedString());
- List<String> recommendedUsers = xmpp.showQueriesService.getRecommendedUsers(currentUser);
- if (recommendedUsers.size() > 0) {
- for (String user : recommendedUsers) {
- msg.append("\n@").append(user);
- }
- } else {
- msg.append("\nNo recommendations now. Subscribe to more blogs. ;)");
- }
- msg.append("\n\nTop 10 personal blogs:");
- List<String> topUsers = xmpp.showQueriesService.getTopUsers();
- if (topUsers.size() > 0) {
- for (String user : topUsers) {
- msg.append("\n@").append(user);
- }
- } else {
- msg.append("\nNo top users. Empty DB? ;)");
- }
- sendReply(jidFrom, msg.toString());
- return true;
- }
-
- void sendReply(Jid jidTo, String txt) {
- Message reply = new Message();
- reply.setFrom(xmpp.getJid());
- reply.setTo(jidTo);
- reply.setType(Message.Type.CHAT);
- reply.setBody(txt);
- xmpp.sendOut(ClientMessage.from(reply));
- }
-
- @Override
- public void stanzaReceived(Stanza xmlValue) {
- if (xmlValue instanceof Presence) {
- Presence p = (Presence) xmlValue;
- if (p.getType() == null || !p.getType().equals(Presence.Type.ERROR)) {
- incomingPresence(p);
- }
- } else if (xmlValue instanceof Message) {
- Message msg = (Message) xmlValue;
- if (!incomingMessage(msg)) {
- xmpp.getRouter().sendStanza(msg);
- }
- }
- }
-
- String printMessages(List<Integer> mids, boolean crop) {
- return xmpp.messagesService.getMessages(mids).stream()
- .sorted(Collections.reverseOrder())
- .map(PlainTextFormatter::formatPostSummary).collect(Collectors.joining("\n\n"));
- }
-
- void broadcastPresence(Presence.Type type) {
- Presence presence = new Presence();
- presence.setFrom(xmpp.getJid());
- if (type != null) {
- presence.setType(type);
- }
- xmpp.userService.getActiveJIDs().forEach(j -> {
- try {
- presence.setTo(Jid.of(j));
- xmpp.sendOut(ClientPresence.from(presence));
- } catch (IllegalArgumentException ex) {
- logger.warn("Invalid jid: {}", j, ex);
- }
- });
- }
-
- @Override
- public void close() throws Exception {
- broadcastPresence(Presence.Type.UNAVAILABLE);
- }
-}