src/main/java/de/unixwork/im/Xmpp.java

Mon, 30 Dec 2024 13:15:48 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 30 Dec 2024 13:15:48 +0100
changeset 5
d05262580576
parent 4
856befba7674
permissions
-rw-r--r--

add exec maven plugin

0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 package de.unixwork.im;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 import java.io.IOException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 import java.util.ArrayList;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 import java.util.List;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 import java.util.concurrent.BlockingQueue;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 import java.util.concurrent.LinkedBlockingQueue;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 import java.util.logging.Level;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 import java.util.logging.Logger;
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
11 import net.java.otr4j.OtrException;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
12 import net.java.otr4j.OtrPolicy;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
13 import net.java.otr4j.OtrPolicyImpl;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
14 import net.java.otr4j.OtrSessionManager;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
15 import net.java.otr4j.OtrSessionManagerImpl;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
16 import net.java.otr4j.session.InstanceTag;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
17 import net.java.otr4j.session.Session;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
18 import net.java.otr4j.session.SessionID;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
19 import net.java.otr4j.session.SessionImpl;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
20 import net.java.otr4j.session.TLV;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 import org.jivesoftware.smack.ConnectionConfiguration;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 import org.jivesoftware.smack.SmackException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 import org.jivesoftware.smack.XMPPException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 import org.jivesoftware.smack.filter.MessageWithBodiesFilter;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 import org.jivesoftware.smack.packet.Message;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 import org.jivesoftware.smack.packet.MessageBuilder;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
27 import org.jivesoftware.smack.packet.Presence;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28 import org.jivesoftware.smack.roster.Roster;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 import org.jivesoftware.smack.roster.RosterEntry;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 import org.jivesoftware.smack.tcp.XMPPTCPConnection;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
32 import org.jxmpp.jid.Jid;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 import org.jxmpp.stringprep.XmppStringprepException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 public class Xmpp extends Thread {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 private final XMPPTCPConnectionConfiguration config;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 private XMPPTCPConnection connection = null;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
40 private final OTR otr;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
41
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
42 private final OtrSessionManager otrSM;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
43
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 // BlockingQueue for event-driven communication
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 private final BlockingQueue<XmppEvent> eventQueue = new LinkedBlockingQueue<>();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 public Xmpp(XMPPTCPConnectionConfiguration xmppConfig) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 config = xmppConfig;
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
49 otr = new OTR(this);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
50 otrSM = new OtrSessionManagerImpl(otr);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
51 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
52
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
53 public OTR getOTR() {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
54 return otr;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
55 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
56
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
57 public OtrSessionManager getOtrSM() {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
58 return otrSM;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
59 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
60
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
61 public void startOTR(String xid) {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
62 String account = config.getUsername() + "@" + config.getHostString() + "/IM5";
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
63 SessionID sid = new SessionID(account, xid, "xmpp");
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
64
4
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
65 Session session = otrSM.getSession(sid); //new SessionImpl(sid, otr);
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
66 try {
4
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
67 System.out.println("otr session start");
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
68 session.startSession();
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
69 } catch (OtrException ex) {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
70 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
71 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
72
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 // Method to send a message (this will be called from another thread)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 public void sendMessage(String to, String message, boolean encrypted) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 XmppMessage event = new XmppMessage(to, message, encrypted);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 eventQueue.put(event); // Block if the queue is full
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 } catch (InterruptedException e) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, "Error adding event to queue", e);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
85 public void send(String to, String message) {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
86 sendMessage(to, message, false);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
87 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
88
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 private void connect() throws SmackException, IOException, XMPPException, InterruptedException {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 connection = new XMPPTCPConnection(config);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 connection.setUseStreamManagement(false);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 connection.connect();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 connection.login();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 public List<RosterEntry> getRosterItems() throws SmackException.NotLoggedInException, SmackException.NotConnectedException, InterruptedException {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 // Ensure we are connected
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 if (connection != null && connection.isConnected()) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 // Get the roster instance
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 Roster roster = Roster.getInstanceFor(connection);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 // Fetch all roster entries (contacts)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 roster.reload();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 // Add all roster entries to the list
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 ArrayList<RosterEntry> rosterList = new ArrayList<>(16);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 roster.getEntries().forEach(entry -> rosterList.add(entry));
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 // Optionally, print the list to verify
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 System.out.println("Roster List: ");
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 for (RosterEntry entry : rosterList) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 System.out.println("Contact: " + entry.getUser());
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 return rosterList;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 } else {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 System.out.println("Not connected to XMPP server.");
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 } catch (SmackException e) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, "Error getting roster items", e);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 return null;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 @Override
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 public void run() {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 connect();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 connection.addAsyncStanzaListener((stanza -> {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 var jid = stanza.getFrom();
4
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
133 boolean isSecure = false;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 if(jid != null) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 String body = ((Message)stanza).getBody();
4
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
136 if(body.startsWith("?OTR")) {
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
137 String account = config.getUsername() + "@" + config.getHostString() + "/IM5";
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
138 SessionID sid = new SessionID(account, jid.asBareJid().toString(), "xmpp");
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
139 Session sn = otrSM.getSession(sid);
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
140 String cryptoMsg = body;
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
141 body = null;
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
142 try {
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
143 String otrMsg = sn.transformReceiving(cryptoMsg);
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
144 System.out.println("otr transformed: " + otrMsg);
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
145 body = otrMsg;
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
146 isSecure = true;
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
147 } catch (OtrException ex) {
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
148 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
149 }
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
150 }
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
151
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
152 if(body != null) {
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
153 App.getInstance().dispatchMessage(jid, body, isSecure);
856befba7674 add minimally working otr
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
154 }
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 }
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
156 }), MessageWithBodiesFilter.INSTANCE);
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
157 connection.addAsyncStanzaListener(stanza -> {
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
158 if (stanza instanceof Presence) {
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
159 Presence presence = (Presence) stanza;
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
160 Jid from = presence.getFrom();
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
161 Presence.Type type = presence.getType();
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
162 App.getInstance().handlePresence(from, type);
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
163 }
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
164 }, stanza -> stanza instanceof Presence);
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 List<RosterEntry> roster = getRosterItems();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 if(roster != null) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 App.getInstance().setContacts(roster);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 while (true) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 // Wait for an event (message to send)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 XmppEvent event = eventQueue.take(); // This will block until an event is available
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 event.exec(this, connection);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 } catch (SmackException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 } catch (IOException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179 } catch (XMPPException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 } catch (InterruptedException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 class XmppMessage implements XmppEvent {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 String to;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 String message;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 boolean encrypted;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 XmppMessage(String to, String message, boolean encrypted) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 this.to = to;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 this.message = message;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 this.encrypted = encrypted;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 public void exec(Xmpp xmpp, XMPPTCPConnection conn) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 final Message msg;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201 msg = MessageBuilder.buildMessage()
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
202 .to(to)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 .setBody(message)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 .build();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 conn.sendStanza(msg);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 } catch (XmppStringprepException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 Logger.getLogger(XmppMessage.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 } catch (SmackException.NotConnectedException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 Logger.getLogger(XmppMessage.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210 } catch (InterruptedException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 Logger.getLogger(XmppMessage.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214 }

mercurial