Whisperfish - The unofficial SailfishOS Signal client

I made an issue on Gitlab for Sender Keys. Gabriel has mostly finished the back end work. This will also imply that we need unidentified sending/sealed sending in Whisperfish, which greatly reduces the metadata that Signal gets from the Whisperfish client. More privacy, yay!

4 Likes

@direc85 and I are working very hard to get beta.13 out. A long while ago, I opened submissions for a new application icon. Whisperfish has evolved far beyond what was given to us as Whisperfish 0.5 by Andrew, and I think the time is right to pick a winner.

I have picked my four favourite proposals, out of very many submitted.
I think you will appreciate how well they convey ā€œSignalā€ and Sailfish, without implicating either brand.
You can vote for your favourite here below.

0 voters

To further help you decide, you can have a look at @gamagā€™s post on Gitlab, which shows these icons in their context on the home screen.

I will close the poll when our glorious 0.6.0-beta.13 hits, or when it becomes obvious on which one the community votes. Weā€™ll need some extra time to get the icon packaged and ready, and you will see it hit the Storeman soonā„¢.

4 Likes

May it be possible to add this choice to the list?

18 Likes

Apparently not after the first five minutes of posting a poll. Letā€™s have the likes on your post count towards the voting, then, @pherjung.

Yessss ! (^_^) b

Maybe security-dashes should surround the entire fish - as it continues the essential idea of Signal.

The three dots are awesome ! I even prefer them placed just above the centerline of the fish - as drawn on your sketch ā€¦ the fish also looks a bit more streamlined on the sketch.

Thanks for your contribution ! :slight_smile:

Letā€™s maybe consider the current voting as a round for the concept, and we can have a second round for the exact variant :wink:

The picture that @pherjung posts is also one by @baxyz, FYI.

If I might add a sarcastic comment: given that Whisperfish is probably a bit more leaky compared to Signal itself, we might want to cut the dashed line at some place :smiley:

1 Like

:rofl: ( concerning your sarcasm )

1 Like

With so many dashed is looks like the fish is imprisoned (in a fish farm)

1 Like

If I may chip in with one thought:

I would prefer if the background color remained cyan-like rather than the royal blue.

Reasoning:

  1. Traditionally, WF has used a cyan-ish icon
  2. many messaging icons on SFOS are cyan-ish (ā€œMessagesā€, ā€œBrowserā€)
  3. Royal blue-ish is used by Twitter, Microsoft, Facebook (and yes, Signal), for some reason everyone thinks blue is the only color in the world.

Letā€™s stay ā€œunlikeā€.

5 Likes

Iā€™ve heard the same thought from a friend. Letā€™s consider this voting as a first round on the concept, and then propose a few variants and maybe vote again :slight_smile:

4 Likes

Yes, we could try new variants and backgrounds after the vote.

FYI, about the blue color, thatā€™s because humanity is not only one culture and colors definitively depend on the culture; however, the blue color seems to be the most universal.
Just an example: check loyalty #54 in Colours in Cultures ā€” Information is Beautiful

3 Likes

Or under cavitation :love_you_gesture::wink: ā€¦

This is a really cool chart, @baxyz, thanks for sharing. Very much appreciated.

Hi,

My friend bought a new phone and installed Signal on that. But I canā€™t receive nor send messages to her anymore on my Whisperfish. On Signal desktop everything works fine and messages that I send show up on Whisperfish. What can I do to fix this?

Here are some logs

[2022-11-24T18:32:28Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:28Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:28Z ERROR harbour_whisperfish::worker::client] Sending typing notification: Error sending message: protocol error: untrusted identity for address censored-uuid-uuid-uuid-12characters.1
[2022-11-24T18:32:33Z INFO  harbour_whisperfish::worker::client] ClientActor::SendTypingNotification(1)
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::worker::client] Sending typing notification for session: Session {: censored_ false, is_pinned: true, is_silent: false, is_muted: false, expiring_message_timeout: None, draft: None, type: DirectMessage(Recipient {: censored_ Some("+censored_possible_phone_no"), uuid: Some("censored-uuid-uuid-uuid-12characters"), username: None, email: None, blocked: false,: censored_ None, profile_given_name: None, profile_family_name: None, profile_joined_name: None, signal_profile_avatar: None, profile_sharing: false, last_profile_fetch: Some(2022-11-24T16:42:42.censored_possible_phone_no), unidentified_access_mode: false, storage_service_id: None, storage_proto: None, capabilities: 0, last_gv1_migrate_reminder: None, last_session_reset: None }) }
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::worker::client] Transmitting TypingMessage { timestamp: Some(censored_possible_phone_no), action: Some(Stopped), group_id: None } with timestamp censored_possible_phone_no
[2022-11-24T18:32:33Z TRACE libsignal_service::sender] sending message to default device
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z TRACE libsignal_service::sender] encrypting message for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z INFO  libsignal_service::sender] establishing new session with ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z DEBUG libsignal_service_actix::push_service] HTTP request GET https://chat.signal.org/v2/keys/censored-uuid-uuid-uuid-12characters/*
[2022-11-24T18:32:33Z DEBUG libsignal_service_actix::push_service] AwcPushService::get response:
    ClientResponse HTTP/1.1 200 OK
      headers:
        "content-length": "326"
        "date": "Thu, 24 Nov 2022 18:32:33 GMT"
        "vary": "Accept-Encoding"
        "content-encoding": "gzip"
        "connection": "keep-alive"
        "x-signal-timestamp": "censored_possible_phone_no"
        "content-type": "application/json"

[2022-11-24T18:32:33Z DEBUG libsignal_service_actix::push_service] GET response: "{\"identityKey\":\"BRZF1MgpUcUJpYGQsykBnH/w+43FPRsf2TETa2ROTIZi\",\"devices\":[{\"deviceId\":1,\"registrationId\":5385,\"signedPreKey\":{\"keyId\":censored_possible_phone_no,\"publicKey\":\"BT7/9OcPVJpTandjTjwMEPwHnzrZqcP0JvTOkNFs7eJz\",\"signature\":\"gkJI06axzf/+9Msl3LV9BaMjZeFLdSv5zQQJ7Hu7hkgYTANAersQ3/qGVbma8NGCTkdoTRJDaYYF1Lm1fNwiDA==\"},\"preKey\":{\"keyId\":censored_possible_phone_no,\"publicKey\":\"BWuMSJOME1foKKL1gnzLGiD/+zKRIxrYsQNT68wFre5i\"}}]}"
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:33Z ERROR harbour_whisperfish::worker::client] Sending typing notification: Error sending message: protocol error: untrusted identity for address censored-uuid-uuid-uuid-12characters.1
[2022-11-24T18:32:35Z INFO  harbour_whisperfish::worker::client] ClientActor::SendTypingNotification(1)
[2022-11-24T18:32:35Z TRACE harbour_whisperfish::worker::client] Sending typing notification for session: Session {: censored_ false, is_pinned: true, is_silent: false, is_muted: false, expiring_message_timeout: None, draft: None, type: DirectMessage(Recipient {: censored_ Some("+censored_possible_phone_no"), uuid: Some("censored-uuid-uuid-uuid-12characters"), username: None, email: None, blocked: false,: censored_ None, profile_given_name: None, profile_family_name: None, profile_joined_name: None, signal_profile_avatar: None, profile_sharing: false, last_profile_fetch: Some(2022-11-24T16:42:42.censored_possible_phone_no), unidentified_access_mode: false, storage_service_id: None, storage_proto: None, capabilities: 0, last_gv1_migrate_reminder: None, last_session_reset: None }) }
[2022-11-24T18:32:35Z TRACE harbour_whisperfish::worker::client] Transmitting TypingMessage { timestamp: Some(censored_possible_phone_no), action: Some(Stopped), group_id: None } with timestamp censored_possible_phone_no
[2022-11-24T18:32:35Z TRACE libsignal_service::sender] sending message to default device
[2022-11-24T18:32:35Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:35Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:35Z TRACE libsignal_service::sender] encrypting message for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:35Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:35Z INFO  libsignal_service::sender] establishing new session with ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:35Z DEBUG libsignal_service_actix::push_service] HTTP request GET https://chat.signal.org/v2/keys/censored-uuid-uuid-uuid-12characters/*
[2022-11-24T18:32:36Z DEBUG libsignal_service_actix::push_service] AwcPushService::get response:
    ClientResponse HTTP/1.1 200 OK
      headers:
        "date": "Thu, 24 Nov 2022 18:32:36 GMT"
        "content-length": "326"
        "connection": "keep-alive"
        "content-type": "application/json"
        "x-signal-timestamp": "censored_possible_phone_no"
        "content-encoding": "gzip"
        "vary": "Accept-Encoding"

