Skip to content

Commit 7bb0504

Browse files
committed
Okay, finally for this streak, we make channels and signing available in this CLI.
1 parent fef23b3 commit 7bb0504

23 files changed

Lines changed: 366 additions & 391 deletions

libs/SharkPKI.jar

439 Bytes
Binary file not shown.

src/net/sharksystem/cmdline/sharkmessengerUI/ProductionUI.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.sharksystem.cmdline.sharkmessengerUI.commands.hubmanagement.UICommandListHub;
1515
import net.sharksystem.cmdline.sharkmessengerUI.commands.hubmanagement.UICommandStartHub;
1616
import net.sharksystem.cmdline.sharkmessengerUI.commands.hubmanagement.UICommandStopHub;
17+
import net.sharksystem.cmdline.sharkmessengerUI.commands.persons.UICommandListPersons;
1718
import net.sharksystem.cmdline.sharkmessengerUI.commands.testing.UICommandSaveLog;
1819
import net.sharksystem.cmdline.sharkmessengerUI.commands.testing.UICommandShowLog;
1920
import net.sharksystem.cmdline.sharkmessengerUI.commands.simpleMessenger.*;
@@ -116,8 +117,7 @@ public static void main(String[] args) throws SharkException, IOException {
116117
smUI.addCommand(new UICommandDestroyPeer(sharkMessengerApp, smUI, "destroyPeer", false));
117118

118119
// simple messenger
119-
smUI.addCommand(new UICommandSendMessage(sharkMessengerApp, smUI, "sendMessage", true));
120-
smUI.addCommand(new UICommandGetMessageDetails(sharkMessengerApp, smUI, "getMessageDetails", true));
120+
smUI.addCommand(new UICommandSendMessageExtended(sharkMessengerApp, smUI, "sendMessage", true));
121121
smUI.addCommand(new UICommandListMessages(sharkMessengerApp, smUI, "lsMessages", true));
122122

123123
// TCP connection management
@@ -129,6 +129,9 @@ public static void main(String[] args) throws SharkException, IOException {
129129
// encounter control
130130
smUI.addCommand(new UICommandShowEncounter(sharkMessengerApp, smUI, "showEncounter", false));
131131

132+
// PKI
133+
smUI.addCommand(new UICommandListPersons(sharkMessengerApp, smUI, "lsPersons", true));
134+
132135
// PKI
133136
smUI.addCommand(new UICommandShowCertificatesByIssuer(sharkMessengerApp, smUI, "certByIssuer", true));
134137
smUI.addCommand(new UICommandShowCertificatesBySubject(sharkMessengerApp, smUI, "certBySubject", true));
@@ -156,12 +159,11 @@ public static void main(String[] args) throws SharkException, IOException {
156159
smUI.addCommand(new UICommandListHub(sharkMessengerApp, smUI, "lsHubs", true));
157160

158161
// extended messenger
159-
smUI.addCommand(new UICommandSendMessageExtended(sharkMessengerApp, smUI, "sendMessageX", true));
162+
//smUI.addCommand(new UICommandSendMessageExtended(sharkMessengerApp, smUI, "sendMessageX", true));
160163
smUI.addCommand(new UICommandListChannels(sharkMessengerApp, smUI, "lsChannel", true));
161164
smUI.addCommand(new UICommandCreateChannel(sharkMessengerApp, smUI, "mkChannel", true));
162-
smUI.addCommand(new UICommandSetChannelAge(sharkMessengerApp, smUI, "setChannelAge", true));
163-
smUI.addCommand(new UICommandRemoveChannel(sharkMessengerApp, smUI, "rmChannel", true));
164-
smUI.addCommand(new UICommandListMessagesX(sharkMessengerApp, smUI, "lsMessagesX", true));
165+
//smUI.addCommand(new UICommandSetChannelAge(sharkMessengerApp, smUI, "setChannelAge", true));
166+
smUI.addCommand(new UICommandRemoveChannelByIndex(sharkMessengerApp, smUI, "rmChannel", true));
165167

166168
smUI.addCommand(new UICommandGetIdentityAssurance(sharkMessengerApp, smUI, "ia", true));
167169
smUI.addCommand(new UICommandGetSigningFailureRate(sharkMessengerApp, smUI, "getSF", true));
@@ -173,6 +175,7 @@ public static void main(String[] args) throws SharkException, IOException {
173175
smUI.addCommand(new UICommandGetNumberOfKnownPeers(sharkMessengerApp, smUI, "numPeers", true));
174176
smUI.addCommand(new UICommandCreateNewKeyPair(sharkMessengerApp, smUI, "mkKeys", true));
175177
smUI.addCommand(new UICommandGetKeysCreationTime(sharkMessengerApp, smUI, "keysTime", true));
178+
smUI.addCommand(new UICommandGetMessageDetails(sharkMessengerApp, smUI, "getMessageDetails", true));
176179

177180
smUI.printUsage();
178181
smUI.runCommandLoop();

src/net/sharksystem/cmdline/sharkmessengerUI/commands/simpleMessenger/ChannelPrinter.java renamed to src/net/sharksystem/cmdline/sharkmessengerUI/commands/extendedMessenger/ChannelPrinter.java

Lines changed: 70 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.sharksystem.cmdline.sharkmessengerUI.commands.simpleMessenger;
1+
package net.sharksystem.cmdline.sharkmessengerUI.commands.extendedMessenger;
22

33
import net.sharksystem.asap.ASAPException;
44
import net.sharksystem.asap.ASAPHop;
@@ -13,100 +13,108 @@
1313
import java.util.Set;
1414

1515
public class ChannelPrinter {
16-
private final SharkMessengerApp sharkMessengerApp;
17-
18-
public ChannelPrinter(SharkMessengerApp sharkMessengerApp) {
19-
this.sharkMessengerApp = sharkMessengerApp;
20-
}
21-
22-
public static void printChannelDescription(PrintStream ps, SharkMessengerChannel channel)
16+
public String getChannelDescription(SharkMessengerChannel channel)
2317
throws IOException, SharkMessengerException {
2418

25-
ps.print(channel.getName());
26-
ps.print(" | uri: ");
27-
ps.print(channel.getURI());
28-
ps.print(" | #messages: ");
29-
ps.print(channel.getMessages().size());
30-
ps.print(" | communication-age: ");
19+
StringBuilder sb = new StringBuilder();
20+
21+
sb.append("name: ");
22+
sb.append(channel.getName());
23+
sb.append(" | uri: ");
24+
sb.append(channel.getURI());
25+
sb.append(" | #messages: ");
26+
sb.append(channel.getMessages().size());
27+
sb.append(" | age: ");
3128
SharkCommunicationAge age = channel.getAge();
3229
switch (age) {
33-
case BRONZE_AGE: ps.print("bronze"); break;
34-
case STONE_AGE: ps.print("stone"); break;
35-
case NETWORK_AGE: ps.print("network"); break;
36-
default: ps.print("unknown"); break;
30+
case BRONZE_AGE: sb.append("bronze"); break;
31+
case STONE_AGE: sb.append("stone"); break;
32+
case NETWORK_AGE: sb.append("network"); break;
33+
default: sb.append("unknown"); break;
3734
}
35+
36+
return sb.toString();
3837
}
3938

40-
public static void printChannelDescriptions(
41-
PrintStream ps, SharkMessengerComponent messengerComponent, boolean printIndex)
39+
public String getChannelDescriptions(SharkMessengerComponent messengerComponent)
4240
throws IOException, SharkMessengerException {
4341

42+
StringBuilder sb = new StringBuilder();
43+
4444
List<CharSequence> channelUris = messengerComponent.getChannelUris();
4545
if(channelUris.isEmpty()) {
46-
ps.println("no channels");
46+
sb.append("no channels\n");
4747
} else {
48-
int i = 0;
48+
sb.append(channelUris.size());
49+
if(channelUris.size() > 1) sb.append(" channels:\n");
50+
else sb.append(" channel:\n");
51+
52+
int i = 1;
4953
for (CharSequence channelUri : channelUris) {
50-
if(printIndex) ps.print(i++ + ": ");
54+
sb.append(i++ + ": ");
5155
SharkMessengerChannel channel = messengerComponent.getChannel(channelUri);
52-
printChannelDescription(ps, channel);
56+
sb.append(this.getChannelDescription(channel));
57+
sb.append("\n");
5358
}
54-
ps.print("\n");
59+
sb.append("\n");
5560
}
56-
}
5761

58-
private static void printYesNo(PrintStream ps, boolean value) {
59-
if(value) ps.print("yes");
60-
else ps.print("no");
62+
return sb.toString();
6163
}
6264

6365
private String returnYesNo(boolean value) {
6466
if(value) return "yes";
6567
else return "no";
6668
}
6769

68-
private static final String CHANNEL_PRINTER_LINE_SEPARATOR = "--------------------------------------------------------------------------------";
69-
public void printMessages(String channelUri, PrintStream ps, SharkMessageList messages)
70+
private static final String CHANNEL_PRINTER_LINE_SEPARATOR = "\n--------------------------------------------------------------------------------\n";
71+
public String getMessagesASString(String channelUri, SharkMessageList messages)
7072
throws IOException, SharkMessengerException, ASAPException {
7173

72-
this.sharkMessengerApp.tellUI("list messages in channel: " + channelUri);
74+
StringBuilder sb = new StringBuilder();
75+
76+
sb.append("list messages in channel: " + channelUri);
7377
if(messages.size() < 1) {
74-
this.sharkMessengerApp.tellUI(": no messages");
78+
sb.append(": no messages\n");
79+
return sb.toString();
7580
}
7681
else {
82+
sb.append("\n");
7783
for (int i = 0; i < messages.size(); i++) {
78-
this.sharkMessengerApp.tellUI("#" + i);
79-
this.sharkMessengerApp.tellUI(CHANNEL_PRINTER_LINE_SEPARATOR);
84+
sb.append("#" + i);
85+
sb.append(CHANNEL_PRINTER_LINE_SEPARATOR);
8086
SharkMessage message = messages.getSharkMessage(i, true);
81-
this.printMessageDetails(message);
82-
this.sharkMessengerApp.tellUI(CHANNEL_PRINTER_LINE_SEPARATOR);
87+
sb.append(this.getMessageDetails(message));
88+
sb.append(CHANNEL_PRINTER_LINE_SEPARATOR);
8389
}
8490
}
91+
return sb.toString();
8592
}
8693

87-
public void printMessageDetails(SharkMessage message)
94+
public String getMessageDetails(SharkMessage message)
8895
throws IOException, ASAPException {
8996

9097
StringBuilder sb = new StringBuilder();
9198
// content
9299
byte[] content = message.getContent();
93-
if(content.length < 1) {
94-
sb.append("no content");
100+
if (content.length < 1) {
101+
sb.append("no content\n");
102+
} else {
103+
sb.append("message content interpreted as String: ");
104+
sb.append(SerializationHelper.bytes2characterSequence(content).toString());
105+
sb.append("\n");
95106
}
96-
sb.append("message content interpreted as String: ");
97-
sb.append(SerializationHelper.bytes2characterSequence(content).toString());
98-
sb.append("\n");
99107

100108
// sender
101109
sb.append("sender: ");
102110
sb.append(message.getSender().toString());
103111
// recipients
104112
sb.append(" | recipients: ");
105113
Set<CharSequence> recipients = message.getRecipients();
106-
if(recipients.size() < 1) sb.append("not specified");
114+
if (recipients.size() < 1) sb.append("not specified");
107115
boolean first = true;
108-
for(CharSequence recipient : recipients) {
109-
if(first) first = false;
116+
for (CharSequence recipient : recipients) {
117+
if (first) first = false;
110118
else sb.append(";");
111119
sb.append(recipient.toString());
112120
}
@@ -117,14 +125,21 @@ public void printMessageDetails(SharkMessage message)
117125

118126
// encryption / verification
119127
sb.append("\n");
120-
sb.append("encrypted: ");
128+
sb.append("E2E security: encrypted: ");
121129
sb.append(this.returnYesNo(message.encrypted()));
122130

123-
sb.append(" | couldBeDecrypted: ");
124-
sb.append(this.returnYesNo(message.couldBeDecrypted()));
131+
if (message.encrypted()) {
132+
sb.append(" | can decrypt: ");
133+
sb.append(this.returnYesNo(message.couldBeDecrypted()));
134+
}
125135

126-
sb.append(" | verified: ");
127-
sb.append(this.returnYesNo(message.verified()));
136+
sb.append(" | ");
137+
sb.append("signed: ");
138+
sb.append(this.returnYesNo(message.signed()));
139+
if (message.signed()) {
140+
sb.append(" | verified: ");
141+
sb.append(this.returnYesNo(message.verified()));
142+
}
128143

129144
// hoping list
130145
sb.append("\n");
@@ -141,20 +156,19 @@ public void printMessageDetails(SharkMessage message)
141156
this.addHobDetails(sb, hop);
142157
sb.append("\n");
143158
}
144-
sb.append("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
159+
sb.append("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
145160
}
146161

147-
// content
148-
sb.append("\n");
162+
//sb.append("\n");
149163

150-
this.sharkMessengerApp.tellUI(sb.toString());
164+
return sb.toString();
151165
}
152166

153167
private void addHobDetails(StringBuilder sb, ASAPHop hop) {
154168
sb.append("sender: ");
155169
sb.append(hop.sender());
156170
sb.append(" | ");
157-
sb.append("encrypted: ");
171+
sb.append("P2P security: encrypted: ");
158172
sb.append(this.returnYesNo(hop.encrypted()));
159173
sb.append(" | ");
160174
sb.append("verified: ");
Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package net.sharksystem.cmdline.sharkmessengerUI.commands.extendedMessenger;
22

3+
import net.sharksystem.SharkException;
4+
import net.sharksystem.messenger.SharkMessengerComponent;
35
import net.sharksystem.messenger.SharkMessengerException;
46
import net.sharksystem.cmdline.sharkmessengerUI.SharkMessengerApp;
57
import net.sharksystem.cmdline.sharkmessengerUI.SharkMessengerUI;
68
import net.sharksystem.cmdline.sharkmessengerUI.UICommand;
7-
import net.sharksystem.cmdline.sharkmessengerUI.commandarguments.UICommandBooleanArgument;
89
import net.sharksystem.cmdline.sharkmessengerUI.commandarguments.UICommandQuestionnaire;
910
import net.sharksystem.cmdline.sharkmessengerUI.commandarguments.UICommandQuestionnaireBuilder;
1011
import net.sharksystem.cmdline.sharkmessengerUI.commandarguments.UICommandStringArgument;
@@ -16,33 +17,42 @@
1617
* Create a channel for writing messages to it.
1718
*/
1819
public class UICommandCreateChannel extends UICommand {
19-
private final UICommandStringArgument channelUri;
20-
private final UICommandStringArgument channelName;
21-
private final UICommandBooleanArgument channelMustNotExist;
20+
private final UICommandStringArgument channelUriArgument;
21+
private final UICommandStringArgument channelNameArgument;
22+
23+
private String channelUri = null;
24+
private String channelName = null;
2225

2326
public UICommandCreateChannel(SharkMessengerApp sharkMessengerApp, SharkMessengerUI sharkMessengerUI,
2427
String identifier, boolean rememberCommand) {
2528
super(sharkMessengerApp, sharkMessengerUI, identifier, rememberCommand);
26-
this.channelUri = new UICommandStringArgument(sharkMessengerApp);
27-
this.channelName = new UICommandStringArgument(sharkMessengerApp);
28-
this.channelMustNotExist = new UICommandBooleanArgument(sharkMessengerApp);
29+
30+
this.channelUriArgument = new UICommandStringArgument(sharkMessengerApp);
31+
this.channelNameArgument = new UICommandStringArgument(sharkMessengerApp);
2932
}
3033

3134
@Override
3235
public UICommandQuestionnaire specifyCommandStructure() {
3336
return new UICommandQuestionnaireBuilder()
34-
.addQuestion("Please input the channel uri: ", this.channelUri)
35-
.addQuestion("Please set the channel name: ", this.channelName)
37+
.addQuestion("Please input the channel uri: ", this.channelUriArgument)
38+
.addQuestion("Please set the channel name: ", this.channelNameArgument)
3639
.build();
3740
}
3841

3942
@Override
4043
public void execute() {
41-
String channelURI = this.channelUri.getValue();
42-
String channelName = this.channelName.getValue();
44+
String channelURI = this.channelUriArgument.getValue();
45+
String channelName = this.channelNameArgument.getValue();
4346

4447
try {
45-
this.getSharkMessengerApp().getSharkMessengerComponent().createChannel(channelURI, channelName, true);
48+
SharkMessengerComponent sharkMessengerComponent = this.getSharkMessengerApp().getSharkMessengerComponent();
49+
try {
50+
sharkMessengerComponent.getChannel(channelURI);
51+
this.getSharkMessengerApp().tellUI("nothing to do; channel already exists: " + channelURI);
52+
}
53+
catch (SharkException se) {
54+
sharkMessengerComponent.createChannel(channelURI, channelName, true);
55+
}
4656
} catch (SharkMessengerException | IOException e) {
4757
this.printErrorMessage(e.getLocalizedMessage());
4858
}
@@ -51,7 +61,7 @@ public void execute() {
5161
@Override
5262
public String getDescription() {
5363
StringBuilder sb = new StringBuilder();
54-
sb.append("Creates a new channel.");
64+
sb.append("Creates a new channel by uri.");
5565
return sb.toString();
5666
}
5767

@@ -65,14 +75,28 @@ public String getDescription() {
6575
*/
6676
@Override
6777
protected boolean handleArguments(List<String> arguments) {
68-
if(arguments.size() < 3) {
78+
if(arguments.size() < 1) {
79+
this.getSharkMessengerApp().
80+
tellUIError("\nrequire: at least channel_uri; optional channel_name age [s(tone),b(ronze),i(ron)]");
6981
return false;
7082
}
71-
boolean isParsable = channelUri.tryParse(arguments.get(0))
72-
&& channelName.tryParse(arguments.get(1))
73-
&& channelMustNotExist.tryParse(arguments.get(2));
83+
boolean isParsable = true;
84+
if(!channelUriArgument.tryParse(arguments.get(0))) {
85+
this.getSharkMessengerApp().tellUIError("no valid uri: " + arguments.get(0));
86+
isParsable = false;
87+
} else {
88+
this.channelUri = this.channelUriArgument.getValue();
89+
}
90+
91+
if(!channelNameArgument.tryParse(arguments.get(1))) {
92+
this.getSharkMessengerApp().tellUI("no channel name, take default (none).");
93+
} else {
94+
this.channelName = this.channelNameArgument.getValue();
95+
}
96+
97+
this.getSharkMessengerApp().
98+
tellUI("info: channel communication era cannot be defined in this version. Always set Internet age.");
7499

75100
return isParsable;
76101
}
77-
78102
}

src/net/sharksystem/cmdline/sharkmessengerUI/commands/extendedMessenger/UICommandListChannels.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.sharksystem.cmdline.sharkmessengerUI.commands.extendedMessenger;
22

3-
import net.sharksystem.cmdline.sharkmessengerUI.commands.simpleMessenger.ChannelPrinter;
43
import net.sharksystem.messenger.SharkMessengerComponent;
54
import net.sharksystem.messenger.SharkMessengerException;
65
import net.sharksystem.cmdline.sharkmessengerUI.SharkMessengerApp;
@@ -38,7 +37,8 @@ protected UICommandQuestionnaire specifyCommandStructure() {
3837
protected void execute() throws Exception {
3938
try {
4039
SharkMessengerComponent messengerComponent = this.getSharkMessengerApp().getSharkMessengerComponent();
41-
ChannelPrinter.printChannelDescriptions(this.getPrintStream(), messengerComponent, false);
40+
41+
new ChannelPrinter().getChannelDescriptions(messengerComponent);
4242
} catch (SharkMessengerException | IOException e) {
4343
this.printErrorMessage(e.getLocalizedMessage());
4444
}

0 commit comments

Comments
 (0)