mirror of
https://github.com/fabianonline/telegram_backup.git
synced 2024-11-22 16:56:16 +00:00
Kotlogram works, login is working.
This commit is contained in:
parent
fbd796eb10
commit
1c3d10befb
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
build/
|
||||||
|
.rgadle/
|
||||||
|
.gradle/
|
||||||
|
auth.dat
|
||||||
|
dc.dat
|
28
build.gradle
28
build.gradle
@ -1 +1,29 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
apply plugin: 'application'
|
||||||
|
|
||||||
|
mainClassName= 'de.fabianonline.telegram_backup.Main'
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
url "https://jitpack.io"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile 'com.github.badoualy:kotlogram:0.0.6'
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
standardInput = System.in
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
attributes "Main-Class": "$mainClassName"
|
||||||
|
}
|
||||||
|
|
||||||
|
from {
|
||||||
|
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
package de.fabianonline.telegram_backup;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
System.out.println("Hello World");
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,69 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
import com.github.badoualy.telegram.api.TelegramApiStorage;
|
||||||
|
import com.github.badoualy.telegram.mtproto.DataCenter;
|
||||||
|
import com.github.badoualy.telegram.mtproto.auth.AuthKey;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
class ApiStorage implements TelegramApiStorage {
|
||||||
|
public void saveAuthKey(AuthKey authKey) {
|
||||||
|
try {
|
||||||
|
FileUtils.writeByteArrayToFile(Config.FILE_AUTH_KEY, authKey.getKey());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthKey loadAuthKey() {
|
||||||
|
try {
|
||||||
|
return new AuthKey(FileUtils.readFileToByteArray(Config.FILE_AUTH_KEY));
|
||||||
|
} catch (IOException e) {
|
||||||
|
if (!(e instanceof FileNotFoundException)) e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveDc(DataCenter dc) {
|
||||||
|
try {
|
||||||
|
FileUtils.write(Config.FILE_DC, dc.toString());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataCenter loadDc() {
|
||||||
|
try {
|
||||||
|
String[] infos = FileUtils.readFileToString(Config.FILE_DC).split(":");
|
||||||
|
return new DataCenter(infos[0], Integer.parseInt(infos[1]));
|
||||||
|
} catch (IOException e) {
|
||||||
|
if (!(e instanceof FileNotFoundException)) e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteAuthKey() {
|
||||||
|
try {
|
||||||
|
FileUtils.forceDelete(Config.FILE_AUTH_KEY);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteDc() {
|
||||||
|
try {
|
||||||
|
FileUtils.forceDelete(Config.FILE_DC);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveServerSalt(long salt) {}
|
||||||
|
|
||||||
|
public Long loadServerSalt() { return null; }
|
||||||
|
}
|
17
src/main/java/de/fabianonline/telegram_backup/Config.java
Normal file
17
src/main/java/de/fabianonline/telegram_backup/Config.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
class Config {
|
||||||
|
public static final int APP_ID = 32860;
|
||||||
|
public static final String APP_HASH = "16e4ff955cd0adfc058f95ca564f562d";
|
||||||
|
public static final String APP_MODEL = "Desktop";
|
||||||
|
public static final String APP_SYSVER = "1.0";
|
||||||
|
public static final String APP_APPVER = "0.1";
|
||||||
|
public static final String APP_LANG = "en";
|
||||||
|
|
||||||
|
public static final File FILE_AUTH_KEY = new File("auth.dat");
|
||||||
|
public static final File FILE_DC = new File("dc.dat");
|
||||||
|
public static final File FILE_SALT = new File("salt.dat");
|
||||||
|
}
|
||||||
|
|
60
src/main/java/de/fabianonline/telegram_backup/Main.java
Normal file
60
src/main/java/de/fabianonline/telegram_backup/Main.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
import com.github.badoualy.telegram.api.Kotlogram;
|
||||||
|
import com.github.badoualy.telegram.api.TelegramApp;
|
||||||
|
import com.github.badoualy.telegram.api.TelegramClient;
|
||||||
|
import com.github.badoualy.telegram.tl.exception.RpcErrorException;
|
||||||
|
|
||||||
|
import de.fabianonline.telegram_backup.Config;
|
||||||
|
import de.fabianonline.telegram_backup.ApiStorage;
|
||||||
|
import de.fabianonline.telegram_backup.UserManager;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static TelegramApp app = new TelegramApp(Config.APP_ID, Config.APP_HASH, Config.APP_MODEL, Config.APP_SYSVER, Config.APP_APPVER, Config.APP_LANG);
|
||||||
|
public static UserManager user = null;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello World");
|
||||||
|
|
||||||
|
Kotlogram.setDebugLogEnabled(true);
|
||||||
|
|
||||||
|
TelegramClient client = Kotlogram.getDefaultClient(app, new ApiStorage());
|
||||||
|
|
||||||
|
try {
|
||||||
|
user = new UserManager(client);
|
||||||
|
|
||||||
|
if (!user.isLoggedIn()) {
|
||||||
|
System.out.println("Please enter your phone number in international format.");
|
||||||
|
System.out.println("Example: +4917077651234");
|
||||||
|
System.out.print("> ");
|
||||||
|
String phone = new Scanner(System.in).nextLine();
|
||||||
|
user.sendCodeToPhoneNumber(phone);
|
||||||
|
|
||||||
|
System.out.println("Telegram sent you a code. Please enter it here.");
|
||||||
|
System.out.print("> ");
|
||||||
|
String code = new Scanner(System.in).nextLine();
|
||||||
|
user.verifyCode(code);
|
||||||
|
|
||||||
|
if (user.isPasswordNeeded()) {
|
||||||
|
System.out.println("We also need your account password.");
|
||||||
|
System.out.print("> ");
|
||||||
|
String pw = new Scanner(System.in).nextLine();
|
||||||
|
user.verifyPassword(pw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("You are now signed in as " + user.getUserString());
|
||||||
|
} catch (RpcErrorException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
client.close();
|
||||||
|
}
|
||||||
|
System.out.println("----- EXIT -----");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
import com.github.badoualy.telegram.tl.TLContext;
|
||||||
|
import com.github.badoualy.telegram.tl.api.account.TLPassword;
|
||||||
|
import com.github.badoualy.telegram.tl.core.TLMethod;
|
||||||
|
import com.github.badoualy.telegram.tl.core.TLObject;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import static com.github.badoualy.telegram.tl.StreamUtils.readTLObject;
|
||||||
|
|
||||||
|
public class TLRequestAccountGetPasswordWithCurrentSalt extends TLMethod<TLPassword> {
|
||||||
|
public static final int CONSTRUCTOR_ID = 0x548a30f5;
|
||||||
|
private final String _constructor = "account.getPassword#548a30f5";
|
||||||
|
public TLRequestAccountGetPasswordWithCurrentSalt() {}
|
||||||
|
public TLPassword deserializeResponse(InputStream stream, TLContext context) throws IOException {
|
||||||
|
final TLObject response = readTLObject(stream, context);
|
||||||
|
if (response == null) {
|
||||||
|
throw new IOException("Unable to parse response");
|
||||||
|
}
|
||||||
|
if (!(response instanceof TLPassword)) {
|
||||||
|
throw new IOException("Incorrect response type, expected getClass().getCanonicalName(), found response.getClass().getCanonicalName()");
|
||||||
|
}
|
||||||
|
return (TLPassword) response;
|
||||||
|
}
|
||||||
|
public String toString() { return _constructor; }
|
||||||
|
public int getConstructorId() { return CONSTRUCTOR_ID; }
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
import com.github.badoualy.telegram.api.TelegramClient;
|
||||||
|
import com.github.badoualy.telegram.tl.api.auth.TLAbsSentCode;
|
||||||
|
import com.github.badoualy.telegram.tl.api.auth.TLAuthorization;
|
||||||
|
import com.github.badoualy.telegram.tl.api.TLUser;
|
||||||
|
import com.github.badoualy.telegram.tl.api.TLUserFull;
|
||||||
|
import com.github.badoualy.telegram.tl.api.TLInputUserSelf;
|
||||||
|
import com.github.badoualy.telegram.tl.api.account.TLPassword;
|
||||||
|
import com.github.badoualy.telegram.tl.exception.RpcErrorException;
|
||||||
|
import com.github.badoualy.telegram.tl.core.TLBytes;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
class UserManager {
|
||||||
|
public TLUser user = null;
|
||||||
|
public String phone = null;
|
||||||
|
private String code = null;
|
||||||
|
private TelegramClient client = null;
|
||||||
|
private TLAbsSentCode sent_code = null;
|
||||||
|
private TLAuthorization auth = null;
|
||||||
|
private boolean password_needed = false;
|
||||||
|
|
||||||
|
public UserManager(TelegramClient c) throws IOException {
|
||||||
|
this.client = c;
|
||||||
|
try {
|
||||||
|
TLUserFull full_user = this.client.usersGetFullUser(new TLInputUserSelf());
|
||||||
|
this.user = full_user.getUser().getAsUser();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// This may happen. Ignoring it.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLoggedIn() { return user!=null; }
|
||||||
|
|
||||||
|
public void sendCodeToPhoneNumber(String number) throws RpcErrorException, IOException {
|
||||||
|
this.phone = number;
|
||||||
|
this.sent_code = this.client.authSendCode(this.phone, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verifyCode(String code) throws RpcErrorException, IOException {
|
||||||
|
this.code = code;
|
||||||
|
try {
|
||||||
|
this.auth = client.authSignIn(phone, this.sent_code.getPhoneCodeHash(), this.code);
|
||||||
|
this.user = auth.getUser().getAsUser();
|
||||||
|
} catch (RpcErrorException e) {
|
||||||
|
if (!e.getTag().equals("401: SESSION_PASSWORD_NEEDED")) throw e;
|
||||||
|
this.password_needed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPasswordNeeded() { return this.password_needed; }
|
||||||
|
|
||||||
|
public void verifyPassword(String pw) throws RpcErrorException, IOException {
|
||||||
|
byte[] password = pw.getBytes("UTF-8");
|
||||||
|
byte[] salt = ((TLPassword)client.executeRpcQuery(new TLRequestAccountGetPasswordWithCurrentSalt())).getCurrentSalt().getData();
|
||||||
|
MessageDigest md = null;
|
||||||
|
try {
|
||||||
|
md = MessageDigest.getInstance("SHA-256");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
byte[] salted = new byte[2*salt.length + password.length];
|
||||||
|
System.arraycopy(salt, 0, salted, 0, salt.length);
|
||||||
|
System.arraycopy(password, 0, salted, salt.length, password.length);
|
||||||
|
System.arraycopy(salt, 0, salted, salt.length+password.length, salt.length);
|
||||||
|
byte[] hash = md.digest(salted);
|
||||||
|
auth = client.authCheckPassword(new TLBytes(hash));
|
||||||
|
this.user = auth.getUser().getAsUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserString() {
|
||||||
|
if (this.user==null) return "Not logged in";
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (this.user.getFirstName()!=null) {
|
||||||
|
sb.append(this.user.getFirstName());
|
||||||
|
}
|
||||||
|
if (this.user.getLastName()!=null) {
|
||||||
|
sb.append(" ");
|
||||||
|
sb.append(this.user.getLastName());
|
||||||
|
}
|
||||||
|
if (this.user.getUsername()!=null) {
|
||||||
|
sb.append(" (@");
|
||||||
|
sb.append(this.user.getUsername());
|
||||||
|
sb.append(")");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user