Войти или зарегистрироваться

Туториал Связываем клиент, лаунчер и сайт (проверка md5)

  • Автор темы Автор темы ilia770
  • Дата начала Дата начала
Все получилось! Вот инструкция:
Код:
public static String calculateHash(MessageDigest algorithm,
            String fileName) throws Exception{
        FileInputStream    fis = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(fis);
        DigestInputStream  dis = new DigestInputStream(bis, algorithm);
 
        while (dis.read() != -1);
              byte[] hash = algorithm.digest();
 
        return byteArray2Hex(hash);
    }
private static String byteArray2Hex(byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        return formatter.toString();
    }


1.Верхний код вставляем в LauncherFrame после вот этого, что внизу:


Код:
//--------------------------------
//  public String getFakeResult(String userName) {
//        return Util.getFakeLatestVersion() + ":35b9fd01865fda9d70b157e244cf801c:" + userName + ":12345:";
//      }
//---------------------------------



Код:
      String applicationData = System.getenv("APPDATA");
      String  f = applicationData + "/.minecraft/bin/minecraft.jar";
 
      try
{
 
  MessageDigest md5  = MessageDigest.getInstance("MD5");
String p = calculateHash(md5, f);
 
 
                URL localURL = new URL("http://путь к папке с minecraft.jar на сайте/hash.php?hash=" + p);
        BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
        String str2 = localBufferedReader.readLine();
        if (str2.equalsIgnoreCase("NO")){
            {
                GameUpdater.forceUpdate = true;
            }
 
      }
        else if (str2.equalsIgnoreCase("YES"))
        {
        }
 
  }
 
catch(FileNotFoundException fnfn)
{
 
 
}

2.Код, что выше вставляем после:
Код:
  public void login(String userName, String password) {
    try {
      String parameters = "user=" + URLEncoder.encode(userName, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8") + "&version=" + 13;
      String result = Util.excutePost("http://ваш путь к auth/auth.php", parameters);
//      String result = getFakeResult(userName);
      if (result == null) {
        showError("Невозможно подключится к серверу!");
        loginForm.setNoNetwork();
        return;
      }

Код:
import java.io.FileInputStream;
import java.net.URL;
import java.io.InputStreamReader;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.security.MessageDigest;
import java.security.DigestInputStream;
import java.util.Formatter;



3. Вставляем верхний код туда же в LauncherFrame в самом верху файла после этих строк

Код:
package net.minecraft;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.UIManager;





4.Потом на сайте создаем файл hash.php в папке, где у вас лежит minecraft.jar и пишем в него:
Код:
<?php
// Файл со скриптом положить на сервер рядом с файлом "minecraft.jar", хеш которого будет расчитываться для сверки c хешем передаваемым лаунчером.
 
$clientHash = $_GET['hash']; //хеш передаваемый лаунчером по ссылке
$serverHash = md5_file('minecraft.jar'); //хеш расчитываемый сервером
 
if ($clientHash == $serverHash)
{
    echo 'YES';
}
else
{
    echo 'NO';
}
?>


Всё должно работать! У меня всё работает прекрасно!!!
Большое спасибо, все работает. (сборка 1.2.5-R3)

З.Ы. Если папка с игрой не .minecraft, то в строке ниже заменить на свою.
Код:
 String  f = applicationData + "/.minecraft/bin/minecraft.jar";
 
Все получилось! Вот инструкция:
Код:
public static String calculateHash(MessageDigest algorithm,
            String fileName) throws Exception{
        FileInputStream    fis = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(fis);
        DigestInputStream  dis = new DigestInputStream(bis, algorithm);
 
        while (dis.read() != -1);
              byte[] hash = algorithm.digest();
 
        return byteArray2Hex(hash);
    }
private static String byteArray2Hex(byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        return formatter.toString();
    }


1.Верхний код вставляем в LauncherFrame после вот этого, что внизу:


Код:
//--------------------------------
//  public String getFakeResult(String userName) {
//        return Util.getFakeLatestVersion() + ":35b9fd01865fda9d70b157e244cf801c:" + userName + ":12345:";
//      }
//---------------------------------



Код:
      String applicationData = System.getenv("APPDATA");
      String  f = applicationData + "/.minecraft/bin/minecraft.jar";
 
      try
{
 
  MessageDigest md5  = MessageDigest.getInstance("MD5");
String p = calculateHash(md5, f);
 
 
                URL localURL = new URL("http://путь к папке с minecraft.jar на сайте/hash.php?hash=" + p);
        BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
        String str2 = localBufferedReader.readLine();
        if (str2.equalsIgnoreCase("NO")){
            {
                GameUpdater.forceUpdate = true;
            }
 
      }
        else if (str2.equalsIgnoreCase("YES"))
        {
        }
 
  }
 
catch(FileNotFoundException fnfn)
{
 
 
}

2.Код, что выше вставляем после:
Код:
  public void login(String userName, String password) {
    try {
      String parameters = "user=" + URLEncoder.encode(userName, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8") + "&version=" + 13;
      String result = Util.excutePost("http://ваш путь к auth/auth.php", parameters);
//      String result = getFakeResult(userName);
      if (result == null) {
        showError("Невозможно подключится к серверу!");
        loginForm.setNoNetwork();
        return;
      }

Код:
import java.io.FileInputStream;
import java.net.URL;
import java.io.InputStreamReader;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.security.MessageDigest;
import java.security.DigestInputStream;
import java.util.Formatter;



3. Вставляем верхний код туда же в LauncherFrame в самом верху файла после этих строк

Код:
package net.minecraft;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.UIManager;





4.Потом на сайте создаем файл hash.php в папке, где у вас лежит minecraft.jar и пишем в него:
Код:
<?php
// Файл со скриптом положить на сервер рядом с файлом "minecraft.jar", хеш которого будет расчитываться для сверки c хешем передаваемым лаунчером.
 
$clientHash = $_GET['hash']; //хеш передаваемый лаунчером по ссылке
$serverHash = md5_file('minecraft.jar'); //хеш расчитываемый сервером
 
if ($clientHash == $serverHash)
{
    echo 'YES';
}
else
{
    echo 'NO';
}
?>


Всё должно работать! У меня всё работает прекрасно!!!
А как сделать тоже самое но только для папок Mods и Texturepack скажи плиз?
 
Java:
String applicationData = System.getenv("APPDATA");
String f = applicationData + "/.minecraft/bin/minecraft.jar";
вот тут выбирать путь...
Не понял( просто вместо
String f = applicationData + "/.minecraft/bin/minecraft.jar";
надо написать ?
String f = applicationData + "/.minecraft/mods";
 
честно, я думаю да=)
(с java не очень дружу)
 
Java:
File applicationData = new File(Util.getWorkingDirectory() + File.separator + "bin" + File.separator);
    String f = applicationData + "minecraft.jar";
 
    try
    {
 
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
 
 
    URL localURL = new URL("http://mes.16mb.com/hash.php?hash=" + p);
    BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
    String str2 = localBufferedReader.readLine();
    if (str2.equalsIgnoreCase("NO")){
    {
    GameUpdater.forceUpdate = true;
    }
 
    }
    else if (str2.equalsIgnoreCase("YES"))
    {
    }
 
    }
 
    catch(FileNotFoundException fnfn)
    {
    GameUpdater.forceUpdate = true;
    }

народ, у меня какая то лажа идет с портативным...
не могу заставить его найти файл...
каждый раз обновление, а это не есть хорошо...
 
Java:
File applicationData = new File(Util.getWorkingDirectory() + File.separator + "bin" + File.separator);
    String f = applicationData + "minecraft.jar";
 
    try
    {
 
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
 
 
    URL localURL = new URL("http://mes.16mb.com/hash.php?hash=" + p);
    BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
    String str2 = localBufferedReader.readLine();
    if (str2.equalsIgnoreCase("NO")){
    {
    GameUpdater.forceUpdate = true;
    }
 
    }
    else if (str2.equalsIgnoreCase("YES"))
    {
    }
 
    }
 
    catch(FileNotFoundException fnfn)
    {
    GameUpdater.forceUpdate = true;
    }

народ, у меня какая то лажа идет с портативным...
не могу заставить его найти файл...
каждый раз обновление, а это не есть хорошо...
Название папки менял? если у тебя своё а не .minecraft
 
@SmallSmile Да, но дело не в том.
Я нашел ошибку.
Первая строка, не "File", а "String".
Java:
String applicationData = (Util.getWorkingDirectory() + File.separator + "bin" + File.separator);
    String f = applicationData + "minecraft.jar";
 
    try
    {
 
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
 
 
    URL localURL = new URL("http://mes.16mb.com/hash.php?hash=" + p);
    BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
    String str2 = localBufferedReader.readLine();
    if (str2.equalsIgnoreCase("NO")){
    {
    GameUpdater.forceUpdate = true;
    }
 
    }
    else if (str2.equalsIgnoreCase("YES"))
    {
    }
 
    }
 
@SmallSmile Да, но дело не в том.
Я нашел ошибку.
Первая строка, не "File", а "String".
Java:
String applicationData = (Util.getWorkingDirectory() + File.separator + "bin" + File.separator);
    String f = applicationData + "minecraft.jar";
 
    try
    {
 
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
 
 
    URL localURL = new URL("http://mes.16mb.com/hash.php?hash=" + p);
    BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
    String str2 = localBufferedReader.readLine();
    if (str2.equalsIgnoreCase("NO")){
    {
    GameUpdater.forceUpdate = true;
    }
 
    }
    else if (str2.equalsIgnoreCase("YES"))
    {
    }
 
    }
http://rubukkit.org/posts/147378
 
с портативным(!)
Java:
String applicationData = (Util.getWorkingDirectory() + File.separator + "bin" + File.separator);
    String f = applicationData + "minecraft.jar";
 
Не мало времени провозился с установкой, а точнее с выяснением почему не работает. В итоге получилось когда перекодировал hash.php в windows-1251. Если лаунчер получает в ответ что-то кроме NO или YES и даже если вообще ни чего не получает, он автоматом пропускает с левым клиентом. Есть возможность сделать так, что бы пропускал только с ответом YES, в остальных случаях закачивал клиент заново?
 
Не мало времени провозился с установкой, а точнее с выяснением почему не работает. В итоге получилось когда перекодировал hash.php в windows-1251. Если лаунчер получает в ответ что-то кроме NO или YES и даже если вообще ни чего не получает, он автоматом пропускает с левым клиентом. Есть возможность сделать так, что бы пропускал только с ответом YES, в остальных случаях закачивал клиент заново?

Java:
    try
    {
   
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
   
   
    URL localURL = new URL("http://youdomain.com/hash.php?hash=" + p);
    BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
    String str2 = localBufferedReader.readLine();
    if (str2.equalsIgnoreCase("YES"))
    {
    } else {
    GameUpdater.forceUpdate = true;
    }
   
    }
   
    catch(FileNotFoundException fnfn)
    {
    GameUpdater.forceUpdate = true;
    }
 
Java:
    try
    {
 
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
 
 
    URL localURL = new URL("http://youdomain.com/hash.php?hash=" + p);
    BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
    String str2 = localBufferedReader.readLine();
    if (str2.equalsIgnoreCase("YES"))
    {
    } else {
    GameUpdater.forceUpdate = true;
    }
 
    }
 
    catch(FileNotFoundException fnfn)
    {
    GameUpdater.forceUpdate = true;
    }
Спасибо, буду пробовать.
 
Назад
Верх