[2022-11-24T18:32:36Z DEBUG libsignal_service_actix::push_service] GET response: "{\"identityKey\":\"BRZF1MgpUcUJpYGQsykBnH/w+43FPRsf2TETa2ROTIZi\",\"devices\":[{\"deviceId\":1,\"registrationId\":5385,\"signedPreKey\":{\"keyId\":censored_possible_phone_no,\"publicKey\":\"BT7/9OcPVJpTandjTjwMEPwHnzrZqcP0JvTOkNFs7eJz\",\"signature\":\"gkJI06axzf/+9Msl3LV9BaMjZeFLdSv5zQQJ7Hu7hkgYTANAersQ3/qGVbma8NGCTkdoTRJDaYYF1Lm1fNwiDA==\"},\"preKey\":{\"keyId\":censored_possible_phone_no,\"publicKey\":\"Bf9/Y7A5s5Uxi/25a2dTklZaqJvndTcDHv7GQLqLSzse\"}}]}"
[2022-11-24T18:32:36Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:36Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:36Z ERROR harbour_whisperfish::worker::client] Sending typing notification: Error sending message: protocol error: untrusted identity for address censored-uuid-uuid-uuid-12characters.1
[2022-11-24T18:32:37Z INFO  harbour_whisperfish::worker::client] ClientActor::SendTypingNotification(1)
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::worker::client] Sending typing notification for session: Session {: censored_ false, is_pinned: true, is_silent: false, is_muted: false, expiring_message_timeout: None, draft: None, type: DirectMessage(Recipient {: censored_ Some("+censored_possible_phone_no"), uuid: Some("censored-uuid-uuid-uuid-12characters"), username: None, email: None, blocked: false,: censored_ None, profile_given_name: None, profile_family_name: None, profile_joined_name: None, signal_profile_avatar: None, profile_sharing: false, last_profile_fetch: Some(2022-11-24T16:42:42.censored_possible_phone_no), unidentified_access_mode: false, storage_service_id: None, storage_proto: None, capabilities: 0, last_gv1_migrate_reminder: None, last_session_reset: None }) }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::worker::client] Transmitting TypingMessage { timestamp: Some(censored_possible_phone_no), action: Some(Started), group_id: None } with timestamp censored_possible_phone_no
[2022-11-24T18:32:37Z TRACE libsignal_service::sender] sending message to default device
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z TRACE libsignal_service::sender] encrypting message for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z INFO  libsignal_service::sender] establishing new session with ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z DEBUG libsignal_service_actix::push_service] HTTP request GET https://chat.signal.org/v2/keys/censored-uuid-uuid-uuid-12characters/*
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::actor::messageactor] MessageActor::handle(QueueMessage { recipient: "+censored_possible_phone_no", message: "Test", attachment: "" })
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Called fetch_or_insert_session_by_recipient_id(2)
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Called fetch__session_by_recipient_id(2)
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Called create_message(..) for session 1
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Creating message for timestamp 2022-11-24 18:32:37.955
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Called mark_session_archived(1, false)
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Inserted message id 11874
[2022-11-24T18:32:37Z INFO  harbour_whisperfish::worker::client] ClientActor::SendMessage(11874)
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store] Called fetch_message_by_id(11874)
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::worker::client] Sending for session: Session {: censored_ false, is_pinned: true, is_silent: false, is_muted: false, expiring_message_timeout: None, draft: None, type: DirectMessage(Recipient {: censored_ Some("+censored_possible_phone_no"), uuid: Some("censored-uuid-uuid-uuid-12characters"), username: None, email: None, blocked: false,: censored_ None, profile_given_name: None, profile_family_name: None, profile_joined_name: None, signal_profile_avatar: None, profile_sharing: false, last_profile_fetch: Some(2022-11-24T16:42:42.censored_possible_phone_no), unidentified_access_mode: false, storage_service_id: None, storage_proto: None, capabilities: 0, last_gv1_migrate_reminder: None, last_session_reset: None }) }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::worker::client] Sending message: Message {: censored_ 1, text: Some("Test"), sender_recipient_id: Some(2), received_timestamp: None, sent_timestamp: None, server_timestamp: 2022-11-24T18:32:37.955, is_read: true, is_outbound: true, flags: 0, expires_in: None, expiry_started: None, schedule_send_time: None, is_bookmarked: false, use_unidentified: false, is_remote_deleted: false, sending_has_failed: false }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::worker::client] Transmitting DataMessage { body: Some("Test"), attachments: [], group: None, group_v2: None, flags: None, expire_timer: None,: censored_ Some(censored_possible_phone_no), quote: None, contact: [], preview: [], sticker: None, required_protocol_version: Some(0), is_view_once: None, reaction: None, delete: None, body_ranges: [], group_call_update: None, payment: None } with timestamp censored_possible_phone_no
[2022-11-24T18:32:37Z TRACE libsignal_service::sender] sending message to default device
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z TRACE libsignal_service::sender] encrypting message for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z INFO  libsignal_service::sender] establishing new session with ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:37Z DEBUG libsignal_service_actix::push_service] HTTP request GET https://chat.signal.org/v2/keys/censored-uuid-uuid-uuid-12characters/*
[2022-11-24T18:32:38Z DEBUG libsignal_service_actix::push_service] AwcPushService::get response:
    ClientResponse HTTP/1.1 413 Payload Too Large
      headers:
        "date": "Thu, 24 Nov 2022 18:32:38 GMT"
        "x-signal-timestamp": "censored_possible_phone_no"
        "content-length": "453"
        "retry-after": "600"
        "connection": "keep-alive"
        "cache-control": "must-revalidate,no-cache,no-store"
        "content-type": "text/html;charset=iso-8859-1"

