Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
com.ccwangluo.accelerator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sheteng
com.ccwangluo.accelerator
Commits
30ae0d75
Commit
30ae0d75
authored
Apr 19, 2020
by
Mygod
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove more unused code
parent
fb8e18c8
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1 addition
and
256 deletions
+1
-256
.gitmodules
.gitmodules
+1
-0
core/build.gradle
core/build.gradle
+0
-1
core/src/main/java/com/github/shadowsocks/net/ChannelMonitor.kt
...rc/main/java/com/github/shadowsocks/net/ChannelMonitor.kt
+0
-127
core/src/main/java/com/github/shadowsocks/net/Socks5Endpoint.kt
...rc/main/java/com/github/shadowsocks/net/Socks5Endpoint.kt
+0
-128
No files found.
.gitmodules
View file @
30ae0d75
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
[submodule "core/src/main/jni/libancillary"]
[submodule "core/src/main/jni/libancillary"]
path = core/src/main/jni/libancillary
path = core/src/main/jni/libancillary
url = https://github.com/shadowsocks/libancillary.git
url = https://github.com/shadowsocks/libancillary.git
branch = shadowsocks-android
[submodule "core/src/main/jni/libevent"]
[submodule "core/src/main/jni/libevent"]
path = core/src/main/jni/libevent
path = core/src/main/jni/libevent
url = https://github.com/shadowsocks/libevent.git
url = https://github.com/shadowsocks/libevent.git
...
...
core/build.gradle
View file @
30ae0d75
...
@@ -94,7 +94,6 @@ dependencies {
...
@@ -94,7 +94,6 @@ dependencies {
api
'dnsjava:dnsjava:3.0.2'
api
'dnsjava:dnsjava:3.0.2'
api
"org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
api
"org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
api
"org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion"
api
"org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion"
api
'org.connectbot.jsocks:jsocks:1.0.0'
coreLibraryDesugaring
"com.android.tools:desugar_jdk_libs:$desugarLibsVersion"
coreLibraryDesugaring
"com.android.tools:desugar_jdk_libs:$desugarLibsVersion"
kapt
"androidx.room:room-compiler:$roomVersion"
kapt
"androidx.room:room-compiler:$roomVersion"
testImplementation
"junit:junit:$junitVersion"
testImplementation
"junit:junit:$junitVersion"
...
...
core/src/main/java/com/github/shadowsocks/net/ChannelMonitor.kt
deleted
100644 → 0
View file @
fb8e18c8
/*******************************************************************************
* *
* Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package
com.github.shadowsocks.net
import
android.os.Build
import
com.github.shadowsocks.utils.printLog
import
kotlinx.coroutines.*
import
kotlinx.coroutines.channels.Channel
import
kotlinx.coroutines.channels.sendBlocking
import
java.io.IOException
import
java.nio.ByteBuffer
import
java.nio.channels.*
class
ChannelMonitor
:
Thread
(
"ChannelMonitor"
)
{
private
data class
Registration
(
val
channel
:
SelectableChannel
,
val
ops
:
Int
,
val
listener
:
(
SelectionKey
)
->
Unit
)
{
val
result
=
CompletableDeferred
<
SelectionKey
>()
}
private
val
selector
=
Selector
.
open
()
private
val
registrationPipe
=
Pipe
.
open
()
private
val
pendingRegistrations
=
Channel
<
Registration
>(
Channel
.
UNLIMITED
)
private
val
closeChannel
=
Channel
<
Unit
>(
1
)
@Volatile
private
var
running
=
true
private
fun
registerInternal
(
channel
:
SelectableChannel
,
ops
:
Int
,
block
:
(
SelectionKey
)
->
Unit
)
=
channel
.
register
(
selector
,
ops
,
block
)
init
{
registrationPipe
.
source
().
apply
{
configureBlocking
(
false
)
registerInternal
(
this
,
SelectionKey
.
OP_READ
)
{
val
junk
=
ByteBuffer
.
allocateDirect
(
1
)
while
(
read
(
junk
)
>
0
)
{
pendingRegistrations
.
poll
()
!!
.
apply
{
try
{
result
.
complete
(
registerInternal
(
channel
,
ops
,
listener
))
}
catch
(
e
:
Exception
)
{
result
.
completeExceptionally
(
e
)
}
}
junk
.
clear
()
}
}
}
start
()
}
/**
* Prevent NetworkOnMainThreadException because people enable strict mode for no reasons.
*/
private
suspend
fun
WritableByteChannel
.
writeCompat
(
src
:
ByteBuffer
)
=
if
(
Build
.
VERSION
.
SDK_INT
<=
23
)
withContext
(
Dispatchers
.
Default
)
{
write
(
src
)
}
else
write
(
src
)
suspend
fun
register
(
channel
:
SelectableChannel
,
ops
:
Int
,
block
:
(
SelectionKey
)
->
Unit
):
SelectionKey
{
val
registration
=
Registration
(
channel
,
ops
,
block
)
pendingRegistrations
.
send
(
registration
)
ByteBuffer
.
allocateDirect
(
1
).
also
{
junk
->
loop@
while
(
running
)
when
(
registrationPipe
.
sink
().
writeCompat
(
junk
))
{
0
->
kotlinx
.
coroutines
.
yield
()
1
->
break
@loop
else
->
throw
IOException
(
"Failed to register in the channel"
)
}
}
if
(!
running
)
throw
CancellationException
()
return
registration
.
result
.
await
()
}
suspend
fun
wait
(
channel
:
SelectableChannel
,
ops
:
Int
)
=
CompletableDeferred
<
SelectionKey
>().
run
{
register
(
channel
,
ops
)
{
if
(
it
.
isValid
)
try
{
it
.
interestOps
(
0
)
// stop listening
}
catch
(
_
:
CancelledKeyException
)
{
}
complete
(
it
)
}
await
()
}
override
fun
run
()
{
while
(
running
)
{
val
num
=
try
{
selector
.
select
()
}
catch
(
e
:
Exception
)
{
printLog
(
e
)
continue
}
if
(
num
<=
0
)
continue
val
iterator
=
selector
.
selectedKeys
().
iterator
()
while
(
iterator
.
hasNext
())
{
val
key
=
iterator
.
next
()
iterator
.
remove
()
(
key
.
attachment
()
as
(
SelectionKey
)
->
Unit
)(
key
)
}
}
closeChannel
.
sendBlocking
(
Unit
)
}
fun
close
(
scope
:
CoroutineScope
)
{
running
=
false
selector
.
wakeup
()
scope
.
launch
{
closeChannel
.
receive
()
selector
.
keys
().
forEach
{
it
.
channel
().
close
()
}
selector
.
close
()
}
}
}
core/src/main/java/com/github/shadowsocks/net/Socks5Endpoint.kt
deleted
100644 → 0
View file @
fb8e18c8
/*******************************************************************************
* *
* Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package
com.github.shadowsocks.net
import
com.github.shadowsocks.utils.parseNumericAddress
import
net.sourceforge.jsocks.Socks4Message
import
net.sourceforge.jsocks.Socks5Message
import
java.io.EOFException
import
java.io.IOException
import
java.net.Inet4Address
import
java.net.Inet6Address
import
java.nio.ByteBuffer
import
kotlin.math.max
class
Socks5Endpoint
(
host
:
String
,
port
:
Int
)
{
private
val
dest
=
host
.
parseNumericAddress
().
let
{
numeric
->
val
bytes
=
numeric
?.
address
?:
host
.
toByteArray
().
apply
{
check
(
size
<
256
)
{
"Hostname too long"
}
}
val
type
=
when
(
numeric
)
{
null
->
Socks5Message
.
SOCKS_ATYP_DOMAINNAME
is
Inet4Address
->
Socks5Message
.
SOCKS_ATYP_IPV4
is
Inet6Address
->
Socks5Message
.
SOCKS_ATYP_IPV6
else
->
error
(
"Unsupported address type $numeric"
)
}
ByteBuffer
.
allocate
(
bytes
.
size
+
(
if
(
numeric
==
null
)
1
else
0
)
+
3
).
apply
{
put
(
type
.
toByte
())
if
(
numeric
==
null
)
put
(
bytes
.
size
.
toByte
())
put
(
bytes
)
putShort
(
port
.
toShort
())
}
}.
array
()
private
val
headerReserved
=
max
(
3
+
3
+
16
,
3
+
dest
.
size
)
fun
tcpWrap
(
message
:
ByteBuffer
):
ByteBuffer
{
check
(
message
.
remaining
()
<
65536
)
{
"TCP message too large"
}
return
ByteBuffer
.
allocateDirect
(
8
+
dest
.
size
+
message
.
remaining
()).
apply
{
put
(
Socks5Message
.
SOCKS_VERSION
.
toByte
())
put
(
1
)
// nmethods
put
(
0
)
// no authentication required
// header
put
(
Socks5Message
.
SOCKS_VERSION
.
toByte
())
put
(
Socks4Message
.
REQUEST_CONNECT
.
toByte
())
put
(
0
)
// reserved
put
(
dest
)
// data
putShort
(
message
.
remaining
().
toShort
())
put
(
message
)
flip
()
}
}
fun
tcpReceiveBuffer
(
size
:
Int
)
=
ByteBuffer
.
allocateDirect
(
headerReserved
+
4
+
size
)
suspend
fun
tcpUnwrap
(
buffer
:
ByteBuffer
,
reader
:
(
ByteBuffer
)
->
Int
,
wait
:
suspend
()
->
Unit
)
{
suspend
fun
readBytes
(
till
:
Int
)
{
if
(
buffer
.
position
()
>=
till
)
return
while
(
reader
(
buffer
)
>=
0
&&
buffer
.
position
()
<
till
)
wait
()
if
(
buffer
.
position
()
<
till
)
throw
EOFException
(
"${buffer.position()} < $till"
)
}
suspend
fun
read
(
index
:
Int
):
Byte
{
readBytes
(
index
+
1
)
return
buffer
[
index
]
}
if
(
read
(
0
)
!=
Socks5Message
.
SOCKS_VERSION
.
toByte
())
throw
IOException
(
"Unsupported SOCKS version ${buffer[0]}"
)
if
(
read
(
1
)
!=
0
.
toByte
())
throw
IOException
(
"Unsupported authentication ${buffer[1]}"
)
if
(
read
(
2
)
!=
Socks5Message
.
SOCKS_VERSION
.
toByte
())
throw
IOException
(
"Unsupported SOCKS version ${buffer[2]}"
)
if
(
read
(
3
)
!=
0
.
toByte
())
throw
IOException
(
"SOCKS5 server returned error ${buffer[3]}"
)
val
dataOffset
=
when
(
val
type
=
read
(
5
))
{
Socks5Message
.
SOCKS_ATYP_IPV4
.
toByte
()
->
4
Socks5Message
.
SOCKS_ATYP_DOMAINNAME
.
toByte
()
->
1
+
read
(
6
)
Socks5Message
.
SOCKS_ATYP_IPV6
.
toByte
()
->
16
else
->
throw
IOException
(
"Unsupported address type $type"
)
}
+
8
readBytes
(
dataOffset
+
2
)
buffer
.
limit
(
buffer
.
position
())
// store old position to update mark
buffer
.
position
(
dataOffset
)
val
dataLength
=
buffer
.
short
.
toUShort
().
toInt
()
val
end
=
buffer
.
position
()
+
dataLength
if
(
end
>
buffer
.
capacity
())
throw
IOException
(
"Buffer too small to contain the message: $dataLength > ${buffer.capacity() - buffer.position()}"
)
buffer
.
mark
()
buffer
.
position
(
buffer
.
limit
())
// restore old position
buffer
.
limit
(
end
)
readBytes
(
buffer
.
limit
())
buffer
.
reset
()
}
private
fun
ByteBuffer
.
tryPosition
(
newPosition
:
Int
)
{
if
(
limit
()
<
newPosition
)
throw
EOFException
(
"${limit()} < $newPosition"
)
position
(
newPosition
)
}
fun
udpWrap
(
packet
:
ByteBuffer
)
=
ByteBuffer
.
allocateDirect
(
3
+
dest
.
size
+
packet
.
remaining
()).
apply
{
// header
putShort
(
0
)
// reserved
put
(
0
)
// fragment number
put
(
dest
)
// data
put
(
packet
)
flip
()
}
fun
udpReceiveBuffer
(
size
:
Int
)
=
ByteBuffer
.
allocateDirect
(
headerReserved
+
size
)
fun
udpUnwrap
(
packet
:
ByteBuffer
)
{
packet
.
tryPosition
(
3
)
packet
.
tryPosition
(
6
+
when
(
val
type
=
packet
.
get
())
{
Socks5Message
.
SOCKS_ATYP_IPV4
.
toByte
()
->
4
Socks5Message
.
SOCKS_ATYP_DOMAINNAME
.
toByte
()
->
1
+
packet
.
get
()
Socks5Message
.
SOCKS_ATYP_IPV6
.
toByte
()
->
16
else
->
throw
IOException
(
"Unsupported address type $type"
)
})
packet
.
mark
()
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment