Exemplo n.º 1
0
  private void TL_Updates(TL.Object obj) {
    if (obj.name.equals("updatesTooLong")) api_updates_getDifference();

    boolean chat = obj.name.equals("updateShortChatMessage");
    if (obj.name.equals("updateShortMessage") || chat) {
      cb.onMessage(
          Dialog.Message.newObject(
              obj.getInt("id"),
              obj.getInt("from_id"),
              chat ? obj.getInt("chat_id") : -1,
              obj.getInt("from_id"),
              obj.getInt("date"),
              obj.getString("message"),
              null),
          Dialog.MSG_INCOMING | Dialog.MSG_HISTORY);
      setUpdate(obj.getInt("date"), obj.getInt("pts"), obj.getInt("seq"));
    }

    if (obj.name.equals("updateShort")) {
      onUpdate(obj.getObject("update"), null, null);
      setUpdate(obj.getInt("date"), -1, -1);
    }

    if (obj.name.equals("updatesCombined") || obj.name.equals("updates")) {
      TL.Vector updates = obj.getVector("updates");
      for (int i = 0; i < updates.count; i++)
        onUpdate(updates.getObject(i), obj.getVector("users"), obj.getVector("chats"));
      setUpdate(obj.getInt("date"), -1, obj.getInt("seq"));
    }
  }
Exemplo n.º 2
0
 private void TL_MsgsAck(TL.Object obj) {
   TL.Vector msg_ids = obj.getVector("msg_ids");
   for (int i = 0; i < msg_ids.count; i++) {
     Message msg = TLMessage.get(msg_ids.getLong(i));
     if (msg != null) msg.accepted = true;
     // TLMessage.delete(msg_ids.getLong(i));
   }
 }
Exemplo n.º 3
0
 private void TL_contacts_ImportedContacts(TL.Object obj) {
   User.addUsers(obj.getVector("users"));
   TL.Vector imported = obj.getVector("imported");
   for (int i = 0; i < imported.count; i++) {
     TL.Object c = imported.getObject(i);
     User.getUser(c.getInt("user_id")).client_id = c.getLong("client_id");
   }
   SyncUtils.updateContacts(Main.main);
 }
Exemplo n.º 4
0
  private void TL_messages_StatedMessages(TL.Object obj) {
    setUpdate(-1, obj.getInt("pts"), obj.getInt("seq"));

    User.addUsers(obj.getVector("users"));
    TL.Vector messages = obj.getVector("messages");
    for (int i = 0; i < messages.count; i++) {
      TL.Object message = messages.getObject(i);
      Dialog d = Dialog.getDialog(message.getInt("from_id"), message.getObject("to_id"), true);
      Dialog.newMessage(message, Dialog.MSG_INCOMING);
    }
  }
Exemplo n.º 5
0
  private void TL_MessageContainer(TL.Object obj) {
    TL.Vector v = (TL.Vector) obj;

    int count = v.count;
    Common.logDebug("msg_count: " + count);
    for (int i = 0; i < v.count; i++) {
      TL.Object message = v.getObject(i);
      ack_message(message.getInt("seqno"), message.getLong("msg_id"));
      process(message.getObject("body"));
    }
  }
Exemplo n.º 6
0
  private void TL_Config(TL.Object obj) {
    dc_date = obj.getInt("date");
    MTProto.dc_this = obj.getInt("this_dc");
    dcState.set("id", dc_this);
    updateDcStates();

    TL.Vector dc_options = obj.getVector("dc_options");

    ArrayList<TL.Object> new_dcStates = new ArrayList<TL.Object>();

    for (int i = 0; i < dc_options.count; i++) {
      TL.Object dcObj = dc_options.getObject(i);
      int id = dcObj.getInt("id");

      TL.Object state =
          TL.newObject(
              "joim.dcState",
              id,
              dcObj.getString("ip_address"),
              dcObj.getInt("port"),
              new byte[0],
              false,
              GEN_session_id(),
              0L,
              0);

      for (int j = 0; j < MTProto.dcStates.size(); j++) {
        TL.Object item = MTProto.dcStates.get(j);
        if (id == item.getInt("id") && state.getString("ip").equals(item.getString("ip"))) {
          state.set("auth_key", item.getBytes("auth_key"));
          state.set("bind", item.getBool("bind"));
          state.set("session", item.getLong("session"));
          state.set("server_salt", item.getLong("server_salt"));
          state.set("seqno", item.getInt("seqno"));
          if (state.getInt("port") == item.getInt("port")) dcState = state;
          break;
        }
      }

      new_dcStates.add(state);
    }

    dcStates = new_dcStates;
    send_queue();
    cb.onReady();
  }
