mirror of
https://github.com/go-i2p/onramp.git
synced 2025-09-06 12:47:50 -04:00
Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cdad2747a7 | ||
![]() |
394c9f9fb8 | ||
![]() |
f32a695cff | ||
![]() |
41dcb29429 | ||
![]() |
0e2d9a60a4 | ||
![]() |
f654f2635b | ||
![]() |
eb11a4ec64 | ||
![]() |
e2e443e158 | ||
![]() |
c93b68c0ab | ||
![]() |
af628a80ce | ||
![]() |
c6b30ad4cb | ||
![]() |
002fd2f79c | ||
![]() |
2f2d359ffb | ||
![]() |
59c4ed7e73 | ||
![]() |
dc495c94f6 | ||
![]() |
64cb1842d0 | ||
![]() |
55f43b8382 | ||
![]() |
1c866297b5 | ||
![]() |
8170ddbce2 | ||
![]() |
cd87569359 | ||
![]() |
b0d86c9654 | ||
![]() |
d7f20533be | ||
![]() |
3f39d265f7 | ||
![]() |
962259e26c | ||
![]() |
1ccf3ab24b |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -14,3 +14,6 @@
|
|||||||
# Dependency directories (remove the comment below to include it)
|
# Dependency directories (remove the comment below to include it)
|
||||||
# vendor/
|
# vendor/
|
||||||
data-dir*
|
data-dir*
|
||||||
|
i2pkeys/
|
||||||
|
onionkeys/
|
||||||
|
tlskeys/
|
18
DESC.html
18
DESC.html
@@ -7,6 +7,7 @@
|
|||||||
<meta name="description" content="onramp.git" />
|
<meta name="description" content="onramp.git" />
|
||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -16,6 +17,11 @@
|
|||||||
<div id="shownav">
|
<div id="shownav">
|
||||||
<div id="hidenav">
|
<div id="hidenav">
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="..">
|
||||||
|
Up one level ^
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="index.html">
|
<a href="index.html">
|
||||||
index
|
index
|
||||||
@@ -45,11 +51,23 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h1>
|
<h1>
|
||||||
|
<a href="#onramp" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
onramp
|
onramp
|
||||||
</h1>
|
</h1>
|
||||||
<p>
|
<p>
|
||||||
An above-all easy to use library for setting up Tor and I2P services and clients.
|
An above-all easy to use library for setting up Tor and I2P services and clients.
|
||||||
</p>
|
</p>
|
||||||
|
<div id="sourcecode">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/eyedeekay/onramp.git">
|
||||||
|
Source Code: (https://github.com/eyedeekay/onramp.git)
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="#show">
|
<a href="#show">
|
||||||
Show license
|
Show license
|
||||||
|
185
DOCS.html
185
DOCS.html
@@ -7,6 +7,7 @@
|
|||||||
<meta name="description" content="onramp.git" />
|
<meta name="description" content="onramp.git" />
|
||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -16,6 +17,11 @@
|
|||||||
<div id="shownav">
|
<div id="shownav">
|
||||||
<div id="hidenav">
|
<div id="hidenav">
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="..">
|
||||||
|
Up one level ^
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="index.html">
|
<a href="index.html">
|
||||||
index
|
index
|
||||||
@@ -45,45 +51,65 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h1>
|
<h1>
|
||||||
|
<a href="#onramp-i2p-and-tor-library" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Onramp I2P and Tor Library
|
Onramp I2P and Tor Library
|
||||||
</h1>
|
</h1>
|
||||||
<p>
|
<p>
|
||||||
<a href="http://pkg.go.dev/." rel="nofollow">
|
<a href="http://pkg.go.dev/." rel="nofollow">
|
||||||
<img src="https://img.shields.io/badge/pkg.go.dev-doc-blue" alt="GoDoc"/>
|
<img src="https://img.shields.io/badge/pkg.go.dev-doc-blue" alt="GoDoc">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://goreportcard.com/report/." rel="nofollow">
|
<a href="https://goreportcard.com/report/." rel="nofollow">
|
||||||
<img src="https://goreportcard.com/badge/." alt="Go Report Card"/>
|
<img src="https://goreportcard.com/badge/." alt="Go Report Card">
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
<h2>
|
<h2>
|
||||||
|
<a href="#variables" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Variables
|
Variables
|
||||||
</h2>
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
I2P_KEYSTORE_PATH is the place where I2P Keys will be saved.
|
I2P_KEYSTORE_PATH is the place where I2P Keys will be saved.
|
||||||
it defaults to the directory “i2pkeys” current working directory
|
it defaults to the directory "i2pkeys" current working directory
|
||||||
reference it by calling I2PKeystorePath() to check for errors
|
reference it by calling I2PKeystorePath() to check for errors
|
||||||
</p>
|
</p>
|
||||||
<pre><code>var I2P_KEYSTORE_PATH = i2pdefault
|
<div>
|
||||||
</code></pre>
|
<pre>var I2P_KEYSTORE_PATH = i2pdefault
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
<p>
|
<p>
|
||||||
ONION_KEYSTORE_PATH is the place where Onion Keys will be saved.
|
ONION_KEYSTORE_PATH is the place where Onion Keys will be saved.
|
||||||
it defaults to the directory “onionkeys” current working directory
|
it defaults to the directory "onionkeys" current working directory
|
||||||
reference it by calling OnionKeystorePath() to check for errors
|
reference it by calling OnionKeystorePath() to check for errors
|
||||||
</p>
|
</p>
|
||||||
<pre><code>var ONION_KEYSTORE_PATH = tordefault
|
<div>
|
||||||
</code></pre>
|
<pre>var ONION_KEYSTORE_PATH = tordefault
|
||||||
<pre><code>var OPT_DEFAULTS = sam3.Options_Default
|
</pre>
|
||||||
</code></pre>
|
</div>
|
||||||
|
<div>
|
||||||
|
<pre>var OPT_DEFAULTS = sam3.Options_Default
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
<p>
|
<p>
|
||||||
SAM_ADDR is the default I2P SAM address. It can be overridden by the
|
SAM_ADDR is the default I2P SAM address. It can be overridden by the
|
||||||
struct or by changing this variable.
|
struct or by changing this variable.
|
||||||
</p>
|
</p>
|
||||||
<pre><code>var SAM_ADDR = "127.0.0.1:7656"
|
<div>
|
||||||
</code></pre>
|
<pre>var SAM_ADDR = "127.0.0.1:7656"
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
<h2>
|
<h2>
|
||||||
|
<a href="#functions" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Functions
|
Functions
|
||||||
</h2>
|
</h2>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-closeallgarlic" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L211" rel="nofollow">
|
<a href="/garlic.go#L211" rel="nofollow">
|
||||||
CloseAllGarlic
|
CloseAllGarlic
|
||||||
@@ -99,6 +125,9 @@
|
|||||||
affect objects instantiated by an app.
|
affect objects instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-closeallonion" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L174" rel="nofollow">
|
<a href="/onion.go#L174" rel="nofollow">
|
||||||
CloseAllOnion
|
CloseAllOnion
|
||||||
@@ -114,6 +143,9 @@
|
|||||||
affect objects instantiated by an app.
|
affect objects instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-closegarlic" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L220" rel="nofollow">
|
<a href="/garlic.go#L220" rel="nofollow">
|
||||||
CloseGarlic
|
CloseGarlic
|
||||||
@@ -129,6 +161,9 @@
|
|||||||
objects instantiated by an app.
|
objects instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-closeonion" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L183" rel="nofollow">
|
<a href="/onion.go#L183" rel="nofollow">
|
||||||
CloseOnion
|
CloseOnion
|
||||||
@@ -144,6 +179,9 @@
|
|||||||
objects instantiated by an app.
|
objects instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-createtlscertificate" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/tls.go#L20" rel="nofollow">
|
<a href="/tls.go#L20" rel="nofollow">
|
||||||
CreateTLSCertificate
|
CreateTLSCertificate
|
||||||
@@ -155,6 +193,9 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-deletegarlickeys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L159" rel="nofollow">
|
<a href="/garlic.go#L159" rel="nofollow">
|
||||||
DeleteGarlicKeys
|
DeleteGarlicKeys
|
||||||
@@ -172,6 +213,9 @@
|
|||||||
address.
|
address.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-deletei2pkeystore" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L60" rel="nofollow">
|
<a href="/common.go#L60" rel="nofollow">
|
||||||
DeleteI2PKeyStore
|
DeleteI2PKeyStore
|
||||||
@@ -186,6 +230,9 @@
|
|||||||
DeleteI2PKeyStore deletes the I2P Keystore.
|
DeleteI2PKeyStore deletes the I2P Keystore.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-deleteonionkeys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L216" rel="nofollow">
|
<a href="/onion.go#L216" rel="nofollow">
|
||||||
DeleteOnionKeys
|
DeleteOnionKeys
|
||||||
@@ -201,6 +248,9 @@
|
|||||||
keystore + tunName.
|
keystore + tunName.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-deletetorkeystore" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L78" rel="nofollow">
|
<a href="/common.go#L78" rel="nofollow">
|
||||||
DeleteTorKeyStore
|
DeleteTorKeyStore
|
||||||
@@ -215,6 +265,9 @@
|
|||||||
DeleteTorKeyStore deletes the Onion Keystore.
|
DeleteTorKeyStore deletes the Onion Keystore.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-dial" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L85" rel="nofollow">
|
<a href="/common.go#L85" rel="nofollow">
|
||||||
Dial
|
Dial
|
||||||
@@ -231,6 +284,9 @@
|
|||||||
if the address ends in anything else, it returns a Tor connection.
|
if the address ends in anything else, it returns a Tor connection.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-dialgarlic" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L246" rel="nofollow">
|
<a href="/garlic.go#L246" rel="nofollow">
|
||||||
DialGarlic
|
DialGarlic
|
||||||
@@ -242,11 +298,14 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
DialGarlic returns a net.Conn for a garlic structure’s keys
|
DialGarlic returns a net.Conn for a garlic structure's keys
|
||||||
corresponding to a structure managed by the onramp library
|
corresponding to a structure managed by the onramp library
|
||||||
and not instantiated by an app.
|
and not instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-dialonion" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L205" rel="nofollow">
|
<a href="/onion.go#L205" rel="nofollow">
|
||||||
DialOnion
|
DialOnion
|
||||||
@@ -258,11 +317,14 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
DialOnion returns a net.Conn for a onion structure’s keys
|
DialOnion returns a net.Conn for a onion structure's keys
|
||||||
corresponding to a structure managed by the onramp library
|
corresponding to a structure managed by the onramp library
|
||||||
and not instantiated by an app.
|
and not instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-getjoinedwd" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L17" rel="nofollow">
|
<a href="/common.go#L17" rel="nofollow">
|
||||||
GetJoinedWD
|
GetJoinedWD
|
||||||
@@ -277,6 +339,9 @@
|
|||||||
GetJoinedWD returns the working directory joined with the given path.
|
GetJoinedWD returns the working directory joined with the given path.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-i2pkeys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L173" rel="nofollow">
|
<a href="/garlic.go#L173" rel="nofollow">
|
||||||
I2PKeys
|
I2PKeys
|
||||||
@@ -292,6 +357,9 @@
|
|||||||
tunnel name. If none exist, they are created and stored.
|
tunnel name. If none exist, they are created and stored.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-i2pkeystorepath" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L49" rel="nofollow">
|
<a href="/common.go#L49" rel="nofollow">
|
||||||
I2PKeystorePath
|
I2PKeystorePath
|
||||||
@@ -308,6 +376,9 @@
|
|||||||
not exist, it creates it.
|
not exist, it creates it.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-listen" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L101" rel="nofollow">
|
<a href="/common.go#L101" rel="nofollow">
|
||||||
Listen
|
Listen
|
||||||
@@ -322,9 +393,12 @@
|
|||||||
Listen returns a listener for the given network and address.
|
Listen returns a listener for the given network and address.
|
||||||
if network is i2p or garlic, it returns an I2P listener.
|
if network is i2p or garlic, it returns an I2P listener.
|
||||||
if network is tor or onion, it returns an Onion listener.
|
if network is tor or onion, it returns an Onion listener.
|
||||||
if keys ends with “.i2p”, it returns an I2P listener.
|
if keys ends with ".i2p", it returns an I2P listener.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-listengarlic" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L234" rel="nofollow">
|
<a href="/garlic.go#L234" rel="nofollow">
|
||||||
ListenGarlic
|
ListenGarlic
|
||||||
@@ -336,11 +410,14 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
ListenGarlic returns a net.Listener for a garlic structure’s keys
|
ListenGarlic returns a net.Listener for a garlic structure's keys
|
||||||
corresponding to a structure managed by the onramp library
|
corresponding to a structure managed by the onramp library
|
||||||
and not instantiated by an app.
|
and not instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-listenonion" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L193" rel="nofollow">
|
<a href="/onion.go#L193" rel="nofollow">
|
||||||
ListenOnion
|
ListenOnion
|
||||||
@@ -352,11 +429,14 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
ListenOnion returns a net.Listener for a onion structure’s keys
|
ListenOnion returns a net.Listener for a onion structure's keys
|
||||||
corresponding to a structure managed by the onramp library
|
corresponding to a structure managed by the onramp library
|
||||||
and not instantiated by an app.
|
and not instantiated by an app.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-newtlscertificate" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/tls.go#L114" rel="nofollow">
|
<a href="/tls.go#L114" rel="nofollow">
|
||||||
NewTLSCertificate
|
NewTLSCertificate
|
||||||
@@ -368,6 +448,9 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-newtlscertificatealtnames" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/tls.go#L118" rel="nofollow">
|
<a href="/tls.go#L118" rel="nofollow">
|
||||||
NewTLSCertificateAltNames
|
NewTLSCertificateAltNames
|
||||||
@@ -379,6 +462,9 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-torkeys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L135" rel="nofollow">
|
<a href="/onion.go#L135" rel="nofollow">
|
||||||
TorKeys
|
TorKeys
|
||||||
@@ -395,6 +481,9 @@
|
|||||||
returned. If it does not exist, it will be generated.
|
returned. If it does not exist, it will be generated.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#func-torkeystorepath" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/common.go#L67" rel="nofollow">
|
<a href="/common.go#L67" rel="nofollow">
|
||||||
TorKeystorePath
|
TorKeystorePath
|
||||||
@@ -411,9 +500,15 @@
|
|||||||
not exist, it creates it.
|
not exist, it creates it.
|
||||||
</p>
|
</p>
|
||||||
<h2>
|
<h2>
|
||||||
|
<a href="#types" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Types
|
Types
|
||||||
</h2>
|
</h2>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#type-garlic" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
type
|
type
|
||||||
<a href="/garlic.go#L19" rel="nofollow">
|
<a href="/garlic.go#L19" rel="nofollow">
|
||||||
Garlic
|
Garlic
|
||||||
@@ -429,6 +524,9 @@
|
|||||||
has a valid I2PKeys and StreamSession.
|
has a valid I2PKeys and StreamSession.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-newgarlic" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/garlic.go#L140" rel="nofollow">
|
<a href="/garlic.go#L140" rel="nofollow">
|
||||||
NewGarlic
|
NewGarlic
|
||||||
@@ -444,6 +542,9 @@
|
|||||||
I2P streaming.
|
I2P streaming.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-garlic-close" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Garlic)
|
func (*Garlic)
|
||||||
<a href="/garlic.go#L111" rel="nofollow">
|
<a href="/garlic.go#L111" rel="nofollow">
|
||||||
Close
|
Close
|
||||||
@@ -455,9 +556,12 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Close closes the Garlic structure’s sessions and listeners.
|
Close closes the Garlic structure's sessions and listeners.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-garlic-deletekeys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Garlic)
|
func (*Garlic)
|
||||||
<a href="/garlic.go#L134" rel="nofollow">
|
<a href="/garlic.go#L134" rel="nofollow">
|
||||||
DeleteKeys
|
DeleteKeys
|
||||||
@@ -469,6 +573,9 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-garlic-dial" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Garlic)
|
func (*Garlic)
|
||||||
<a href="/garlic.go#L99" rel="nofollow">
|
<a href="/garlic.go#L99" rel="nofollow">
|
||||||
Dial
|
Dial
|
||||||
@@ -480,9 +587,12 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Dial returns a net.Conn for the Garlic structure’s I2P keys.
|
Dial returns a net.Conn for the Garlic structure's I2P keys.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-garlic-keys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Garlic)
|
func (*Garlic)
|
||||||
<a href="/garlic.go#L126" rel="nofollow">
|
<a href="/garlic.go#L126" rel="nofollow">
|
||||||
Keys
|
Keys
|
||||||
@@ -498,6 +608,9 @@
|
|||||||
exist, they are created and stored.
|
exist, they are created and stored.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-garlic-listen" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Garlic)
|
func (*Garlic)
|
||||||
<a href="/garlic.go#L81" rel="nofollow">
|
<a href="/garlic.go#L81" rel="nofollow">
|
||||||
Listen
|
Listen
|
||||||
@@ -509,9 +622,12 @@
|
|||||||
</code>
|
</code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Listen returns a net.Listener for the Garlic structure’s I2P keys.
|
Listen returns a net.Listener for the Garlic structure's I2P keys.
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#type-onion" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
type
|
type
|
||||||
<a href="/onion.go#L24" rel="nofollow">
|
<a href="/onion.go#L24" rel="nofollow">
|
||||||
Onion
|
Onion
|
||||||
@@ -528,6 +644,9 @@
|
|||||||
keys.
|
keys.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-newonion" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func
|
func
|
||||||
<a href="/onion.go#L126" rel="nofollow">
|
<a href="/onion.go#L126" rel="nofollow">
|
||||||
NewOnion
|
NewOnion
|
||||||
@@ -542,6 +661,9 @@
|
|||||||
NewOnion returns a new Onion object.
|
NewOnion returns a new Onion object.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-onion-close" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Onion)
|
func (*Onion)
|
||||||
<a href="/onion.go#L109" rel="nofollow">
|
<a href="/onion.go#L109" rel="nofollow">
|
||||||
Close
|
Close
|
||||||
@@ -556,6 +678,9 @@
|
|||||||
Close closes the Onion Service and all associated resources.
|
Close closes the Onion Service and all associated resources.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-onion-deletekeys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Onion)
|
func (*Onion)
|
||||||
<a href="/onion.go#L121" rel="nofollow">
|
<a href="/onion.go#L121" rel="nofollow">
|
||||||
DeleteKeys
|
DeleteKeys
|
||||||
@@ -572,6 +697,9 @@
|
|||||||
address.
|
address.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-onion-dial" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Onion)
|
func (*Onion)
|
||||||
<a href="/onion.go#L104" rel="nofollow">
|
<a href="/onion.go#L104" rel="nofollow">
|
||||||
Dial
|
Dial
|
||||||
@@ -586,6 +714,9 @@
|
|||||||
Dial returns a net.Conn to the given onion address or clearnet address.
|
Dial returns a net.Conn to the given onion address or clearnet address.
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-onion-keys" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Onion)
|
func (*Onion)
|
||||||
<a href="/onion.go#L114" rel="nofollow">
|
<a href="/onion.go#L114" rel="nofollow">
|
||||||
Keys
|
Keys
|
||||||
@@ -600,6 +731,9 @@
|
|||||||
Keys returns the keys for the Onion
|
Keys returns the keys for the Onion
|
||||||
</p>
|
</p>
|
||||||
<h4>
|
<h4>
|
||||||
|
<a href="#func-onion-listen" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
func (*Onion)
|
func (*Onion)
|
||||||
<a href="/onion.go#L99" rel="nofollow">
|
<a href="/onion.go#L99" rel="nofollow">
|
||||||
Listen
|
Listen
|
||||||
@@ -614,13 +748,22 @@
|
|||||||
ListenOnion returns a net.Listener which will listen on an onion
|
ListenOnion returns a net.Listener which will listen on an onion
|
||||||
address, and will automatically generate a keypair and store it.
|
address, and will automatically generate a keypair and store it.
|
||||||
</p>
|
</p>
|
||||||
<hr/>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
Readme created from Go doc with
|
Readme created from Go doc with
|
||||||
<a href="https://github.com/posener/goreadme" rel="nofollow">
|
<a href="https://github.com/posener/goreadme" rel="nofollow">
|
||||||
goreadme
|
goreadme
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
<div id="sourcecode">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/eyedeekay/onramp.git">
|
||||||
|
Source Code: (https://github.com/eyedeekay/onramp.git)
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="#show">
|
<a href="#show">
|
||||||
Show license
|
Show license
|
||||||
|
351
EXAMPLE.html
351
EXAMPLE.html
@@ -7,6 +7,7 @@
|
|||||||
<meta name="description" content="onramp.git" />
|
<meta name="description" content="onramp.git" />
|
||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -16,6 +17,11 @@
|
|||||||
<div id="shownav">
|
<div id="shownav">
|
||||||
<div id="hidenav">
|
<div id="hidenav">
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="..">
|
||||||
|
Up one level ^
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="index.html">
|
<a href="index.html">
|
||||||
index
|
index
|
||||||
@@ -45,195 +51,232 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h1>
|
<h1>
|
||||||
|
<a href="#example-usage" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Example Usage
|
Example Usage
|
||||||
</h1>
|
</h1>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#usage-as-instance-of-a-struct-listener" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Usage as instance of a struct, Listener
|
Usage as instance of a struct, Listener
|
||||||
</h3>
|
</h3>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"fmt"
|
<span>"fmt"</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
"net/http"
|
<span>"net/http"</span>
|
||||||
|
|
||||||
"github.com/eyedeekay/onramp"
|
<span>"github.com/eyedeekay/onramp"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
garlic := &onramp.Garlic{}
|
<span>garlic</span> <span>:=</span> <span>&</span><span>onramp</span><span>.</span><span>Garlic</span><span>{</span><span>}</span>
|
||||||
defer garlic.Close()
|
<span>defer</span> <span>garlic</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
listener, err := garlic.Listen()
|
<span>listener</span><span>,</span> <span>err</span> <span>:=</span> <span>garlic</span><span>.</span><span>Listen</span><span>(</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer listener.Close()
|
<span>defer</span> <span>listener</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
<span>http</span><span>.</span><span>HandleFunc</span><span>(</span><span>"/"</span><span>,</span> <span>func</span><span>(</span><span>w</span> <span>http</span><span>.</span><span>ResponseWriter</span><span>,</span> <span>r</span> <span>*</span><span>http</span><span>.</span><span>Request</span><span>)</span> <span>{</span>
|
||||||
fmt.Fprintf(w, "Hello, %q", r.URL.Path)
|
<span>fmt</span><span>.</span><span>Fprintf</span><span>(</span><span>w</span><span>,</span> <span>"Hello, %q"</span><span>,</span> <span>r</span><span>.</span><span>URL</span><span>.</span><span>Path</span><span>)</span>
|
||||||
})
|
<span>}</span><span>)</span>
|
||||||
if err := http.Serve(listener, nil); err != nil {
|
<span>if</span> <span>err</span> <span>:=</span> <span>http</span><span>.</span><span>Serve</span><span>(</span><span>listener</span><span>,</span> <span>nil</span><span>)</span><span>;</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
}
|
<span>}</span>
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#usage-as-instance-of-a-struct-dialer" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Usage as instance of a struct, Dialer
|
Usage as instance of a struct, Dialer
|
||||||
</h3>
|
</h3>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"fmt"
|
<span>"fmt"</span>
|
||||||
"io/ioutil"
|
<span>"io/ioutil"</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
"net/http"
|
<span>"net/http"</span>
|
||||||
|
|
||||||
"github.com/eyedeekay/onramp"
|
<span>"github.com/eyedeekay/onramp"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
garlic := &onramp.Garlic{}
|
<span>garlic</span> <span>:=</span> <span>&</span><span>onramp</span><span>.</span><span>Garlic</span><span>{</span><span>}</span>
|
||||||
defer garlic.Close()
|
<span>defer</span> <span>garlic</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
transport := http.Transport{
|
<span>transport</span> <span>:=</span> <span>http</span><span>.</span><span>Transport</span><span>{</span>
|
||||||
Dial: garlic.Dial,
|
<span>Dial</span><span>:</span> <span>garlic</span><span>.</span><span>Dial</span><span>,</span>
|
||||||
}
|
<span>}</span>
|
||||||
client := &http.Client{
|
<span>client</span> <span>:=</span> <span>&</span><span>http</span><span>.</span><span>Client</span><span>{</span>
|
||||||
Transport: &transport,
|
<span>Transport</span><span>:</span> <span>&</span><span>transport</span><span>,</span>
|
||||||
}
|
<span>}</span>
|
||||||
resp, err := client.Get("http://" + listener.Addr().String() + "/")
|
<span>resp</span><span>,</span> <span>err</span> <span>:=</span> <span>client</span><span>.</span><span>Get</span><span>(</span><span>"http://"</span> <span>+</span> <span>listener</span><span>.</span><span>Addr</span><span>(</span><span>)</span><span>.</span><span>String</span><span>(</span><span>)</span> <span>+</span> <span>"/"</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer resp.Body.Close()
|
<span>defer</span> <span>resp</span><span>.</span><span>Body</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
fmt.Println(resp.Status)
|
<span>fmt</span><span>.</span><span>Println</span><span>(</span><span>resp</span><span>.</span><span>Status</span><span>)</span>
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
<span>body</span><span>,</span> <span>err</span> <span>:=</span> <span>ioutil</span><span>.</span><span>ReadAll</span><span>(</span><span>resp</span><span>.</span><span>Body</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
fmt.Println(string(body))
|
<span>fmt</span><span>.</span><span>Println</span><span>(</span><span>string</span><span>(</span><span>body</span><span>)</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
|
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#usage-as-instance-of-a-struct-listener-and-dialer-on-same-address" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Usage as instance of a struct, Listener and Dialer on same address
|
Usage as instance of a struct, Listener and Dialer on same address
|
||||||
</h3>
|
</h3>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"fmt"
|
<span>"fmt"</span>
|
||||||
"io/ioutil"
|
<span>"io/ioutil"</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
"net"
|
<span>"net"</span>
|
||||||
"net/http"
|
<span>"net/http"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
garlic := &Garlic{}
|
<span>garlic</span> <span>:=</span> <span>&</span><span>Garlic</span><span>{</span><span>}</span>
|
||||||
defer garlic.Close()
|
<span>defer</span> <span>garlic</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
listener, err := garlic.Listen()
|
<span>listener</span><span>,</span> <span>err</span> <span>:=</span> <span>garlic</span><span>.</span><span>Listen</span><span>(</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
log.Println("listener:", listener.Addr().String())
|
<span>log</span><span>.</span><span>Println</span><span>(</span><span>"listener:"</span><span>,</span> <span>listener</span><span>.</span><span>Addr</span><span>(</span><span>)</span><span>.</span><span>String</span><span>(</span><span>)</span><span>)</span>
|
||||||
defer listener.Close()
|
<span>defer</span> <span>listener</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
<span>http</span><span>.</span><span>HandleFunc</span><span>(</span><span>"/"</span><span>,</span> <span>func</span><span>(</span><span>w</span> <span>http</span><span>.</span><span>ResponseWriter</span><span>,</span> <span>r</span> <span>*</span><span>http</span><span>.</span><span>Request</span><span>)</span> <span>{</span>
|
||||||
fmt.Fprintf(w, "Hello, %q", r.URL.Path)
|
<span>fmt</span><span>.</span><span>Fprintf</span><span>(</span><span>w</span><span>,</span> <span>"Hello, %q"</span><span>,</span> <span>r</span><span>.</span><span>URL</span><span>.</span><span>Path</span><span>)</span>
|
||||||
})
|
<span>}</span><span>)</span>
|
||||||
go Serve(listener)
|
<span>go</span> <span>Serve</span><span>(</span><span>listener</span><span>)</span>
|
||||||
transport := http.Transport{
|
<span>transport</span> <span>:=</span> <span>http</span><span>.</span><span>Transport</span><span>{</span>
|
||||||
Dial: garlic.Dial,
|
<span>Dial</span><span>:</span> <span>garlic</span><span>.</span><span>Dial</span><span>,</span>
|
||||||
}
|
<span>}</span>
|
||||||
client := &http.Client{
|
<span>client</span> <span>:=</span> <span>&</span><span>http</span><span>.</span><span>Client</span><span>{</span>
|
||||||
Transport: &transport,
|
<span>Transport</span><span>:</span> <span>&</span><span>transport</span><span>,</span>
|
||||||
}
|
<span>}</span>
|
||||||
resp, err := client.Get("http://" + listener.Addr().String() + "/")
|
<span>resp</span><span>,</span> <span>err</span> <span>:=</span> <span>client</span><span>.</span><span>Get</span><span>(</span><span>"http://"</span> <span>+</span> <span>listener</span><span>.</span><span>Addr</span><span>(</span><span>)</span><span>.</span><span>String</span><span>(</span><span>)</span> <span>+</span> <span>"/"</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer resp.Body.Close()
|
<span>defer</span> <span>resp</span><span>.</span><span>Body</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
fmt.Println(resp.Status)
|
<span>fmt</span><span>.</span><span>Println</span><span>(</span><span>resp</span><span>.</span><span>Status</span><span>)</span>
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
<span>body</span><span>,</span> <span>err</span> <span>:=</span> <span>ioutil</span><span>.</span><span>ReadAll</span><span>(</span><span>resp</span><span>.</span><span>Body</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
fmt.Println(string(body))
|
<span>fmt</span><span>.</span><span>Println</span><span>(</span><span>string</span><span>(</span><span>body</span><span>)</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
|
|
||||||
func Serve(listener net.Listener) {
|
<span>func</span> <span>Serve</span><span>(</span><span>listener</span> <span>net</span><span>.</span><span>Listener</span><span>)</span> <span>{</span>
|
||||||
if err := http.Serve(listener, nil); err != nil {
|
<span>if</span> <span>err</span> <span>:=</span> <span>http</span><span>.</span><span>Serve</span><span>(</span><span>listener</span><span>,</span> <span>nil</span><span>)</span><span>;</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
}
|
<span>}</span>
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#usage-as-automatically-managed-listeners" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Usage as automatically-managed Listeners
|
Usage as automatically-managed Listeners
|
||||||
</h3>
|
</h3>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"fmt"
|
<span>"fmt"</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
"net/http"
|
<span>"net/http"</span>
|
||||||
|
|
||||||
"github.com/eyedeekay/onramp"
|
<span>"github.com/eyedeekay/onramp"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
defer onramp.CloseAll()
|
<span>defer</span> <span>onramp</span><span>.</span><span>CloseAll</span><span>(</span><span>)</span>
|
||||||
listener, err := onramp.Listen("tcp", "service.i2p")
|
<span>listener</span><span>,</span> <span>err</span> <span>:=</span> <span>onramp</span><span>.</span><span>Listen</span><span>(</span><span>"tcp"</span><span>,</span> <span>"service.i2p"</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer listener.Close()
|
<span>defer</span> <span>listener</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
<span>http</span><span>.</span><span>HandleFunc</span><span>(</span><span>"/"</span><span>,</span> <span>func</span><span>(</span><span>w</span> <span>http</span><span>.</span><span>ResponseWriter</span><span>,</span> <span>r</span> <span>*</span><span>http</span><span>.</span><span>Request</span><span>)</span> <span>{</span>
|
||||||
fmt.Fprintf(w, "Hello, %q", r.URL.Path)
|
<span>fmt</span><span>.</span><span>Fprintf</span><span>(</span><span>w</span><span>,</span> <span>"Hello, %q"</span><span>,</span> <span>r</span><span>.</span><span>URL</span><span>.</span><span>Path</span><span>)</span>
|
||||||
})
|
<span>}</span><span>)</span>
|
||||||
if err := http.Serve(listener, nil); err != nil {
|
<span>if</span> <span>err</span> <span>:=</span> <span>http</span><span>.</span><span>Serve</span><span>(</span><span>listener</span><span>,</span> <span>nil</span><span>)</span><span>;</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
}
|
<span>}</span>
|
||||||
|
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#usage-as-automatically-managed-dialers" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Usage as automatically-managed Dialers
|
Usage as automatically-managed Dialers
|
||||||
</h3>
|
</h3>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"fmt"
|
<span>"fmt"</span>
|
||||||
"io/ioutil"
|
<span>"io/ioutil"</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
"net/http"
|
<span>"net/http"</span>
|
||||||
|
|
||||||
"github.com/eyedeekay/onramp"
|
<span>"github.com/eyedeekay/onramp"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
defer onramp.CloseAll()
|
<span>defer</span> <span>onramp</span><span>.</span><span>CloseAll</span><span>(</span><span>)</span>
|
||||||
transport := http.Transport{
|
<span>transport</span> <span>:=</span> <span>http</span><span>.</span><span>Transport</span><span>{</span>
|
||||||
Dial: onramp.Dial,
|
<span>Dial</span><span>:</span> <span>onramp</span><span>.</span><span>Dial</span><span>,</span>
|
||||||
}
|
<span>}</span>
|
||||||
client := &http.Client{
|
<span>client</span> <span>:=</span> <span>&</span><span>http</span><span>.</span><span>Client</span><span>{</span>
|
||||||
Transport: &transport,
|
<span>Transport</span><span>:</span> <span>&</span><span>transport</span><span>,</span>
|
||||||
}
|
<span>}</span>
|
||||||
resp, err := client.Get("http://" + listener.Addr().String() + "/")
|
<span>resp</span><span>,</span> <span>err</span> <span>:=</span> <span>client</span><span>.</span><span>Get</span><span>(</span><span>"http://"</span> <span>+</span> <span>listener</span><span>.</span><span>Addr</span><span>(</span><span>)</span><span>.</span><span>String</span><span>(</span><span>)</span> <span>+</span> <span>"/"</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer resp.Body.Close()
|
<span>defer</span> <span>resp</span><span>.</span><span>Body</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
fmt.Println(resp.Status)
|
<span>fmt</span><span>.</span><span>Println</span><span>(</span><span>resp</span><span>.</span><span>Status</span><span>)</span>
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
<span>body</span><span>,</span> <span>err</span> <span>:=</span> <span>ioutil</span><span>.</span><span>ReadAll</span><span>(</span><span>resp</span><span>.</span><span>Body</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
fmt.Println(string(body))
|
<span>fmt</span><span>.</span><span>Println</span><span>(</span><span>string</span><span>(</span><span>body</span><span>)</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
|
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div id="sourcecode">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/eyedeekay/onramp.git">
|
||||||
|
Source Code: (https://github.com/eyedeekay/onramp.git)
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="#show">
|
<a href="#show">
|
||||||
Show license
|
Show license
|
||||||
|
27
Makefile
Normal file
27
Makefile
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
USER_GH=eyedeekay
|
||||||
|
VERSION=0.33.7
|
||||||
|
packagename=onramp
|
||||||
|
|
||||||
|
echo: fmt
|
||||||
|
@echo "type make version to do release $(VERSION)"
|
||||||
|
|
||||||
|
version:
|
||||||
|
github-release release -s $(GITHUB_TOKEN) -u $(USER_GH) -r $(packagename) -t v$(VERSION) -d "version $(VERSION)"
|
||||||
|
|
||||||
|
del:
|
||||||
|
github-release delete -s $(GITHUB_TOKEN) -u $(USER_GH) -r $(packagename) -t v$(VERSION)
|
||||||
|
|
||||||
|
tar:
|
||||||
|
tar --exclude .git \
|
||||||
|
--exclude .go \
|
||||||
|
--exclude bin \
|
||||||
|
--exclude examples \
|
||||||
|
-cJvf ../$(packagename)_$(VERSION).orig.tar.xz .
|
||||||
|
|
||||||
|
link:
|
||||||
|
rm -f ../goSam
|
||||||
|
ln -sf . ../goSam
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
find . -name '*.go' -exec gofmt -w -s {} \;
|
@@ -16,6 +16,8 @@ function. For more information, check out the [godoc](http://pkg.go.dev/github.c
|
|||||||
|
|
||||||
- **[Source Code](https://github.com/eyedeekay/onramp)**
|
- **[Source Code](https://github.com/eyedeekay/onramp)**
|
||||||
|
|
||||||
|
STATUS: This project is maintained. I will respond to issues, pull requests, and feature requests within a few days.
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
185
garlic.go
185
garlic.go
@@ -4,12 +4,14 @@
|
|||||||
package onramp
|
package onramp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/eyedeekay/i2pkeys"
|
"github.com/eyedeekay/i2pkeys"
|
||||||
"github.com/eyedeekay/sam3"
|
"github.com/eyedeekay/sam3"
|
||||||
@@ -20,18 +22,65 @@ import (
|
|||||||
type Garlic struct {
|
type Garlic struct {
|
||||||
*sam3.StreamListener
|
*sam3.StreamListener
|
||||||
*sam3.StreamSession
|
*sam3.StreamSession
|
||||||
i2pkeys.I2PKeys
|
*sam3.DatagramSession
|
||||||
|
ServiceKeys *i2pkeys.I2PKeys
|
||||||
*sam3.SAM
|
*sam3.SAM
|
||||||
name string
|
name string
|
||||||
addr string
|
addr string
|
||||||
opts []string
|
opts []string
|
||||||
|
AddrMode int
|
||||||
|
TorrentMode bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var OPT_DEFAULTS = sam3.Options_Default
|
const (
|
||||||
|
DEST_BASE32 = 0
|
||||||
|
DEST_HASH = 1
|
||||||
|
DEST_HASH_BYTES = 2
|
||||||
|
DEST_BASE32_TRUNCATED = 3
|
||||||
|
DEST_BASE64 = 4
|
||||||
|
DEST_BASE64_BYTES = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
func (g *Garlic) Network() string {
|
||||||
|
if g.StreamListener != nil {
|
||||||
|
return "tcp"
|
||||||
|
} else {
|
||||||
|
return "udp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Garlic) addrString(addr string) string {
|
||||||
|
if g.TorrentMode {
|
||||||
|
return addr + ".i2p"
|
||||||
|
}
|
||||||
|
return addr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Garlic) String() string {
|
||||||
|
var r string
|
||||||
|
switch g.AddrMode {
|
||||||
|
case DEST_HASH:
|
||||||
|
r = g.ServiceKeys.Address.DestHash().Hash()
|
||||||
|
case DEST_HASH_BYTES:
|
||||||
|
hash := g.ServiceKeys.Address.DestHash()
|
||||||
|
r = string(hash[:])
|
||||||
|
case DEST_BASE32_TRUNCATED:
|
||||||
|
r = strings.TrimSuffix(g.ServiceKeys.Address.Base32(), ".b32.i2p")
|
||||||
|
case DEST_BASE32:
|
||||||
|
r = g.ServiceKeys.Address.Base32()
|
||||||
|
case DEST_BASE64:
|
||||||
|
r = g.ServiceKeys.Address.Base64()
|
||||||
|
case DEST_BASE64_BYTES:
|
||||||
|
r = string(g.ServiceKeys.Address.Bytes())
|
||||||
|
default:
|
||||||
|
r = g.ServiceKeys.Address.DestHash().Hash()
|
||||||
|
}
|
||||||
|
return g.addrString(r) //r //strings.TrimLeft(strings.TrimRight(r, "\n"), "\n") //strings.TrimSpace(r)
|
||||||
|
}
|
||||||
|
|
||||||
func (g *Garlic) getName() string {
|
func (g *Garlic) getName() string {
|
||||||
if g.name == "" {
|
if g.name == "" {
|
||||||
return "onramp"
|
return "onramp-garlic"
|
||||||
}
|
}
|
||||||
return g.name
|
return g.name
|
||||||
}
|
}
|
||||||
@@ -61,15 +110,15 @@ func (g *Garlic) samSession() (*sam3.SAM, error) {
|
|||||||
return g.SAM, nil
|
return g.SAM, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Garlic) setupStreamSession() (*sam3.StreamSession, error) {
|
func (g *Garlic) setupStreamSession() (*sam3.StreamSession, error) {
|
||||||
if g.StreamSession == nil {
|
if g.StreamSession == nil {
|
||||||
var err error
|
var err error
|
||||||
g.I2PKeys, err = g.Keys()
|
g.ServiceKeys, err = g.Keys()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("onramp setupStreamSession: %v", err)
|
return nil, fmt.Errorf("onramp setupStreamSession: %v", err)
|
||||||
}
|
}
|
||||||
log.Println("Creating stream session with keys:", g.I2PKeys.Address.Base32())
|
log.Println("Creating stream session with keys:", g.ServiceKeys.Address.Base32())
|
||||||
g.StreamSession, err = g.SAM.NewStreamSession(g.getName(), g.I2PKeys, g.getOptions())
|
g.StreamSession, err = g.SAM.NewStreamSession(g.getName(), *g.ServiceKeys, g.getOptions())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("onramp setupStreamSession: %v", err)
|
return nil, fmt.Errorf("onramp setupStreamSession: %v", err)
|
||||||
}
|
}
|
||||||
@@ -78,8 +127,55 @@ func (g Garlic) setupStreamSession() (*sam3.StreamSession, error) {
|
|||||||
return g.StreamSession, nil
|
return g.StreamSession, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *Garlic) setupDatagramSession() (*sam3.DatagramSession, error) {
|
||||||
|
if g.DatagramSession == nil {
|
||||||
|
var err error
|
||||||
|
g.ServiceKeys, err = g.Keys()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("onramp setupDatagramSession: %v", err)
|
||||||
|
}
|
||||||
|
log.Println("Creating datagram session with keys:", g.ServiceKeys.Address.Base32())
|
||||||
|
g.DatagramSession, err = g.SAM.NewDatagramSession(g.getName(), *g.ServiceKeys, g.getOptions(), 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("onramp setupDatagramSession: %v", err)
|
||||||
|
}
|
||||||
|
return g.DatagramSession, nil
|
||||||
|
}
|
||||||
|
return g.DatagramSession, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewListener returns a net.Listener for the Garlic structure's I2P keys.
|
||||||
|
// accepts a variable list of arguments, arguments after the first one are ignored.
|
||||||
|
func (g *Garlic) NewListener(n, addr string) (net.Listener, error) {
|
||||||
|
return g.Listen(n)
|
||||||
|
}
|
||||||
|
|
||||||
// Listen returns a net.Listener for the Garlic structure's I2P keys.
|
// Listen returns a net.Listener for the Garlic structure's I2P keys.
|
||||||
func (g *Garlic) Listen() (net.Listener, error) {
|
// accepts a variable list of arguments, arguments after the first one are ignored.
|
||||||
|
func (g *Garlic) Listen(args ...string) (net.Listener, error) {
|
||||||
|
return g.OldListen(args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OldListen returns a net.Listener for the Garlic structure's I2P keys.
|
||||||
|
// accepts a variable list of arguments, arguments after the first one are ignored.
|
||||||
|
func (g *Garlic) OldListen(args ...string) (net.Listener, error) {
|
||||||
|
if len(args) > 0 {
|
||||||
|
if args[0] == "tcp" || args[0] == "tcp6" || args[0] == "st" || args[0] == "st6" {
|
||||||
|
return g.ListenStream()
|
||||||
|
} else if args[0] == "udp" || args[0] == "udp6" || args[0] == "dg" || args[0] == "dg6" {
|
||||||
|
pk, err := g.ListenPacket()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return pk.(*sam3.DatagramSession), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return g.ListenStream()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen returns a net.Listener for the Garlic structure's I2P keys.
|
||||||
|
func (g *Garlic) ListenStream() (net.Listener, error) {
|
||||||
var err error
|
var err error
|
||||||
if g.SAM, err = g.samSession(); err != nil {
|
if g.SAM, err = g.samSession(); err != nil {
|
||||||
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
||||||
@@ -96,27 +192,50 @@ func (g *Garlic) Listen() (net.Listener, error) {
|
|||||||
return g.StreamListener, nil
|
return g.StreamListener, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenTLS returns a net.Listener for the Garlic structure's I2P keys,
|
// ListenPacket returns a net.PacketConn for the Garlic structure's I2P keys.
|
||||||
// which also uses TLS either for additional encryption, authentication,
|
func (g *Garlic) ListenPacket() (net.PacketConn, error) {
|
||||||
// or browser-compatibility.
|
|
||||||
func (g *Garlic) ListenTLS() (net.Listener, error) {
|
|
||||||
var err error
|
var err error
|
||||||
if g.SAM, err = g.samSession(); err != nil {
|
if g.SAM, err = g.samSession(); err != nil {
|
||||||
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
||||||
}
|
}
|
||||||
if g.StreamSession, err = g.setupStreamSession(); err != nil {
|
if g.DatagramSession, err = g.setupDatagramSession(); err != nil {
|
||||||
return nil, fmt.Errorf("onramp Listen: %v", err)
|
return nil, fmt.Errorf("onramp Listen: %v", err)
|
||||||
}
|
}
|
||||||
if g.StreamListener == nil {
|
return g.DatagramSession, nil
|
||||||
g.StreamListener, err = g.StreamSession.Listen()
|
}
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("onramp Listen: %v", err)
|
// ListenTLS returns a net.Listener for the Garlic structure's I2P keys,
|
||||||
}
|
// which also uses TLS either for additional encryption, authentication,
|
||||||
|
// or browser-compatibility.
|
||||||
|
func (g *Garlic) ListenTLS(args ...string) (net.Listener, error) {
|
||||||
|
listener, err := g.Listen(args...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
cert, err := g.TLSKeys()
|
cert, err := g.TLSKeys()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("onramp ListenTLS: %v", err)
|
return nil, fmt.Errorf("onramp ListenTLS: %v", err)
|
||||||
}
|
}
|
||||||
|
if len(args) > 0 {
|
||||||
|
if args[0] == "tcp" || args[0] == "tcp6" || args[0] == "st" || args[0] == "st6" {
|
||||||
|
return tls.NewListener(
|
||||||
|
g.StreamListener,
|
||||||
|
&tls.Config{
|
||||||
|
Certificates: []tls.Certificate{cert},
|
||||||
|
},
|
||||||
|
), nil
|
||||||
|
} else if args[0] == "udp" || args[0] == "udp6" || args[0] == "dg" || args[0] == "dg6" {
|
||||||
|
return tls.NewListener(
|
||||||
|
g.DatagramSession,
|
||||||
|
&tls.Config{
|
||||||
|
Certificates: []tls.Certificate{cert},
|
||||||
|
},
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
g.StreamListener = listener.(*sam3.StreamListener)
|
||||||
|
}
|
||||||
return tls.NewListener(
|
return tls.NewListener(
|
||||||
g.StreamListener,
|
g.StreamListener,
|
||||||
&tls.Config{
|
&tls.Config{
|
||||||
@@ -127,6 +246,9 @@ func (g *Garlic) ListenTLS() (net.Listener, error) {
|
|||||||
|
|
||||||
// Dial returns a net.Conn for the Garlic structure's I2P keys.
|
// Dial returns a net.Conn for the Garlic structure's I2P keys.
|
||||||
func (g *Garlic) Dial(net, addr string) (net.Conn, error) {
|
func (g *Garlic) Dial(net, addr string) (net.Conn, error) {
|
||||||
|
if !strings.Contains(addr, ".i2p") {
|
||||||
|
return &NullConn{}, nil
|
||||||
|
}
|
||||||
var err error
|
var err error
|
||||||
if g.SAM, err = g.samSession(); err != nil {
|
if g.SAM, err = g.samSession(); err != nil {
|
||||||
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
||||||
@@ -137,6 +259,21 @@ func (g *Garlic) Dial(net, addr string) (net.Conn, error) {
|
|||||||
return g.StreamSession.Dial(net, addr)
|
return g.StreamSession.Dial(net, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DialContext returns a net.Conn for the Garlic structure's I2P keys.
|
||||||
|
func (g *Garlic) DialContext(ctx context.Context, net, addr string) (net.Conn, error) {
|
||||||
|
if !strings.Contains(addr, ".i2p") {
|
||||||
|
return &NullConn{}, nil
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
if g.SAM, err = g.samSession(); err != nil {
|
||||||
|
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
|
||||||
|
}
|
||||||
|
if g.StreamSession, err = g.setupStreamSession(); err != nil {
|
||||||
|
return nil, fmt.Errorf("onramp Dial: %v", err)
|
||||||
|
}
|
||||||
|
return g.StreamSession.DialContext(ctx, net, addr)
|
||||||
|
}
|
||||||
|
|
||||||
// Close closes the Garlic structure's sessions and listeners.
|
// Close closes the Garlic structure's sessions and listeners.
|
||||||
func (g *Garlic) Close() error {
|
func (g *Garlic) Close() error {
|
||||||
e1 := g.StreamSession.Close()
|
e1 := g.StreamSession.Close()
|
||||||
@@ -153,12 +290,12 @@ func (g *Garlic) Close() error {
|
|||||||
|
|
||||||
// Keys returns the I2PKeys for the Garlic structure. If none
|
// Keys returns the I2PKeys for the Garlic structure. If none
|
||||||
// exist, they are created and stored.
|
// exist, they are created and stored.
|
||||||
func (g *Garlic) Keys() (i2pkeys.I2PKeys, error) {
|
func (g *Garlic) Keys() (*i2pkeys.I2PKeys, error) {
|
||||||
keys, err := I2PKeys(g.getName(), g.getAddr())
|
keys, err := I2PKeys(g.getName(), g.getAddr())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return i2pkeys.I2PKeys{}, fmt.Errorf("onramp Keys: %v", err)
|
return &i2pkeys.I2PKeys{}, fmt.Errorf("onramp Keys: %v", err)
|
||||||
}
|
}
|
||||||
return keys, nil
|
return &keys, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Garlic) DeleteKeys() error {
|
func (g *Garlic) DeleteKeys() error {
|
||||||
|
11
garlic_config.go
Normal file
11
garlic_config.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package onramp
|
||||||
|
|
||||||
|
import "github.com/eyedeekay/sam3"
|
||||||
|
|
||||||
|
var OPT_DEFAULTS = sam3.Options_Default
|
||||||
|
var OPT_WIDE = sam3.Options_Wide
|
||||||
|
|
||||||
|
var OPT_HUGE = sam3.Options_Humongous
|
||||||
|
var OPT_LARGE = sam3.Options_Large
|
||||||
|
var OPT_MEDIUM = sam3.Options_Medium
|
||||||
|
var OPT_SMALL = sam3.Options_Small
|
11
go.mod
11
go.mod
@@ -4,12 +4,13 @@ go 1.18
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cretz/bine v0.2.0
|
github.com/cretz/bine v0.2.0
|
||||||
github.com/eyedeekay/i2pkeys v0.0.0-20220804220722-1048b5ce6ba7
|
github.com/eyedeekay/i2pkeys v0.33.7
|
||||||
github.com/eyedeekay/sam3 v0.33.3
|
github.com/eyedeekay/sam3 v0.33.7
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
|
github.com/stretchr/testify v1.8.4 // indirect
|
||||||
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48 // indirect
|
golang.org/x/crypto v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 // indirect
|
golang.org/x/net v0.12.0 // indirect
|
||||||
|
golang.org/x/sys v0.10.0 // indirect
|
||||||
)
|
)
|
||||||
|
85
go.sum
85
go.sum
@@ -1,89 +1,32 @@
|
|||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
|
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
|
||||||
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/eyedeekay/goSam v0.32.31-0.20210122211817-f97683379f23/go.mod h1:UgJnih/LpotwKriwVPOEa6yPDM2NDdVrKfLtS5DOLPE=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/eyedeekay/i2pkeys v0.0.0-20220310052025-204d4ae6dcae/go.mod h1:W9KCm9lqZ+Ozwl3dwcgnpPXAML97+I8Jiht7o5A8YBM=
|
github.com/eyedeekay/i2pkeys v0.33.7 h1:cxqHSkl6b2lHyPJUtIQZBiipYf7NQVYqM1d3ub0MI4k=
|
||||||
github.com/eyedeekay/i2pkeys v0.0.0-20220803204630-910de44ac829 h1:uXKTvYvSGuzAHzmT0YgPu3XZjZOlH1lLwrgWkymz934=
|
github.com/eyedeekay/i2pkeys v0.33.7/go.mod h1:W9KCm9lqZ+Ozwl3dwcgnpPXAML97+I8Jiht7o5A8YBM=
|
||||||
github.com/eyedeekay/i2pkeys v0.0.0-20220803204630-910de44ac829/go.mod h1:W9KCm9lqZ+Ozwl3dwcgnpPXAML97+I8Jiht7o5A8YBM=
|
github.com/eyedeekay/sam3 v0.33.7 h1:GPYHG4NHxvhqPbGNJ3wKvUQyZSTCmX17f5L5QvyefGs=
|
||||||
github.com/eyedeekay/i2pkeys v0.0.0-20220804220722-1048b5ce6ba7 h1:or9gYJ9VQN8YGoC0yKRC5lAWna2TaDMGZH/JFhwoJ4Q=
|
github.com/eyedeekay/sam3 v0.33.7/go.mod h1:25cRGEFawSkbiPNSh7vTUIpRtEYLVLg/4J4He6LndAY=
|
||||||
github.com/eyedeekay/i2pkeys v0.0.0-20220804220722-1048b5ce6ba7/go.mod h1:W9KCm9lqZ+Ozwl3dwcgnpPXAML97+I8Jiht7o5A8YBM=
|
|
||||||
github.com/eyedeekay/sam3 v0.32.32/go.mod h1:qRA9KIIVxbrHlkj+ZB+OoxFGFgdKeGp1vSgPw26eOVU=
|
|
||||||
github.com/eyedeekay/sam3 v0.33.3 h1:VeN4nYWWeGfnnnHIPg0fjk+Kt2DI+6RSYcJrb2M7C4c=
|
|
||||||
github.com/eyedeekay/sam3 v0.33.3/go.mod h1:sPtlI4cRm7wD0UywOzLPvvdY1G++vBSK3n+jiIGqWlU=
|
|
||||||
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY=
|
|
||||||
github.com/getlantern/errors v1.0.1/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A=
|
|
||||||
github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5/go.mod h1:kGHRXch95rnGLHjER/GhhFiHvfnqNz7KqWD9kGfATHY=
|
|
||||||
github.com/getlantern/golog v0.0.0-20201105130739-9586b8bde3a9/go.mod h1:ZyIjgH/1wTCl+B+7yH1DqrWp6MPJqESmwmEQ89ZfhvA=
|
|
||||||
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o=
|
|
||||||
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA=
|
|
||||||
github.com/getlantern/netx v0.0.0-20190110220209-9912de6f94fd/go.mod h1:wKdY0ikOgzrWSeB9UyBVKPRhjXQ+vTb+BPeJuypUuNE=
|
|
||||||
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
|
|
||||||
github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
|
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
|
||||||
github.com/google/renameio v1.0.0/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/riobard/go-x25519 v0.0.0-20190716001027-10cc4d8d0b33/go.mod h1:BjmVxzAnkLeoEbqHEerI4eSw6ua+RaIB0S4jMV21RAs=
|
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
|
||||||
github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=
|
|
||||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
|
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
|
|
||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48 h1:N9Vc/rorQUDes6B9CNdIxAn5jODGj2wzfrei2x4wNj4=
|
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
|
||||||
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 h1:9vYwv7OjYaky/tlAeD7C4oC9EsPTlaFl1H2jS++V+ME=
|
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||||
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
|
||||||
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
110
index.html
110
index.html
@@ -7,6 +7,7 @@
|
|||||||
<meta name="description" content="onramp.git" />
|
<meta name="description" content="onramp.git" />
|
||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -16,6 +17,11 @@
|
|||||||
<div id="shownav">
|
<div id="shownav">
|
||||||
<div id="hidenav">
|
<div id="hidenav">
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="..">
|
||||||
|
Up one level ^
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="index.html">
|
<a href="index.html">
|
||||||
index
|
index
|
||||||
@@ -45,22 +51,23 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h1>
|
<h1>
|
||||||
<a href="/">
|
<a href="#onramp" rel="nofollow">
|
||||||
onramp
|
<span></span>
|
||||||
</a>
|
</a>
|
||||||
|
onramp
|
||||||
</h1>
|
</h1>
|
||||||
<p>
|
<p>
|
||||||
High-level, easy-to-use listeners and clients for I2P and onion URL’s from Go.
|
High-level, easy-to-use listeners and clients for I2P and onion URL's from Go.
|
||||||
Provides only the most widely-used functions in a basic way. It expects nothing
|
Provides only the most widely-used functions in a basic way. It expects nothing
|
||||||
from the users, an otherwise empty instance of the structs will listen and dial
|
from the users, an otherwise empty instance of the structs will listen and dial
|
||||||
I2P Streaming and Tor TCP sessions successfully.
|
I2P Streaming and Tor TCP sessions successfully.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
In all cases, it assumes that keys are “persistent” in that they are managed
|
In all cases, it assumes that keys are "persistent" in that they are managed
|
||||||
maintained between usages of the same application in the same configuration.
|
maintained between usages of the same application in the same configuration.
|
||||||
This means that hidden services will maintain their identities, and that clients
|
This means that hidden services will maintain their identities, and that clients
|
||||||
will always have the same return addresses. If you don’t want this behavior,
|
will always have the same return addresses. If you don't want this behavior,
|
||||||
make sure to delete the “keystore” when your app closes or when your application
|
make sure to delete the "keystore" when your app closes or when your application
|
||||||
needs to cycle keys by calling the
|
needs to cycle keys by calling the
|
||||||
<code>
|
<code>
|
||||||
Garlic.DeleteKeys()
|
Garlic.DeleteKeys()
|
||||||
@@ -84,12 +91,18 @@
|
|||||||
</strong>
|
</strong>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p>
|
||||||
|
STATUS: This project is maintained. I will respond to issues, pull requests, and feature requests within a few days.
|
||||||
|
</p>
|
||||||
<h2>
|
<h2>
|
||||||
|
<a href="#usage" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Usage
|
Usage
|
||||||
</h2>
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
Basic usage is designed to be very simple, import the package and instantiate
|
Basic usage is designed to be very simple, import the package and instantiate
|
||||||
a struct and you’re ready to go.
|
a struct and you're ready to go.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
For more extensive examples, see:
|
For more extensive examples, see:
|
||||||
@@ -98,6 +111,9 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#i2p-garlic-usage" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
I2P(Garlic) Usage:
|
I2P(Garlic) Usage:
|
||||||
</h3>
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
@@ -107,26 +123,31 @@
|
|||||||
</code>
|
</code>
|
||||||
struct.
|
struct.
|
||||||
</p>
|
</p>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
|
|
||||||
"github.com/eyedeekay/onramp"
|
<span>"github.com/eyedeekay/onramp"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
garlic := &onramp.Garlic{}
|
<span>garlic</span> <span>:=</span> <span>&</span><span>onramp</span><span>.</span><span>Garlic</span><span>{</span><span>}</span>
|
||||||
defer garlic.Close()
|
<span>defer</span> <span>garlic</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
listener, err := garlic.Listen()
|
<span>listener</span><span>,</span> <span>err</span> <span>:=</span> <span>garlic</span><span>.</span><span>Listen</span><span>(</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer listener.Close()
|
<span>defer</span> <span>listener</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
<h3>
|
<h3>
|
||||||
|
<a href="#tor-onion-usage" rel="nofollow">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
Tor(Onion) Usage:
|
Tor(Onion) Usage:
|
||||||
</h3>
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
@@ -136,25 +157,36 @@ func main() {
|
|||||||
</code>
|
</code>
|
||||||
struct.
|
struct.
|
||||||
</p>
|
</p>
|
||||||
<pre><code>
|
<div>
|
||||||
package main
|
<pre>
|
||||||
|
<span>package</span> <span>main</span>
|
||||||
|
|
||||||
import (
|
<span>import</span> <span>(</span>
|
||||||
"log"
|
<span>"log"</span>
|
||||||
|
|
||||||
"github.com/eyedeekay/onramp"
|
<span>"github.com/eyedeekay/onramp"</span>
|
||||||
)
|
<span>)</span>
|
||||||
|
|
||||||
func main() {
|
<span>func</span> <span>main</span><span>(</span><span>)</span> <span>{</span>
|
||||||
onion := &onramp.Onion{}
|
<span>onion</span> <span>:=</span> <span>&</span><span>onramp</span><span>.</span><span>Onion</span><span>{</span><span>}</span>
|
||||||
defer garlic.Close()
|
<span>defer</span> <span>garlic</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
listener, err := onion.Listen()
|
<span>listener</span><span>,</span> <span>err</span> <span>:=</span> <span>onion</span><span>.</span><span>Listen</span><span>(</span><span>)</span>
|
||||||
if err != nil {
|
<span>if</span> <span>err</span> <span>!=</span> <span>nil</span> <span>{</span>
|
||||||
log.Fatal(err)
|
<span>log</span><span>.</span><span>Fatal</span><span>(</span><span>err</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
defer listener.Close()
|
<span>defer</span> <span>listener</span><span>.</span><span>Close</span><span>(</span><span>)</span>
|
||||||
}
|
<span>}</span>
|
||||||
</code></pre>
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div id="sourcecode">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/eyedeekay/onramp.git">
|
||||||
|
Source Code: (https://github.com/eyedeekay/onramp.git)
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="#show">
|
<a href="#show">
|
||||||
Show license
|
Show license
|
||||||
|
44
nullconn.go
Normal file
44
nullconn.go
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package onramp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NullConn struct {
|
||||||
|
net.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nc *NullConn) Read(b []byte) (n int, err error) {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nc *NullConn) Write(b []byte) (n int, err error) {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nc *NullConn) Close() error { return nil }
|
||||||
|
|
||||||
|
func (nc *NullConn) LocalAddr() net.Addr {
|
||||||
|
if nc.Conn != nil {
|
||||||
|
return nc.Conn.LocalAddr()
|
||||||
|
}
|
||||||
|
return &net.IPAddr{
|
||||||
|
IP: net.ParseIP("127.0.0.1"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nc *NullConn) RemoteAddr() net.Addr {
|
||||||
|
if nc.Conn != nil {
|
||||||
|
return nc.Conn.RemoteAddr()
|
||||||
|
}
|
||||||
|
return &net.IPAddr{
|
||||||
|
IP: net.ParseIP("127.0.0.1"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nc *NullConn) SetDeadline(t time.Time) error { return nil }
|
||||||
|
|
||||||
|
func (nc *NullConn) SetReadDeadline(t time.Time) error { return nil }
|
||||||
|
|
||||||
|
func (nc *NullConn) SetWriteDeadline(t time.Time) error { return nil }
|
26
onion.go
26
onion.go
@@ -90,18 +90,36 @@ func (o *Onion) getDialer() *tor.Dialer {
|
|||||||
|
|
||||||
func (o *Onion) getName() string {
|
func (o *Onion) getName() string {
|
||||||
if o.name == "" {
|
if o.name == "" {
|
||||||
o.name = "onramp"
|
o.name = "onramp-onion"
|
||||||
}
|
}
|
||||||
return o.name
|
return o.name
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenOnion returns a net.Listener which will listen on an onion
|
// NewListener returns a net.Listener which will listen on an onion
|
||||||
// address, and will automatically generate a keypair and store it.
|
// address, and will automatically generate a keypair and store it.
|
||||||
func (o *Onion) Listen() (net.Listener, error) {
|
// the args are always ignored
|
||||||
|
func (o *Onion) NewListener(n, addr string) (net.Listener, error) {
|
||||||
|
return o.Listen(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen returns a net.Listener which will listen on an onion
|
||||||
|
// address, and will automatically generate a keypair and store it.
|
||||||
|
// the args are always ignored
|
||||||
|
func (o *Onion) Listen(args ...string) (net.Listener, error) {
|
||||||
|
return o.OldListen(args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OldListen returns a net.Listener which will listen on an onion
|
||||||
|
// address, and will automatically generate a keypair and store it.
|
||||||
|
// the args are always ignored
|
||||||
|
func (o *Onion) OldListen(args ...string) (net.Listener, error) {
|
||||||
return o.getTor().Listen(o.getContext(), o.getListenConf())
|
return o.getTor().Listen(o.getContext(), o.getListenConf())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Onion) ListenTLS() (net.Listener, error) {
|
// ListenTLS returns a net.Listener which will apply TLS encryption
|
||||||
|
// to the onion listener, which will not be decrypted until it reaches
|
||||||
|
// the browser
|
||||||
|
func (o *Onion) ListenTLS(args ...string) (net.Listener, error) {
|
||||||
cert, err := o.TLSKeys()
|
cert, err := o.TLSKeys()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("onramp ListenTLS: %v", err)
|
return nil, fmt.Errorf("onramp ListenTLS: %v", err)
|
||||||
|
56
proxy.go
Normal file
56
proxy.go
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package onramp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OnrampProxy struct {
|
||||||
|
Onion
|
||||||
|
Garlic
|
||||||
|
}
|
||||||
|
|
||||||
|
// Proxy passes requests from a net.Listener to a remote server
|
||||||
|
// without touching them in any way. It can be used as a shortcut,
|
||||||
|
// set up a Garlic or Onion Listener and pass it, along with the
|
||||||
|
// address of a locally running service and the hidden service
|
||||||
|
// listener will expose the local service.
|
||||||
|
// Pass it a regular net.Listener(or a TLS listener if you like),
|
||||||
|
// and an I2P or Onion address, and it will act as a tunnel to a
|
||||||
|
// listening hidden service somewhere.
|
||||||
|
func (p *OnrampProxy) Proxy(list net.Listener, raddr string) error {
|
||||||
|
for {
|
||||||
|
conn, err := list.Accept()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
go p.proxy(conn, raddr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *OnrampProxy) proxy(conn net.Conn, raddr string) {
|
||||||
|
var remote net.Conn
|
||||||
|
var err error
|
||||||
|
checkaddr := strings.Split(raddr, ":")[0]
|
||||||
|
if strings.HasSuffix(checkaddr, ".i2p") {
|
||||||
|
remote, err = p.Garlic.Dial("tcp", raddr)
|
||||||
|
} else if strings.HasSuffix(checkaddr, ".onion") {
|
||||||
|
remote, err = p.Onion.Dial("tcp", raddr)
|
||||||
|
} else {
|
||||||
|
remote, err = net.Dial("tcp", raddr)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("cannot dial to remote: %v", err)
|
||||||
|
}
|
||||||
|
defer remote.Close()
|
||||||
|
go io.Copy(remote, conn)
|
||||||
|
io.Copy(conn, remote)
|
||||||
|
}
|
||||||
|
|
||||||
|
var proxy *OnrampProxy = &OnrampProxy{}
|
||||||
|
|
||||||
|
func Proxy(list net.Listener, raddr string) error {
|
||||||
|
return proxy.Proxy(list, raddr)
|
||||||
|
}
|
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
GITHUB_USER=eyedeekay
|
GITHUB_USER=eyedeekay
|
||||||
GITHUB_REPO=onramp
|
GITHUB_REPO=onramp
|
||||||
GITHUB_NAME="Initial Release"
|
GITHUB_NAME="Removes unnecessary dependency"
|
||||||
GITHUB_DESCRIPTION=$(cat DESC.md)
|
GITHUB_DESCRIPTION=$(cat DESC.md)
|
||||||
GITHUB_TAG=0.0.2
|
GITHUB_TAG=0.0.5
|
||||||
|
|
||||||
github-release release --user "${GITHUB_USER}" \
|
github-release release --user "${GITHUB_USER}" \
|
||||||
--repo "${GITHUB_REPO}" \
|
--repo "${GITHUB_REPO}" \
|
||||||
|
10
showhider.css
Normal file
10
showhider.css
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/* edgar showhider CSS file */
|
||||||
|
#show {display:none; }
|
||||||
|
#hide {display:block; }
|
||||||
|
#show:target {display: block; }
|
||||||
|
#hide:target {display: none; }
|
||||||
|
|
||||||
|
#shownav {display:none; }
|
||||||
|
#hidenav {display:block; }
|
||||||
|
#shownav:target {display: block; }
|
||||||
|
#hidenav:target {display: none; }
|
Reference in New Issue
Block a user