HttpDiscovery.smali
.class public Lorg/bitcoinj/net/discovery/HttpDiscovery;
.super Ljava/lang/Object;
.source "HttpDiscovery.java"
# interfaces
.implements Lorg/bitcoinj/net/discovery/PeerDiscovery;
# static fields
.field private static final log:Lorg/slf4j/Logger;
# instance fields
.field private final client:Lcom/squareup/okhttp/x;
.field private final details:Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
.field private final params:Lorg/bitcoinj/core/NetworkParameters;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 43
const-class v0, Lorg/bitcoinj/net/discovery/HttpDiscovery;
invoke-static {v0}, Lorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger;
move-result-object v0
sput-object v0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->log:Lorg/slf4j/Logger;
return-void
.end method
.method public constructor <init>(Lorg/bitcoinj/core/NetworkParameters;Ljava/net/URI;Lorg/bitcoinj/core/ECKey;)V
.registers 5
.prologue
.line 64
new-instance v0, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
invoke-direct {v0, p3, p2}, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;-><init>(Lorg/bitcoinj/core/ECKey;Ljava/net/URI;)V
invoke-direct {p0, p1, v0}, Lorg/bitcoinj/net/discovery/HttpDiscovery;-><init>(Lorg/bitcoinj/core/NetworkParameters;Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;)V
.line 65
return-void
.end method
.method public constructor <init>(Lorg/bitcoinj/core/NetworkParameters;Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;)V
.registers 4
.prologue
.line 72
new-instance v0, Lcom/squareup/okhttp/x;
invoke-direct {v0}, Lcom/squareup/okhttp/x;-><init>()V
invoke-direct {p0, p1, p2, v0}, Lorg/bitcoinj/net/discovery/HttpDiscovery;-><init>(Lorg/bitcoinj/core/NetworkParameters;Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;Lcom/squareup/okhttp/x;)V
.line 73
return-void
.end method
.method public constructor <init>(Lorg/bitcoinj/core/NetworkParameters;Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;Lcom/squareup/okhttp/x;)V
.registers 6
.prologue
.line 75
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 76
iget-object v0, p2, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;->uri:Ljava/net/URI;
invoke-virtual {v0}, Ljava/net/URI;->getScheme()Ljava/lang/String;
move-result-object v0
const-string v1, "http"
invoke-virtual {v0, v1}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v0
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 77
iput-object p2, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->details:Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
.line 78
iput-object p1, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->params:Lorg/bitcoinj/core/NetworkParameters;
.line 79
iput-object p3, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->client:Lcom/squareup/okhttp/x;
.line 80
return-void
.end method
# virtual methods
.method public getPeers(JJLjava/util/concurrent/TimeUnit;)[Ljava/net/InetSocketAddress;
.registers 11
.prologue
.line 85
:try_start_0
iget-object v0, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->details:Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
iget-object v0, v0, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;->uri:Ljava/net/URI;
invoke-static {v0}, Lcom/squareup/okhttp/HttpUrl;->a(Ljava/net/URI;)Lcom/squareup/okhttp/HttpUrl;
move-result-object v0
invoke-virtual {v0}, Lcom/squareup/okhttp/HttpUrl;->GT()Lcom/squareup/okhttp/HttpUrl$Builder;
move-result-object v0
.line 86
const-wide/16 v2, 0x0
cmp-long v1, p1, v2
if-eqz v1, :cond_1b
.line 87
const-string v1, "srvmask"
invoke-static {p1, p2}, Ljava/lang/Long;->toString(J)Ljava/lang/String;
move-result-object v2
invoke-virtual {v0, v1, v2}, Lcom/squareup/okhttp/HttpUrl$Builder;->aN(Ljava/lang/String;Ljava/lang/String;)Lcom/squareup/okhttp/HttpUrl$Builder;
.line 88
:cond_1b
new-instance v1, Lcom/squareup/okhttp/z;
invoke-direct {v1}, Lcom/squareup/okhttp/z;-><init>()V
.line 89
invoke-virtual {v0}, Lcom/squareup/okhttp/HttpUrl$Builder;->GV()Lcom/squareup/okhttp/HttpUrl;
move-result-object v2
invoke-virtual {v1, v2}, Lcom/squareup/okhttp/z;->d(Lcom/squareup/okhttp/HttpUrl;)Lcom/squareup/okhttp/z;
.line 90
const-string v2, "User-Agent"
const-string v3, "/bitcoinj:0.14.4/"
invoke-virtual {v1, v2, v3}, Lcom/squareup/okhttp/z;->aP(Ljava/lang/String;Ljava/lang/String;)Lcom/squareup/okhttp/z;
.line 91
sget-object v2, Lorg/bitcoinj/net/discovery/HttpDiscovery;->log:Lorg/slf4j/Logger;
const-string v3, "Requesting seeds from {}"
invoke-interface {v2, v3, v0}, Lorg/slf4j/Logger;->info(Ljava/lang/String;Ljava/lang/Object;)V
.line 92
iget-object v0, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->client:Lcom/squareup/okhttp/x;
invoke-virtual {v1}, Lcom/squareup/okhttp/z;->Ha()Lcom/squareup/okhttp/y;
move-result-object v1
invoke-virtual {v0, v1}, Lcom/squareup/okhttp/x;->b(Lcom/squareup/okhttp/y;)Lcom/squareup/okhttp/f;
move-result-object v0
invoke-virtual {v0}, Lcom/squareup/okhttp/f;->GG()Lcom/squareup/okhttp/ab;
move-result-object v0
.line 93
invoke-virtual {v0}, Lcom/squareup/okhttp/ab;->isSuccessful()Z
move-result v1
if-nez v1, :cond_72
.line 94
new-instance v1, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "HTTP request failed: "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v0}, Lcom/squareup/okhttp/ab;->code()I
move-result v3
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v2
const-string v3, " "
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v0}, Lcom/squareup/okhttp/ab;->message()Ljava/lang/String;
move-result-object v0
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v1
:try_end_70
.catch Lorg/bitcoinj/net/discovery/PeerDiscoveryException; {:try_start_0 .. :try_end_70} :catch_70
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_70} :catch_8b
.line 101
:catch_70
move-exception v0
throw v0
.line 95
:cond_72
:try_start_72
invoke-virtual {v0}, Lcom/squareup/okhttp/ab;->Hc()Lcom/squareup/okhttp/ad;
move-result-object v0
invoke-virtual {v0}, Lcom/squareup/okhttp/ad;->byteStream()Ljava/io/InputStream;
move-result-object v0
.line 96
new-instance v1, Ljava/util/zip/GZIPInputStream;
invoke-direct {v1, v0}, Ljava/util/zip/GZIPInputStream;-><init>(Ljava/io/InputStream;)V
.line 97
invoke-static {v1}, Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;->parseDelimitedFrom(Ljava/io/InputStream;)Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;
move-result-object v1
.line 98
invoke-virtual {v0}, Ljava/io/InputStream;->close()V
.line 99
invoke-virtual {p0, v1}, Lorg/bitcoinj/net/discovery/HttpDiscovery;->protoToAddrs(Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;)[Ljava/net/InetSocketAddress;
:try_end_89
.catch Lorg/bitcoinj/net/discovery/PeerDiscoveryException; {:try_start_72 .. :try_end_89} :catch_70
.catch Ljava/lang/Exception; {:try_start_72 .. :try_end_89} :catch_8b
move-result-object v0
return-object v0
.line 102
:catch_8b
move-exception v0
.line 103
new-instance v1, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
invoke-direct {v1, v0}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/Throwable;)V
throw v1
.end method
.method public protoToAddrs(Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;)[Ljava/net/InetSocketAddress;
.registers 10
.prologue
.line 109
iget-object v0, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->details:Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
iget-object v0, v0, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;->pubkey:Lorg/bitcoinj/core/ECKey;
if-eqz v0, :cond_3f
.line 110
invoke-virtual {p1}, Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;->getPubkey()Lcom/google/protobuf/ByteString;
move-result-object v0
invoke-virtual {v0}, Lcom/google/protobuf/ByteString;->toByteArray()[B
move-result-object v0
iget-object v1, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->details:Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
iget-object v1, v1, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;->pubkey:Lorg/bitcoinj/core/ECKey;
invoke-virtual {v1}, Lorg/bitcoinj/core/ECKey;->getPubKey()[B
move-result-object v1
invoke-static {v0, v1}, Ljava/util/Arrays;->equals([B[B)Z
move-result v0
if-nez v0, :cond_24
.line 111
new-instance v0, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
const-string v1, "Public key mismatch"
invoke-direct {v0, v1}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v0
.line 112
:cond_24
invoke-virtual {p1}, Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;->getPeerSeeds()Lcom/google/protobuf/ByteString;
move-result-object v0
invoke-virtual {v0}, Lcom/google/protobuf/ByteString;->toByteArray()[B
move-result-object v0
invoke-static {v0}, Lorg/bitcoinj/core/Sha256Hash;->hash([B)[B
move-result-object v0
.line 113
iget-object v1, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->details:Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;
iget-object v1, v1, Lorg/bitcoinj/net/discovery/HttpDiscovery$Details;->pubkey:Lorg/bitcoinj/core/ECKey;
invoke-virtual {p1}, Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;->getSignature()Lcom/google/protobuf/ByteString;
move-result-object v2
invoke-virtual {v2}, Lcom/google/protobuf/ByteString;->toByteArray()[B
move-result-object v2
invoke-virtual {v1, v0, v2}, Lorg/bitcoinj/core/ECKey;->verifyOrThrow([B[B)V
.line 115
:cond_3f
invoke-virtual {p1}, Lorg/bitcoin/crawler/PeerSeedProtos$SignedPeerSeeds;->getPeerSeeds()Lcom/google/protobuf/ByteString;
move-result-object v0
invoke-static {v0}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeeds;->parseFrom(Lcom/google/protobuf/ByteString;)Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeeds;
move-result-object v1
.line 116
invoke-virtual {v1}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeeds;->getTimestamp()J
move-result-wide v2
invoke-static {}, Lorg/bitcoinj/core/Utils;->currentTimeSeconds()J
move-result-wide v4
const-wide/32 v6, 0x15180
sub-long/2addr v4, v6
cmp-long v0, v2, v4
if-gez v0, :cond_5f
.line 117
new-instance v0, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
const-string v1, "Seed data is more than one day old: replay attack?"
invoke-direct {v0, v1}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v0
.line 118
:cond_5f
invoke-virtual {v1}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeeds;->getNet()Ljava/lang/String;
move-result-object v0
iget-object v2, p0, Lorg/bitcoinj/net/discovery/HttpDiscovery;->params:Lorg/bitcoinj/core/NetworkParameters;
invoke-virtual {v2}, Lorg/bitcoinj/core/NetworkParameters;->getPaymentProtocolId()Ljava/lang/String;
move-result-object v2
invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_77
.line 119
new-instance v0, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
const-string v1, "Network mismatch"
invoke-direct {v0, v1}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v0
.line 120
:cond_77
invoke-virtual {v1}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeeds;->getSeedCount()I
move-result v0
new-array v3, v0, [Ljava/net/InetSocketAddress;
.line 121
const/4 v0, 0x0
.line 122
invoke-virtual {v1}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeeds;->getSeedList()Ljava/util/List;
move-result-object v1
invoke-interface {v1}, Ljava/util/List;->iterator()Ljava/util/Iterator;
move-result-object v4
move v1, v0
:goto_87
invoke-interface {v4}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_a6
invoke-interface {v4}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeedData;
.line 123
add-int/lit8 v2, v1, 0x1
new-instance v5, Ljava/net/InetSocketAddress;
invoke-virtual {v0}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeedData;->getIpAddress()Ljava/lang/String;
move-result-object v6
invoke-virtual {v0}, Lorg/bitcoin/crawler/PeerSeedProtos$PeerSeedData;->getPort()I
move-result v0
invoke-direct {v5, v6, v0}, Ljava/net/InetSocketAddress;-><init>(Ljava/lang/String;I)V
aput-object v5, v3, v1
move v1, v2
goto :goto_87
.line 124
:cond_a6
return-object v3
.end method
.method public shutdown()V
.registers 1
.prologue
.line 129
return-void
.end method