All stages stated in the Lab Description were implemented. Implementation details were discussed in the team and afterwards reflected exhaustively.
The nameservers were easy to implement, there wasn't much room for interpretation. The two Interfaces INameserver
and INameserverForChatserver
caused some confusion, because INameserver implements NameserverForChatserver
.
We decided to reimplement transformation streams (something similar to Cipher(In|Out)putStream
), as it is a very elegant and straightforward way to provide encrypted streamed communication.
We added a small utility to perform HMAC-related operations, including transforming a message into a HMAC-annotated one.
We previously had one listener thread which would handle all incoming DTOs. As the client should be able to look up other users before sending a private message, we faced a challenge in order to synchronize our centralized listening mechanism with the execution of commands. This was solved by providing locked memory, that would be synchronized in order to allow for commands to block upon new input handed over by the receiving thread.