Update to 3.18.0

This commit is contained in:
DrKLO 2017-03-31 02:58:05 +03:00
parent 64e8ec3fbd
commit 6a1cf64f6f
2548 changed files with 138705 additions and 66425 deletions

View file

@ -3,14 +3,12 @@
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2016.
* Copyright Nikolai Kudashov, 2013-2017.
*/
package org.telegram.messenger;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
@ -22,6 +20,7 @@ import org.telegram.tgnet.RequestDelegate;
import org.telegram.tgnet.TLClassStore;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.AlertDialog;
import java.io.File;
import java.math.BigInteger;
@ -157,15 +156,7 @@ public class SecretChatHelper {
if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -184,7 +175,7 @@ public class SecretChatHelper {
protected void processUpdateEncryption(TLRPC.TL_updateEncryption update, ConcurrentHashMap<Integer, TLRPC.User> usersDict) {
final TLRPC.EncryptedChat newChat = update.chat;
long dialog_id = ((long) newChat.id) << 32;
TLRPC.EncryptedChat existingChat = MessagesController.getInstance().getEncryptedChatDB(newChat.id);
TLRPC.EncryptedChat existingChat = MessagesController.getInstance().getEncryptedChatDB(newChat.id, false);
if (newChat instanceof TLRPC.TL_encryptedChatRequested && existingChat == null) {
int user_id = newChat.participant_id;
@ -233,6 +224,7 @@ public class SecretChatHelper {
newChat.ttl = exist.ttl;
newChat.seq_in = exist.seq_in;
newChat.seq_out = exist.seq_out;
newChat.admin_id = exist.admin_id;
}
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
@ -251,15 +243,7 @@ public class SecretChatHelper {
if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -279,15 +263,7 @@ public class SecretChatHelper {
if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -310,15 +286,7 @@ public class SecretChatHelper {
return;
}
sendingNotifyLayer.add(encryptedChat.id);
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -339,15 +307,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -370,15 +330,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -402,15 +354,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -433,15 +377,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -463,15 +399,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -491,15 +419,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
if (resendMessage != null) {
@ -527,14 +447,7 @@ public class SecretChatHelper {
return;
}
TLRPC.TL_decryptedMessageService reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessageService();
} else {
reqSend = new TLRPC.TL_decryptedMessageService_layer8();
reqSend.random_bytes = new byte[15];
Utilities.random.nextBytes(reqSend.random_bytes);
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
TLRPC.Message message;
@ -644,51 +557,47 @@ public class SecretChatHelper {
public void run() {
try {
TLObject toEncryptObject;
if (AndroidUtilities.getPeerLayerVersion(chat.layer) >= 17) {
TLRPC.TL_decryptedMessageLayer layer = new TLRPC.TL_decryptedMessageLayer();
int myLayer = Math.max(17, AndroidUtilities.getMyLayerVersion(chat.layer));
layer.layer = Math.min(myLayer, AndroidUtilities.getPeerLayerVersion(chat.layer));
layer.message = req;
layer.random_bytes = new byte[15];
Utilities.random.nextBytes(layer.random_bytes);
toEncryptObject = layer;
if (chat.seq_in == 0 && chat.seq_out == 0) {
if (chat.admin_id == UserConfig.getClientUserId()) {
chat.seq_out = 1;
} else {
chat.seq_in = 1;
}
}
TLRPC.TL_decryptedMessageLayer layer = new TLRPC.TL_decryptedMessageLayer();
int myLayer = Math.max(46, AndroidUtilities.getMyLayerVersion(chat.layer));
layer.layer = Math.min(myLayer, Math.max(46, AndroidUtilities.getPeerLayerVersion(chat.layer)));
layer.message = req;
layer.random_bytes = new byte[15];
Utilities.random.nextBytes(layer.random_bytes);
toEncryptObject = layer;
if (newMsgObj.seq_in == 0 && newMsgObj.seq_out == 0) {
layer.in_seq_no = chat.seq_in;
layer.out_seq_no = chat.seq_out;
chat.seq_out += 2;
if (AndroidUtilities.getPeerLayerVersion(chat.layer) >= 20) {
if (chat.key_create_date == 0) {
chat.key_create_date = ConnectionsManager.getInstance().getCurrentTime();
}
chat.key_use_count_out++;
if ((chat.key_use_count_out >= 100 || chat.key_create_date < ConnectionsManager.getInstance().getCurrentTime() - 60 * 60 * 24 * 7) && chat.exchange_id == 0 && chat.future_key_fingerprint == 0) {
requestNewSecretChatKey(chat);
}
}
MessagesStorage.getInstance().updateEncryptedChatSeq(chat);
if (newMsgObj != null) {
newMsgObj.seq_in = layer.in_seq_no;
newMsgObj.seq_out = layer.out_seq_no;
MessagesStorage.getInstance().setMessageSeq(newMsgObj.id, newMsgObj.seq_in, newMsgObj.seq_out);
}
if (chat.seq_in == 0 && chat.seq_out == 0) {
if (chat.admin_id == UserConfig.getClientUserId()) {
chat.seq_out = 1;
} else {
layer.in_seq_no = newMsgObj.seq_in;
layer.out_seq_no = newMsgObj.seq_out;
chat.seq_in = 1;
}
FileLog.e("tmessages", req + " send message with in_seq = " + layer.in_seq_no + " out_seq = " + layer.out_seq_no);
} else {
toEncryptObject = req;
}
if (newMsgObj.seq_in == 0 && newMsgObj.seq_out == 0) {
layer.in_seq_no = chat.seq_in;
layer.out_seq_no = chat.seq_out;
chat.seq_out += 2;
if (AndroidUtilities.getPeerLayerVersion(chat.layer) >= 20) {
if (chat.key_create_date == 0) {
chat.key_create_date = ConnectionsManager.getInstance().getCurrentTime();
}
chat.key_use_count_out++;
if ((chat.key_use_count_out >= 100 || chat.key_create_date < ConnectionsManager.getInstance().getCurrentTime() - 60 * 60 * 24 * 7) && chat.exchange_id == 0 && chat.future_key_fingerprint == 0) {
requestNewSecretChatKey(chat);
}
}
MessagesStorage.getInstance().updateEncryptedChatSeq(chat);
if (newMsgObj != null) {
newMsgObj.seq_in = layer.in_seq_no;
newMsgObj.seq_out = layer.out_seq_no;
MessagesStorage.getInstance().setMessageSeq(newMsgObj.id, newMsgObj.seq_in, newMsgObj.seq_out);
}
} else {
layer.in_seq_no = newMsgObj.seq_in;
layer.out_seq_no = newMsgObj.seq_out;
}
FileLog.e(req + " send message with in_seq = " + layer.in_seq_no + " out_seq = " + layer.out_seq_no);
int len = toEncryptObject.getObjectSize();
NativeByteBuffer toEncrypt = new NativeByteBuffer(4 + len);
@ -778,7 +687,7 @@ public class SecretChatHelper {
currentChat.key_hash = key_hash;
MessagesStorage.getInstance().updateEncryptedChat(currentChat);
} catch (Throwable e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
@ -837,7 +746,7 @@ public class SecretChatHelper {
}
}, ConnectionsManager.RequestFlagInvokeAfter);
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
});
@ -857,7 +766,7 @@ public class SecretChatHelper {
chat.key_hash = key_hash;
MessagesStorage.getInstance().updateEncryptedChat(chat);
} catch (Throwable e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
chat.layer = AndroidUtilities.setPeerLayerVersion(chat.layer, newPeerLayer);
@ -1184,7 +1093,7 @@ public class SecretChatHelper {
} else if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionRequestKey) {
if (chat.exchange_id != 0) {
if (chat.exchange_id > serviceMessage.action.exchange_id) {
FileLog.e("tmessages", "we already have request key with higher exchange_id");
FileLog.e("we already have request key with higher exchange_id");
return null;
} else {
sendAbortKeyMessage(chat, null, chat.exchange_id); //TODO don't send?
@ -1335,10 +1244,10 @@ public class SecretChatHelper {
return null;
}
} else {
FileLog.e("tmessages", "unknown message " + object);
FileLog.e("unknown message " + object);
}
} else {
FileLog.e("tmessages", "unknown TLObject");
FileLog.e("unknown TLObject");
}
return null;
}
@ -1451,7 +1360,7 @@ public class SecretChatHelper {
SendMessagesHelper.getInstance().processUnsentMessages(messages, new ArrayList<TLRPC.User>(), new ArrayList<TLRPC.Chat>(), encryptedChats);
MessagesStorage.getInstance().getDatabase().executeFast(String.format(Locale.US, "REPLACE INTO requested_holes VALUES(%d, %d, %d)", encryptedChat.id, sSeq, endSeq)).stepThis().dispose();
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
});
@ -1502,7 +1411,7 @@ public class SecretChatHelper {
}
protected ArrayList<TLRPC.Message> decryptMessage(TLRPC.EncryptedMessage message) {
final TLRPC.EncryptedChat chat = MessagesController.getInstance().getEncryptedChatDB(message.chat_id);
final TLRPC.EncryptedChat chat = MessagesController.getInstance().getEncryptedChatDB(message.chat_id, true);
if (chat == null || chat instanceof TLRPC.TL_encryptedChatDiscarded) {
return null;
}
@ -1552,16 +1461,16 @@ public class SecretChatHelper {
}
}
if (layer.random_bytes.length < 15) {
FileLog.e("tmessages", "got random bytes less than needed");
FileLog.e("got random bytes less than needed");
return null;
}
FileLog.e("tmessages", "current chat in_seq = " + chat.seq_in + " out_seq = " + chat.seq_out);
FileLog.e("tmessages", "got message with in_seq = " + layer.in_seq_no + " out_seq = " + layer.out_seq_no);
FileLog.e("current chat in_seq = " + chat.seq_in + " out_seq = " + chat.seq_out);
FileLog.e("got message with in_seq = " + layer.in_seq_no + " out_seq = " + layer.out_seq_no);
if (layer.out_seq_no < chat.seq_in) {
return null;
}
if (chat.seq_in != layer.out_seq_no && chat.seq_in != layer.out_seq_no - 2) {
FileLog.e("tmessages", "got hole");
FileLog.e("got hole");
ArrayList<TL_decryptedMessageHolder> arr = secretHolesQueue.get(chat.id);
if (arr == null) {
arr = new ArrayList<>();
@ -1604,6 +1513,8 @@ public class SecretChatHelper {
chat.in_seq_no = layer.in_seq_no;
MessagesStorage.getInstance().updateEncryptedChatSeq(chat);
object = layer.message;
} else if (!(object instanceof TLRPC.TL_decryptedMessageService && ((TLRPC.TL_decryptedMessageService) object).action instanceof TLRPC.TL_decryptedMessageActionNotifyLayer)) {
return null;
}
ArrayList<TLRPC.Message> messages = new ArrayList<>();
TLRPC.Message decryptedMessage = processDecryptedObject(chat, message.file, message.date, message.random_id, object, new_key_used);
@ -1614,10 +1525,10 @@ public class SecretChatHelper {
return messages;
} else {
is.reuse();
FileLog.e("tmessages", String.format("fingerprint mismatch %x", fingerprint));
FileLog.e(String.format("fingerprint mismatch %x", fingerprint));
}
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
return null;
@ -1700,6 +1611,7 @@ public class SecretChatHelper {
newChat.key_use_count_out = encryptedChat.key_use_count_out;
newChat.seq_in = encryptedChat.seq_in;
newChat.seq_out = encryptedChat.seq_out;
newChat.admin_id = encryptedChat.admin_id;
MessagesStorage.getInstance().updateEncryptedChat(newChat);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
@ -1837,7 +1749,7 @@ public class SecretChatHelper {
return;
}
startingSecretChat = true;
final ProgressDialog progressDialog = new ProgressDialog(context);
final AlertDialog progressDialog = new AlertDialog(context, 1);
progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(false);
@ -1859,7 +1771,7 @@ public class SecretChatHelper {
progressDialog.dismiss();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
});
@ -1900,7 +1812,7 @@ public class SecretChatHelper {
try {
progressDialog.dismiss();
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat) response;
@ -1941,7 +1853,7 @@ public class SecretChatHelper {
try {
progressDialog.dismiss();
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
@ -1964,7 +1876,7 @@ public class SecretChatHelper {
try {
progressDialog.dismiss();
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
}
@ -1979,7 +1891,7 @@ public class SecretChatHelper {
try {
dialog.dismiss();
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.e(e);
}
}
});