Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
412 changes: 412 additions & 0 deletions src/features/message_edit.rs

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/features/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ mod community;
mod contacts;
mod groups;
mod media_reupload;
pub mod message_edit;
mod mex;
pub(crate) mod newsletter;
mod polls;
Expand Down Expand Up @@ -37,6 +38,8 @@ pub use groups::{

pub use media_reupload::{MediaRetryResult, MediaReupload, MediaReuploadRequest};

pub use message_edit::EncryptedEdit;

pub use mex::{Mex, MexError, MexErrorExtensions, MexGraphQLError, MexRequest, MexResponse};

pub use newsletter::{
Expand Down
27 changes: 13 additions & 14 deletions src/features/polls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,16 +127,14 @@ impl<'a> Polls<'a> {
.map(|name| poll::compute_option_hash(name).to_vec())
.collect();

let key = poll::derive_vote_encryption_key(
let (enc_payload, iv) = poll::encrypt_poll_vote_with_secret(
&selected_hashes,
message_secret,
poll_msg_id,
&creator_jid_str,
&voter_jid_str,
)?;

let (enc_payload, iv) =
poll::encrypt_poll_vote(&selected_hashes, &key, poll_msg_id, &voter_jid_str)?;

let from_me = my_base.is_same_user_as(poll_creator_jid);

let poll_update = wa::message::PollUpdateMessage {
Expand Down Expand Up @@ -178,8 +176,14 @@ impl<'a> Polls<'a> {
) -> Result<Vec<Vec<u8>>> {
let creator = poll_creator_jid.to_non_ad().to_string();
let voter = voter_jid.to_non_ad().to_string();
let key = poll::derive_vote_encryption_key(message_secret, poll_msg_id, &creator, &voter)?;
poll::decrypt_poll_vote(enc_payload, enc_iv, &key, poll_msg_id, &voter)
poll::decrypt_poll_vote_with_secret(
enc_payload,
enc_iv,
message_secret,
poll_msg_id,
&creator,
&voter,
)
}

/// Decrypts each vote and tallies per-option results.
Expand All @@ -205,19 +209,14 @@ impl<'a> Polls<'a> {
let mut latest_votes: HashMap<String, Vec<Vec<u8>>> = HashMap::with_capacity(votes.len());
for (voter_jid, enc_payload, enc_iv) in votes {
let voter_str = voter_jid.to_non_ad().to_string();
let key = match poll::derive_vote_encryption_key(
match poll::decrypt_poll_vote_with_secret(
enc_payload,
enc_iv,
message_secret,
poll_msg_id,
&creator_str,
&voter_str,
) {
Ok(k) => k,
Err(e) => {
log::warn!("Failed to derive vote key for {voter_jid}: {e}");
continue;
}
};
match poll::decrypt_poll_vote(enc_payload, enc_iv, &key, poll_msg_id, &voter_str) {
Ok(selected_hashes) => {
if selected_hashes.is_empty() {
// Empty selection = voter cleared their vote
Expand Down
23 changes: 12 additions & 11 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,18 @@ pub mod features;
pub use features::{
BatchGroupResult, Blocking, BlocklistEntry, ChatActions, ChatStateType, Chatstate, Community,
CommunitySubgroup, Contacts, CreateCommunityOptions, CreateCommunityResult, CreateGroupResult,
GroupCreateOptions, GroupDescription, GroupJoinError, GroupMetadata, GroupParticipant,
GroupParticipantOptions, GroupProfilePicture, GroupSubject, GroupType, Groups, GrowthLockInfo,
InviteInfoError, IsOnWhatsAppResult, JoinGroupResult, LinkSubgroupsResult, MediaRetryResult,
MediaReupload, MediaReuploadRequest, MemberAddMode, MemberLinkMode, MemberShareHistoryMode,
MembershipApprovalMode, MembershipRequest, Mex, MexError, MexErrorExtensions, MexRequest,
MexResponse, Newsletter, NewsletterMessage, NewsletterMessageType, NewsletterMetadata,
NewsletterReactionCount, NewsletterRole, NewsletterState, NewsletterVerification,
ParticipantChangeResponse, ParticipantType, PictureType, Presence, PresenceError,
PresenceStatus, Profile, ProfilePicture, SetProfilePictureResponse, Signal, Status,
StatusPrivacySetting, StatusSendOptions, SyncActionMessageRange, TcToken,
UnlinkSubgroupsResult, UserInfo, group_type, message_key, message_range,
EncryptedEdit, GroupCreateOptions, GroupDescription, GroupJoinError, GroupMetadata,
GroupParticipant, GroupParticipantOptions, GroupProfilePicture, GroupSubject, GroupType,
Groups, GrowthLockInfo, InviteInfoError, IsOnWhatsAppResult, JoinGroupResult,
LinkSubgroupsResult, MediaRetryResult, MediaReupload, MediaReuploadRequest, MemberAddMode,
MemberLinkMode, MemberShareHistoryMode, MembershipApprovalMode, MembershipRequest, Mex,
MexError, MexErrorExtensions, MexRequest, MexResponse, Newsletter, NewsletterMessage,
NewsletterMessageType, NewsletterMetadata, NewsletterReactionCount, NewsletterRole,
NewsletterState, NewsletterVerification, ParticipantChangeResponse, ParticipantType,
PictureType, Presence, PresenceError, PresenceStatus, Profile, ProfilePicture,
SetProfilePictureResponse, Signal, Status, StatusPrivacySetting, StatusSendOptions,
SyncActionMessageRange, TcToken, UnlinkSubgroupsResult, UserInfo, group_type, message_key,
message_range,
};

pub mod bot;
Expand Down
2 changes: 2 additions & 0 deletions wacore/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub mod history_sync;
pub mod ib;
pub use wacore_libsignal as libsignal;
pub mod media_retry;
pub mod message_edit;
pub mod message_processing;
pub mod messages;
pub mod net;
Expand All @@ -31,6 +32,7 @@ pub mod proto_helpers;
pub mod reporting_token;
pub mod request;
pub mod runtime;
pub mod secret_enc_addon;
pub mod send;
pub mod session;
pub mod stanza;
Expand Down
Loading
Loading