[2022-11-24T18:32:38Z TRACE harbour_whisperfish::store] Setting message 11874 to failed
[2022-11-24T18:32:38Z ERROR harbour_whisperfish::worker::client] Sending message: Error sending message: Rate limit exceeded
[2022-11-24T18:32:38Z TRACE harbour_whisperfish::model::message] Mark message 11874 failed'
[2022-11-24T18:32:38Z DEBUG libsignal_service_actix::push_service] AwcPushService::get response:
    ClientResponse HTTP/1.1 200 OK
      headers:
        "connection": "keep-alive"
        "date": "Thu, 24 Nov 2022 18:32:38 GMT"
        "content-length": "327"
        "vary": "Accept-Encoding"
        "content-type": "application/json"
        "content-encoding": "gzip"
        "x-signal-timestamp": "censored_possible_phone_no"

[2022-11-24T18:32:38Z DEBUG libsignal_service_actix::push_service] GET response: "{\"identityKey\":\"BRZF1MgpUcUJpYGQsykBnH/w+43FPRsf2TETa2ROTIZi\",\"devices\":[{\"deviceId\":1,\"registrationId\":5385,\"signedPreKey\":{\"keyId\":censored_possible_phone_no,\"publicKey\":\"BT7/9OcPVJpTandjTjwMEPwHnzrZqcP0JvTOkNFs7eJz\",\"signature\":\"gkJI06axzf/+9Msl3LV9BaMjZeFLdSv5zQQJ7Hu7hkgYTANAersQ3/qGVbma8NGCTkdoTRJDaYYF1Lm1fNwiDA==\"},\"preKey\":{\"keyId\":censored_possible_phone_no,\"publicKey\":\"Bc5RwrSCXxIby6L9z6xgLIb7DQr9PR0h+t+j2mwmz0cu\"}}]}"
[2022-11-24T18:32:38Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "censored-uuid-uuid-uuid-12characters", device_id: DeviceId(1) }
[2022-11-24T18:32:38Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "+censored_possible_phone_no", device_id: DeviceId(1) }
[2022-11-24T18:32:38Z ERROR harbour_whisperfish::worker::client] Sending typing notification: Error sending message: protocol error: untrusted identity for address censored-uuid-uuid-uuid-12characters.1
[2022-11-24T18:33:06Z TRACE libsignal_service_actix::websocket] Triggering keep-alive
[2022-11-24T18:33:06Z TRACE libsignal_service::messagepipe] Sending request WebSocketRequestMessage { verb: Some("GET"), path: Some("/v1/keepalive"), body: None, headers: [],: censored_
[2022-11-24T18:33:06Z TRACE libsignal_service::messagepipe] request on route.
[2022-11-24T18:33:07Z TRACE libsignal_service::messagepipe] Decoded WebSocketMessage { r#type: Some(Response), request: None, response: Some(WebSocketResponseMessage {: censored_ Some(200), message: Some("OK"), headers: ["Content-Length:0"], body: None }) }

Go into Settings, enable developer mode. Then go to your friends session, swipe right, pull down to Reset identity key, let it be reset. Then pull down again to reset secure session. That should fix it in theory, but Iā€™m not sure what the rate limit exceeded error means in this case.

That did the trick. Thanks for the help.

Since a few days back I can only send send messages from whisperfish when connected to wifi. When starting whisperfish while connected to 4G (and not wifi) the whisperfish log say:

QConnmanTechnologyInterface::scanReply() "No carrier"

I can however still receive whisperfish messages and other services like browsing, mail and phone calls works without problems.

I have not done any changes to whisperfish or SFOS installation lately. Running beta 12 on SFOS 4.4.0.72.

Anyone else who has seen this problem?

Thatā€™s interesting. In principle, Qt has no business with the network logic. Could you run Whisperfish in verbose mode, and get me the logs?

Thanks! I didnā€™t find a way to attach logs in PM so I created an issue:

1 Like

If this is what I think it is, every Whisperfish user will hit this issue within the next few days. Iā€™m working on something that should resolve some 428 errors, that should also alleviate what you describe. Beta 13 might have to hit sooner than we anticipated :slight_smile:

3 Likes