Exemplo n.º 7
0
  private void TL_updates_Difference(TL.Object obj) {
    if (obj.name.equals("updates.differenceEmpty"))
      setUpdate(obj.getInt("date"), -1, obj.getInt("seq"));

    if (obj.name.equals("updates.difference") || obj.name.equals("updates.differenceSlice")) {

      TL.Vector other_updates = obj.getVector("other_updates");
      for (int i = 0; i < other_updates.count; i++)
        onUpdate(other_updates.getObject(i), obj.getVector("users"), obj.getVector("chats"));

      TL.Vector new_messages = obj.getVector("new_messages");
      for (int i = 0; i < new_messages.count; i++)
        Dialog.newMessage(new_messages.getObject(i), Dialog.MSG_HISTORY);

      //			if (new_messages.count > 0)
      //				Dialog.vibrate();

      if (obj.name.equals("updates.differenceSlice")) {
        TL_updates_State(obj.getObject("intermediate_state"));
        this.api_updates_getDifference();
      } else TL_updates_State(obj.getObject("state"));
    }
  }
Exemplo n.º 8
0
  public void TL_messages_Dialogs(TL.Object obj) {
    User.addUsers(obj.getVector("users"));
    Chat.addChats(obj.getVector("chats"));

    // dialogs
    TL.Vector dialogs = obj.getVector("dialogs");
    for (int i = 0; i < dialogs.count; i++) {
      TL.Object dobj = dialogs.getObject(i);
      Dialog d = Dialog.getDialog(-1, dobj.getObject("peer"), true);
      d.updating = true;
    }

    // messages
    TL.Vector messages = obj.getVector("messages");
    for (int i = 0; i < messages.count; i++)
      cb.onMessage(messages.getObject(i), Dialog.MSG_HISTORY);

    for (int i = 0; i < dialogs.count; i++) {
      TL.Object dobj = dialogs.getObject(i);
      Dialog d = Dialog.getDialog(-1, dobj.getObject("peer"), true);
      if (dobj.getInt("top_message") == -7) // config_dialogs magic
      d.noHistory = true;
      d.unread_count = dobj.getInt("unread_count");
      d.updating = false;
      Main.main.updateDialog(d);
    }

    Common.logError("dialogs: " + Dialog.dialogs.size());

    // slice
    if (obj.name.equals("messages.dialogsSlice") && dialogs.count > 0) {
      int limit = obj.getInt("count") - Dialog.dialogs.size();
      if (limit > 0) api_messages_getDialogs(Dialog.dialogs.size(), 0, limit);
    }

    if (Main.main != null) Main.main.resetDialogs();
  }
Exemplo n.º 9
0
  private void TL_ResPQ(TL.Object obj) {
    sv_nonce = obj.getBytes("server_nonce");
    BigInteger pq = new BigInteger(1, obj.getBytes("pq"));
    TL.Vector v_fp = obj.getVector("server_public_key_fingerprints");
    fp = v_fp.getLong(0);
    Common.logError("pq: " + pq.toString());

    // prime factorization for pq
    BigInteger q = Common.rho(pq);
    BigInteger p = pq.divide(q);
    if (p.compareTo(q) > 0) {
      BigInteger t = p;
      p = q;
      q = t;
    }
    SecureRandom rnd = new SecureRandom();
    new_nonce = new byte[32];
    rnd.nextBytes(new_nonce);

    // generate encrypted_data
    TL.Object data_obj = TL.newObject("p_q_inner_data", pq, p, q, cl_nonce, sv_nonce, new_nonce);

    byte[] data = data_obj.serialize();
    byte[] hash = Common.getSHA1(data);

    byte[] data_with_hash = new byte[255];
    System.arraycopy(hash, 0, data_with_hash, 0, hash.length);
    System.arraycopy(data, 0, data_with_hash, hash.length, data.length);
    GEN_random_bytes(data_with_hash, data.length + hash.length, 255);

    byte[] encrypted_data = Common.RSA(RSA_MODULUS, RSA_EXPONENT, data_with_hash);

    // req_DH_params
    TL.Object req_obj = TL.newObject("req_DH_params", cl_nonce, sv_nonce, p, q, fp, encrypted_data);
    send(req_obj, false, false);
  }
Exemplo n.º 10
0
 private void TL_updateRestoreMessages(TL.Object update) {
   setUpdate(-1, update.getInt("pts"), -1);
   TL.Vector messages = update.getVector("messages");
   for (int i = 0; i < messages.count; i++) Dialog.messageRestore(messages.getInt(i));
 }