Esempio n. 1
0
void print_service_message (struct message *M) {
  assert (M);
  if (msg_num_mode) {
    printf ("%lld ", M->id);
  }
  print_date (M->date);
  printf (" ");
  if (get_peer_type (M->to_id) == PEER_CHAT) {
    print_chat_name (M->to_id, user_chat_get (M->to_id));
  } else {
    assert (get_peer_type (M->to_id) == PEER_ENCR_CHAT);
    print_encr_chat_name (M->to_id, user_chat_get (M->to_id));
  }
  printf (" ");
  print_user_name (M->from_id, user_chat_get (M->from_id));
 
  switch (M->action.type) {
  case CODE_message_action_empty:
    printf ("\n");
    break;
  case CODE_message_action_geo_chat_create:
    printf ("Created geo chat\n");
    break;
  case CODE_message_action_geo_chat_checkin:
    printf ("Checkin in geochat\n");
    break;
  case CODE_message_action_chat_create:
    printf (" created chat %s. %d users\n", M->action.title, M->action.user_num);
    break;
  case CODE_message_action_chat_edit_title:
    printf (" changed title to %s\n", 
      M->action.new_title);
    break;
  case CODE_message_action_chat_edit_photo:
    printf (" changed photo\n");
    break;
  case CODE_message_action_chat_delete_photo:
    printf (" deleted photo\n");
    break;
  case CODE_message_action_chat_add_user:
    printf (" added user ");
    print_user_name (set_peer_id (PEER_USER, M->action.user), user_chat_get (set_peer_id (PEER_USER, M->action.user)));
    printf ("\n");
    break;
  case CODE_message_action_chat_delete_user:
    printf (" deleted user ");
    print_user_name (set_peer_id (PEER_USER, M->action.user), user_chat_get (set_peer_id (PEER_USER, M->action.user)));
    printf ("\n");
    break;
  case CODE_decrypted_message_action_set_message_t_t_l:
    printf (" set ttl to %d seconds. Unsupported yet\n", M->action.ttl);
    break;
  default:
    assert (0);
  }
}
Esempio n. 2
0
void write_secret_chat_file (void) {
  if (binlog_enabled) { return; }
  int fd = open (get_secret_chat_filename (), O_CREAT | O_RDWR, 0600);
  if (fd < 0) {
    return;
  }
  int x[2];
  x[0] = SECRET_CHAT_FILE_MAGIC;
  x[1] = 1;
  assert (write (fd, x, 8) == 8);
  int i;
  int cc = 0;
  for (i = 0; i < peer_num; i++) if (get_peer_type (Peers[i]->id) == PEER_ENCR_CHAT) {
    if (Peers[i]->encr_chat.state != sc_none && Peers[i]->encr_chat.state != sc_deleted) {
      cc ++;
    }
  }
  assert (write (fd, &cc, 4) == 4);
  for (i = 0; i < peer_num; i++) if (get_peer_type (Peers[i]->id) == PEER_ENCR_CHAT) {
    if (Peers[i]->encr_chat.state != sc_none && Peers[i]->encr_chat.state != sc_deleted) {
      int t = get_peer_id (Peers[i]->id);
      assert (write (fd, &t, 4) == 4);
      t = Peers[i]->flags;
      assert (write (fd, &t, 4) == 4);
      t = strlen (Peers[i]->print_name);
      assert (write (fd, &t, 4) == 4);
      assert (write (fd, Peers[i]->print_name, t) == t);
      
      assert (write (fd, &Peers[i]->encr_chat.state, 4) == 4);

      assert (write (fd, &Peers[i]->encr_chat.user_id, 4) == 4);
      assert (write (fd, &Peers[i]->encr_chat.admin_id, 4) == 4);
      assert (write (fd, &Peers[i]->encr_chat.ttl, 4) == 4);
      assert (write (fd, &Peers[i]->encr_chat.access_hash, 8) == 8);
      if (Peers[i]->encr_chat.state != sc_waiting) {
        assert (write (fd, Peers[i]->encr_chat.g_key, 256) == 256);
      }
      if (Peers[i]->encr_chat.state != sc_waiting) {
        assert (write (fd, Peers[i]->encr_chat.nonce, 256) == 256);
      }
      assert (write (fd, Peers[i]->encr_chat.key, 256) == 256);
      assert (write (fd, &Peers[i]->encr_chat.key_fingerprint, 8) == 8);      
    }
  }
  assert (write (fd, &encr_root, 4) == 4);
  if (encr_root) {
    assert (write (fd, &encr_param_version, 4) == 4);
    assert (write (fd, encr_prime, 256) == 256);
  }
  close (fd);
}
Esempio n. 3
0
void print_user_name (peer_id_t id, peer_t *U) {
  assert (get_peer_type (id) == PEER_USER);
  if (!U) {
    printf ("user#%d", get_peer_id (id));
    int i;
    int ok = 1;
    for (i = 0; i < unknown_user_list_pos; i++) {
      if (unknown_user_list[i] == get_peer_id (id)) {
        ok = 0;
        break;
      }
    }
    if (ok) {
      assert (unknown_user_list_pos < 1000);
      unknown_user_list[unknown_user_list_pos ++] = get_peer_id (id);
    }
  } else {
    if ((U->flags & FLAG_DELETED)) {
      printf ("deleted user#%d", get_peer_id (id));
    } else if (!(U->flags & FLAG_CREATED)) {
      printf ("empty user#%d", get_peer_id (id));
    } else if (!U->user.first_name || !strlen (U->user.first_name)) {
      printf ("%s", U->user.last_name);
    } else if (!U->user.last_name || !strlen (U->user.last_name)) {
      printf ("%s", U->user.first_name);
    } else {
      printf ("%s %s", U->user.first_name, U->user.last_name); 
    }
  }
}
Esempio n. 4
0
peer_id_t next_token_chat (void) {
    int l;
    char *s = next_token (&l);
    if (!s) {
        return PEER_NOT_FOUND;
    }

    if (l >= 6 && !memcmp (s, "chat#", 5)) {
        s += 5;
        l -= 5;
        int r = atoi (s);
        if (r >= 0) {
            return set_peer_id (PEER_CHAT, r);
        }
        else {
            return PEER_NOT_FOUND;
        }
    }

    int index = 0;
    while (index < peer_num && (!is_same_word (s, l, Peers[index]->print_name) || get_peer_type (Peers[index]->id) != PEER_CHAT)) {
        index ++;
    }
    if (index < peer_num) {
        return Peers[index]->id;
    } else {
        return PEER_NOT_FOUND;
    }
}
Esempio n. 5
0
void print_encr_chat_name_full (peer_id_t id, peer_t *C) {
  assert (get_peer_type (id) == PEER_ENCR_CHAT);
  if (!C) {
    printf ("encr_chat#%d", get_peer_id (id));
  } else {
    printf ("%s", C->print_name);
  }
}
Esempio n. 6
0
void print_chat_name (peer_id_t id, peer_t *C) {
  assert (get_peer_type (id) == PEER_CHAT);
  if (!C) {
    printf ("chat#%d", get_peer_id (id));
  } else {
    printf ("%s", C->chat.title);
  }
}
Esempio n. 7
0
peer_id_t next_token_encr_chat (void) {
  int l;
  char *s = next_token (&l);
  if (!s) { return PEER_NOT_FOUND; }

  int index = 0;
  while (index < peer_num && (!is_same_word (s, l, Peers[index]->print_name) || get_peer_type (Peers[index]->id) != PEER_ENCR_CHAT)) {
    index ++;
  }
  if (index < peer_num) {
    return Peers[index]->id;
  } else {
    return PEER_NOT_FOUND;
  }
}
Esempio n. 8
0
void print_message (struct message *M) {
  assert (M);
  if (M->flags & (FLAG_MESSAGE_EMPTY | FLAG_DELETED)) {
    return;
  }
  if (!(M->flags & FLAG_CREATED)) { return; }
  if (M->service) {
    print_service_message (M);
    return;
  }
  if (!get_peer_type (M->to_id)) {
    logprintf ("Bad msg\n");
    return;
  }

  last_from_id = M->from_id;
  last_to_id = M->to_id;

  if (get_peer_type (M->to_id) == PEER_USER) {
    if (M->out) {
      if (msg_num_mode) {
        printf ("%lld ", M->id);
      }
      print_date (M->date);
      printf (" ");
      print_user_name (M->to_id, user_chat_get (M->to_id));
      if (M->unread) {
        printf (" <<< ");
      } else {
        printf (" ««« ");
      }
    } else {
      if (msg_num_mode) {
        printf ("%lld ", M->id);
      }
      print_date (M->date);
      printf (" ");
      print_user_name (M->from_id, user_chat_get (M->from_id));
      if (M->unread) {
        printf (" >>> ");
      } else {
        printf (" »»» ");
      }
      if (alert_sound) {
        play_sound();
      }
    }
  } else if (get_peer_type (M->to_id) == PEER_ENCR_CHAT) {
    peer_t *P = user_chat_get (M->to_id);
    assert (P);
    if (M->out) {
      if (msg_num_mode) {
        printf ("%lld ", M->id);
      }
      print_date (M->date);
      printf (" ");
      printf (" %s", P->print_name);
      if (M->unread) {
        printf (" <<< ");
      } else {
        printf (" ««« ");
      }
    } else {
      if (msg_num_mode) {
        printf ("%lld ", M->id);
      }
      print_date (M->date);
      printf (" %s", P->print_name);
      if (M->unread) {
        printf (" >>> ");
      } else {
        printf (" »»» ");
      }
      if (alert_sound) {
        play_sound();
      }
    }
  } else {
    assert (get_peer_type (M->to_id) == PEER_CHAT);
    if (msg_num_mode) {
      printf ("%lld ", M->id);
    }
    print_date (M->date);
    printf (" ");
    print_chat_name (M->to_id, user_chat_get (M->to_id));
    printf (" ");
    print_user_name (M->from_id, user_chat_get (M->from_id));
    if (M->unread) {
      printf (" >>> ");
    } else {
      printf (" »»» ");
    }
  }
  if (get_peer_type (M->fwd_from_id) == PEER_USER) {
    printf ("[fwd from ");
    print_user_name (M->fwd_from_id, user_chat_get (M->fwd_from_id));
    printf ("] ");
  }
  if (M->message && strlen (M->message)) {
    printf ("%s", M->message);
  }
  if (M->media.type != CODE_message_media_empty) {
    print_media (&M->media);
  }
  assert (!color_stack_pos);
  printf ("\n");
}
Esempio n. 9
0
int complete_encr_chat_list (int index, const char *text, int len, char **R) {
  index ++;
  while (index < peer_num && (!Peers[index]->print_name || strncmp (Peers[index]->print_name, text, len) || get_peer_type (Peers[index]->id) != PEER_ENCR_CHAT)) {
    index ++;
  }
  if (index < peer_num) {
    *R = strdup (Peers[index]->print_name);
    return index;
  } else {
    return -1;
  }
}