Как реализовать шифрование OMEMO для раздела чата XMPP android

Добрый день!!!

Я пробовал шифрование с использованием OMEMO для чата с использованием XMPP, но при фактическом шифровании у меня возникла проблема со списком устройств.

выполните следующие шаги,

  1. Регистрация в сервисе OMEMO
  2. Идентификатор устройства создан
  3. Созданы отпечатки пальцев
  4. Доверяйте личности OMEMO
  5. Зашифровать с помощью диспетчера OMEMO
  6. Отправьте сообщение, используя объект подключения XMPP.

    Пожалуйста, проверьте приведенный ниже код. Обратите внимание, что я понятия не имею о файле магазина, поэтому я создал локальный файл и дал здесь. Я не нашел документации о том же. Пожалуйста, дайте мне знать то же самое, если кто-нибудь знает об этом.

       try {
    
            var messageToSend = tMessagetext!!.text.toString();
    
    
            var mFriendJID = "abc@localhost/yyy";
    
    
            val jidFriend = JidCreate.from(mFriendJID);
    
            val jidBare = JidCreate.bareFrom(mFriendJID);
    
            val msg = Message(jidFriend, Message.Type.chat);
    
            msg.setBody(messageToSend);
    
            SignalOmemoService.acknowledgeLicense();
            if (!SignalOmemoService.isServiceRegistered())
                SignalOmemoService.setup();
    
            val service = SignalOmemoService.getInstance()
    
            val file = File(Environment.getExternalStorageDirectory().absolutePath,"myAppFile.txt");
    
            OmemoConfiguration.setFileBasedOmemoStoreDefaultPath(file);
    
    
            val memomanager = OmemoManager.getInstanceFor(ChatService.xmppConnection)
    
            val  device = memomanager.ownDevice
    
    
            Log.e(TAG, device.deviceId.toString()+", "+device.jid);
            val fingerPrint = memomanager.getFingerprint(device)
    
    
            Log.e(TAG, fingerPrint.toString());
            memomanager.trustOmemoIdentity(device, fingerPrint);
    
            val encryptedMessage = memomanager!!.encrypt(jidBare, messageToSend)
    
            ChatService.xmppConnection!!.sendStanza(encryptedMessage)
            tMessagetext!!.text.clear();
    
        }catch (e :java.lang.Exception){
            e.printStackTrace()
        }
    

И ошибка, которую я получаю,

OmemoService: Could not fetch device list of abc@localhost: org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from abc@localhost: XMPPError: service-unavailable - cancel
    org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from abc@localhost: XMPPError: service-unavailable - cancel
        at org.jivesoftware.smack.StanzaCollector.nextResultOrThrow(StanzaCollector.java:268)
        at org.jivesoftware.smack.StanzaCollector.nextResultOrThrow(StanzaCollector.java:219)
        at org.jivesoftware.smackx.pubsub.LeafNode.getItems(LeafNode.java:196)
        at org.jivesoftware.smackx.pubsub.LeafNode.getItems(LeafNode.java:189)
        at org.jivesoftware.smackx.pubsub.LeafNode.getItems(LeafNode.java:136)
        at org.jivesoftware.smackx.pubsub.PubSubManager.getLeafNodeProsodyWorkaround(PubSubManager.java:350)
        at org.jivesoftware.smackx.pubsub.PubSubManager.getLeafNode(PubSubManager.java:333)
        at org.jivesoftware.smackx.omemo.OmemoService.fetchDeviceListNode(OmemoService.java:435)
        at org.jivesoftware.smackx.omemo.OmemoService.fetchDeviceList(OmemoService.java:452)
        at org.jivesoftware.smackx.omemo.OmemoService.refreshDeviceList(OmemoService.java:504)
        at org.jivesoftware.smackx.omemo.OmemoService.buildOrCreateOmemoSessionsFromBundles(OmemoService.java:605)
        at org.jivesoftware.smackx.omemo.OmemoService.processSendingMessage(OmemoService.java:810)
        at org.jivesoftware.smackx.omemo.OmemoService.processSendingMessage(OmemoService.java:787)
        at org.jivesoftware.smackx.omemo.OmemoManager.encrypt(OmemoManager.java:209)
        at com.abcd.androidChatapp.MainActivity.onSendMessage(MainActivity.kt:347)
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:6312)
        at android.view.View$PerformClick.run(View.java:24943)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:192)
        at android.app.ActivityThread.main(ActivityThread.java:6754)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)

Пожалуйста, дайте мне знать о проблеме в этом коде, чтобы я мог продолжить и продолжить. Дайте мне знать, есть ли у вас соответствующая документация на то же самое, чтобы я мог слишком глубоко понять, что именно происходит в этом процессе.

Заранее спасибо.

1 ответ

Вот код, который я использовал.

//Setup stream
SignalOmemoService.acknowledgeLicense();
SignalOmemoService.setup();

SignalOmemoService service = (SignalOmemoService) SignalOmemoService.getInstance();
service.setOmemoStoreBackend(new SignalCachingOmemoStore(new SignalFileBasedOmemoStore(mContext.getFilesDir())));

omemoManager = OmemoManager.getInstanceFor(getSafeConnection(), deviceId);
omemoManager.setTrustCallback(this);
omemoManager.addOmemoMessageListener(this);
omemoManager.addOmemoMucMessageListener(this);

//After login
omemoManager.purgeDeviceList();
omemoManager.initialize();

//send message
BareJid bareJid = JidCreate.bareFrom(jid);
OmemoMessage.Sent encMesage = omemoManager.encrypt(bareJid, msgText);
Message newMessage = encMesage.asMessage(bareJid);
xmppStream.sendMessage(newMessage);

Кроме того, необходимо проверить это

Другие вопросы по тегам