Kävin jonkin verran lähdekoodia läpi. Mitä tossa tuli huomattua niin Envelope luokka on suoraan whispersystemsin kirjastosta ja sitä ei voi käyttää ilman että on credentiaalit heille. Eli signal käyttää kirjastoja joista et voi tietää mitään mitä ne tekee pellin alla eli tässä koodin pätkässä luodaan uusi Envelope, sille annetaan viesti ja sen lähettäjä ja koska Envelope luokka on ulkoisen kirjaston joka ei ole open source niin me emme tiedä tallentaako se esimerkiksi viestin tietokantaan samalla kun envelope olio luodaan.
private void sendIndividualMessage(
Optional<AuthenticatedAccount> source,
Account destinationAccount,
Device destinationDevice,
ServiceIdentifier destinationIdentifier,
long timestamp,
boolean online,
boolean story,
boolean urgent,
IncomingMessage incomingMessage,
String userAgentString,
Optional<byte[]> spamReportToken)
throws NoSuchUserException {
try {
final Envelope envelope;
try {
Account sourceAccount = source.map(AuthenticatedAccount::getAccount).orElse(null);
Byte sourceDeviceId = source.map(account -> account.getAuthenticatedDevice().getId()).orElse(null);
envelope = incomingMessage.toEnvelope(
destinationIdentifier,
sourceAccount,
sourceDeviceId,
timestamp == 0 ? System.currentTimeMillis() : timestamp,
story,
urgent,
spamReportToken.orElse(null));
} catch (final IllegalArgumentException e) {
logger.warn("Received bad envelope type {} from {}", incomingMessage.type(), userAgentString);
throw new BadRequestException(e);
}
messageSender.sendMessage(destinationAccount, destinationDevice, envelope, online);
} catch (NotPushRegisteredException e) {
if (destinationDevice.isPrimary()) throw new NoSuchUserException(e);
else logger.debug("Not registered", e);
}
}
Vielä en tarkistanut kun clientistä lähetetään viesti, että kryptaako se sen. Mutta myös tällä kyseisellä messagescontrollerilla oli mielenkiintoinen funktio viimeisenä. Sitä tosin ei käytetä kuin yhdessä testi keississä.
public static Optional<byte[]> getMessageContent(IncomingMessage message) {
if (StringUtils.isEmpty(message.content())) return Optional.empty();
try {
return Optional.of(Base64.getDecoder().decode(message.content()));
} catch (IllegalArgumentException e) {