move configMessage handling to a another file
							parent
							
								
									6a998111c7
								
							
						
					
					
						commit
						c656dd25cf
					
				@ -0,0 +1,162 @@
 | 
			
		||||
import _ from 'lodash';
 | 
			
		||||
import { getItemById, hasSyncedInitialConfigurationItem } from '../data/data';
 | 
			
		||||
import { SignalService } from '../protobuf';
 | 
			
		||||
import { ConversationController } from '../session/conversations';
 | 
			
		||||
import { OpenGroup } from '../session/types';
 | 
			
		||||
import { UserUtils } from '../session/utils';
 | 
			
		||||
import { toHex } from '../session/utils/String';
 | 
			
		||||
import { configurationMessageReceived, trigger } from '../shims/events';
 | 
			
		||||
import { removeFromCache } from './cache';
 | 
			
		||||
import { handleNewClosedGroup } from './closedGroups';
 | 
			
		||||
import { updateProfile } from './dataMessage';
 | 
			
		||||
import { EnvelopePlus } from './types';
 | 
			
		||||
 | 
			
		||||
async function handleOurProfileUpdate(
 | 
			
		||||
  sentAt: number | Long,
 | 
			
		||||
  configMessage: SignalService.ConfigurationMessage,
 | 
			
		||||
  ourPubkey: string
 | 
			
		||||
) {
 | 
			
		||||
  const latestProfileUpdateTimestamp = UserUtils.getLastProfileUpdateTimestamp();
 | 
			
		||||
  if (!latestProfileUpdateTimestamp || sentAt > latestProfileUpdateTimestamp) {
 | 
			
		||||
    window?.log?.info(
 | 
			
		||||
      `Handling our profileUdpate ourLastUpdate:${latestProfileUpdateTimestamp}, envelope sent at: ${sentAt}`
 | 
			
		||||
    );
 | 
			
		||||
    const { profileKey, profilePicture, displayName } = configMessage;
 | 
			
		||||
 | 
			
		||||
    const ourConversation = ConversationController.getInstance().get(ourPubkey);
 | 
			
		||||
    if (!ourConversation) {
 | 
			
		||||
      window.log.error('We need a convo with ourself at all times');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (profileKey?.length) {
 | 
			
		||||
      window.log.info('Saving our profileKey from configuration message');
 | 
			
		||||
      // TODO not sure why we keep our profileKey in storage AND in our conversaio
 | 
			
		||||
      window.textsecure.storage.put('profileKey', profileKey);
 | 
			
		||||
    }
 | 
			
		||||
    const lokiProfile = {
 | 
			
		||||
      displayName,
 | 
			
		||||
      profilePicture,
 | 
			
		||||
    };
 | 
			
		||||
    await updateProfile(ourConversation, lokiProfile, profileKey);
 | 
			
		||||
    UserUtils.setLastProfileUpdateTimestamp(_.toNumber(sentAt));
 | 
			
		||||
    trigger(configurationMessageReceived, displayName);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function handleGroupsAndContactsFromConfigMessage(
 | 
			
		||||
  envelope: EnvelopePlus,
 | 
			
		||||
  configMessage: SignalService.ConfigurationMessage
 | 
			
		||||
) {
 | 
			
		||||
  const didWeHandleAConfigurationMessageAlready =
 | 
			
		||||
    (await getItemById(hasSyncedInitialConfigurationItem))?.value || false;
 | 
			
		||||
  if (didWeHandleAConfigurationMessageAlready) {
 | 
			
		||||
    window?.log?.warn(
 | 
			
		||||
      'Dropping configuration change as we already handled one... '
 | 
			
		||||
    );
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  if (didWeHandleAConfigurationMessageAlready) {
 | 
			
		||||
    window?.log?.warn(
 | 
			
		||||
      'Dropping configuration change as we already handled one... '
 | 
			
		||||
    );
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const numberClosedGroup = configMessage.closedGroups?.length || 0;
 | 
			
		||||
 | 
			
		||||
  window?.log?.warn(
 | 
			
		||||
    `Received ${numberClosedGroup} closed group on configuration. Creating them... `
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  await Promise.all(
 | 
			
		||||
    configMessage.closedGroups.map(async c => {
 | 
			
		||||
      const groupUpdate = new SignalService.DataMessage.ClosedGroupControlMessage(
 | 
			
		||||
        {
 | 
			
		||||
          type: SignalService.DataMessage.ClosedGroupControlMessage.Type.NEW,
 | 
			
		||||
          encryptionKeyPair: c.encryptionKeyPair,
 | 
			
		||||
          name: c.name,
 | 
			
		||||
          admins: c.admins,
 | 
			
		||||
          members: c.members,
 | 
			
		||||
          publicKey: c.publicKey,
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
      try {
 | 
			
		||||
        await handleNewClosedGroup(envelope, groupUpdate);
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        window?.log?.warn(
 | 
			
		||||
          'failed to handle  a new closed group from configuration message'
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  const allOpenGroups = OpenGroup.getAllAlreadyJoinedOpenGroupsUrl();
 | 
			
		||||
  const numberOpenGroup = configMessage.openGroups?.length || 0;
 | 
			
		||||
 | 
			
		||||
  // Trigger a join for all open groups we are not already in.
 | 
			
		||||
  // Currently, if you left an open group but kept the conversation, you won't rejoin it here.
 | 
			
		||||
  for (let i = 0; i < numberOpenGroup; i++) {
 | 
			
		||||
    const current = configMessage.openGroups[i];
 | 
			
		||||
    if (!allOpenGroups.includes(current)) {
 | 
			
		||||
      window?.log?.info(
 | 
			
		||||
        `triggering join of public chat '${current}' from ConfigurationMessage`
 | 
			
		||||
      );
 | 
			
		||||
      void OpenGroup.join(current);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (configMessage.contacts?.length) {
 | 
			
		||||
    await Promise.all(
 | 
			
		||||
      configMessage.contacts.map(async c => {
 | 
			
		||||
        try {
 | 
			
		||||
          if (!c.publicKey) {
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
          const contactConvo = await ConversationController.getInstance().getOrCreateAndWait(
 | 
			
		||||
            toHex(c.publicKey),
 | 
			
		||||
            'private'
 | 
			
		||||
          );
 | 
			
		||||
          const profile = {
 | 
			
		||||
            displayName: c.name,
 | 
			
		||||
            profilePictre: c.profilePicture,
 | 
			
		||||
          };
 | 
			
		||||
          await updateProfile(contactConvo, profile, c.profileKey);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
          window?.log?.warn(
 | 
			
		||||
            'failed to handle  a new closed group from configuration message'
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function handleConfigurationMessage(
 | 
			
		||||
  envelope: EnvelopePlus,
 | 
			
		||||
  configurationMessage: SignalService.ConfigurationMessage
 | 
			
		||||
): Promise<void> {
 | 
			
		||||
  const ourPubkey = UserUtils.getOurPubKeyStrFromCache();
 | 
			
		||||
  if (!ourPubkey) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (envelope.source !== ourPubkey) {
 | 
			
		||||
    window?.log?.info(
 | 
			
		||||
      'Dropping configuration change from someone else than us.'
 | 
			
		||||
    );
 | 
			
		||||
    return removeFromCache(envelope);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  await handleOurProfileUpdate(
 | 
			
		||||
    envelope.timestamp,
 | 
			
		||||
    configurationMessage,
 | 
			
		||||
    ourPubkey
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  await handleGroupsAndContactsFromConfigMessage(
 | 
			
		||||
    envelope,
 | 
			
		||||
    configurationMessage
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  await removeFromCache(envelope);
 | 
			
		||||
}
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue