Skip to content

Commit

Permalink
v1.8.1 カード検出の範囲にテザリング範囲外のIPアドレスが含まれないようにしました
Browse files Browse the repository at this point in the history
  • Loading branch information
tateisu committed Mar 17, 2017
1 parent 4423bfb commit e1b7447
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 28 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ android {
applicationId "jp.juggler.fadownloader"
minSdkVersion 14
targetSdkVersion 25
versionCode 12
versionName "1.8"
versionCode 13
versionName "1.8.1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
Expand Down
78 changes: 52 additions & 26 deletions app/src/main/java/jp/juggler/fadownloader/NetworkTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,14 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
Expand Down Expand Up @@ -217,8 +212,17 @@ public boolean cancel( String reason ){
return rv;
}

String getWiFiAPAddress(){
boolean isWifiAPEnabled(){
try{
Boolean b = (Boolean)wifiManager.getClass().getMethod( "isWifiApEnabled" ).invoke( wifiManager );
if(b!=null) return b;
}catch(Throwable ex){
ex.printStackTrace( );
}
return false;
}

String getWiFiAPAddress(){
try{
Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
while( en.hasMoreElements() ){
Expand Down Expand Up @@ -246,17 +250,17 @@ String getWiFiAPAddress(){
return null;
}

void spray( String nw_ip ){
void sprayUDPPacket( String nw_addr, String ip_base ){
long start = SystemClock.elapsedRealtime();
String ip_base = nw_ip.replaceAll( "\\d+$", "" );


try{
byte[] data = new byte[ 1 ];
int port = 80;
DatagramSocket socket = new DatagramSocket();
for( int n = 2 ; n <= 254 ; ++ n ){
String try_ip = ip_base + n;
if( try_ip.equals( nw_ip ) ) continue;
if( try_ip.equals( nw_addr ) ) continue;
try{

DatagramPacket packet = new DatagramPacket(
Expand Down Expand Up @@ -344,26 +348,47 @@ boolean checkStaModeFlashAir(){
}
}

// ARPテーブルにあるアドレスを試す
if(! isWifiAPEnabled()){
log.d( "Wi-Fi Tethering is not enabled." );
return false;
}

final String tethering_address = getWiFiAPAddress();
if( tethering_address == null ){
log.w( "missing Wi-Fi Tethering IP address." );
return false;
}
final String ip_base = tethering_address.replaceAll( "\\d+$", "" );

// ARPテーブルの読み出し
String strArp = readStringFile( "/proc/net/arp" );
if( strArp != null ){
Matcher m = reArp.matcher( strArp );
int nCount = 0;
while( m.find() ){
if( m.group( 4 ).equals( "00:00:00:00:00:00" ) ) continue;
++ nCount;
final String url = "http://" + m.group( 1 ) + "/";
if( checkFlashAirUrl( url ) ){
return true;
}
}
final String ap_addr = getWiFiAPAddress();
if( ap_addr == null ){
log.w( "missing Wi-Fi Tethering IP address." );
}else{
spray( ap_addr );
if( strArp == null ){
log.e( "can not read ARP table." );
return false;
}
// ARPテーブル中のIPアドレスを確認
Matcher m = reArp.matcher( strArp );
while( m.find() ){
String item_ip = m.group( 1 );
String item_mac = m.group( 4 );

// MACアドレスが不明なエントリや
// テザリング範囲と無関係なエントリは無視する
if( item_mac.equals( "00:00:00:00:00:00" )
|| ! item_ip.startsWith( ip_base )
) continue;

if( checkFlashAirUrl( "http://" +item_ip + "/" ) ){
return true;
}
}

// カードが見つからない場合
// 直接ARPリクエストを投げるのは難しい?ので
// UDPパケットをばらまく
// 次回以降の確認で効果があるといいな
sprayUDPPacket( tethering_address, ip_base );

return false;
}

Expand Down Expand Up @@ -414,6 +439,7 @@ boolean checkStaModeFlashAir(){
}
ns_list.afterAllNetwork();

// FlashAir STAモードの時の処理
if( target_type == DownloadWorker.TARGET_TYPE_FLASHAIR_STA ){
return checkStaModeFlashAir();
}
Expand Down

0 comments on commit e1b7447

Please sign in to comment.