Skip to content

Commit

Permalink
hot fixes for args
Browse files Browse the repository at this point in the history
  • Loading branch information
uoosef committed Feb 11, 2024
1 parent c5f8d03 commit bab6b35
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 108 deletions.
84 changes: 27 additions & 57 deletions app/libs/tun2socks.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ package tun2socks
import (
"bufio"
"context"
"flag"
"fmt"
"io"
"log"
"os"
"os/signal"
"regexp"
"strings"
"sync"
"syscall"
Expand All @@ -21,21 +19,29 @@ import (

// Variables to hold flag values.
var (
verbose *bool
bindAddress *string
endpoint *string
license *string
country *string
psiphonEnabled *bool
gool *bool
scan *bool
rtt *int
logMessages []string
mu sync.Mutex
wg sync.WaitGroup
cancelFunc context.CancelFunc
logMessages []string
mu sync.Mutex
wg sync.WaitGroup
cancelFunc context.CancelFunc
)

type StartOptions struct {
TunFd int
Path string
FakeIPRange string
Verbose bool
BindAddress string
Endpoint string
License string
Country string
PsiphonEnabled bool
Gool bool
Scan bool
Rtt int
}

var global StartOptions

type logWriter struct{}

func (writer logWriter) Write(bytes []byte) (int, error) {
Expand All @@ -45,24 +51,8 @@ func (writer logWriter) Write(bytes []byte) (int, error) {
return len(bytes), nil
}

func parseCommandLine(argStr string) ([]string, error) {
// Regular expression to match flags (like -b or --gool) and their optional values
re := regexp.MustCompile(`(--?\w+)([= ]("[^"]*"|'[^']*'|[^ ]+))?`)
matches := re.FindAllStringSubmatch(argStr, -1)

var args []string
for _, match := range matches {
args = append(args, match[1]) // Flag name
if match[3] != "" {
// Remove surrounding quotes if present
value := strings.Trim(match[3], `"'`)
args = append(args, value) // Flag value
}
}
return args, nil
}

func RunWarp(argStr, path string, fd int) {
func RunWarp(opt *StartOptions) {
global = *opt
logger := logWriter{}
log.SetOutput(logger)
r, w, _ := os.Pipe()
Expand All @@ -81,37 +71,17 @@ func RunWarp(argStr, path string, fd int) {
fmt.Fprintln(os.Stderr, "There was an error with the scanner", err)
}
}(r)
if err := os.Chdir(path); err != nil {
if err := os.Chdir(global.Path); err != nil {
log.Fatal("Error changing to 'main' directory:", err)
}
// Parse command-line arguments.
args, err := parseCommandLine(argStr)
if err != nil {
log.Fatal(err)
}
fs := flag.NewFlagSet("tun2socks", flag.ExitOnError)
verbose = fs.Bool("v", false, "verbose")
bindAddress = fs.String("b", "127.0.0.1:8086", "socks bind address")
endpoint = fs.String("e", "notset", "warp clean ip")
license = fs.String("k", "notset", "license key")
country = fs.String("country", "", "psiphon country code in ISO 3166-1 alpha-2 format")
psiphonEnabled = fs.Bool("cfon", false, "enable psiphonEnabled over warp")
gool = fs.Bool("gool", false, "enable warp gooling")
scan = fs.Bool("scan", false, "enable warp scanner(experimental)")
rtt = flag.Int("rtt", 1000, "scanner rtt threshold, default 1000")

err = fs.Parse(args)
if err != nil {
log.Fatalf("Failed to parse flags: %v", err)
}

// Setup context with cancellation.
ctx, cancel := context.WithCancel(context.Background())
cancelFunc = cancel
wg.Add(1)

// Start your long-running process.
go runServer(ctx, fd)
go runServer(ctx, global.TunFd)

// Wait for interrupt signal.
sigCh := make(chan os.Signal, 1)
Expand Down Expand Up @@ -143,15 +113,15 @@ func runServer(ctx context.Context, fd int) {

// Start wireguard-go and gvisor-tun2socks.
go func() {
err := app.RunWarp(*psiphonEnabled, *gool, *scan, *verbose, *country, *bindAddress, *endpoint, *license, ctx, *rtt)
err := app.RunWarp(global.PsiphonEnabled, global.Gool, global.Scan, global.Verbose, global.Country, global.BindAddress, global.Endpoint, global.License, ctx, global.Rtt)
if err != nil {
log.Println(err)
}
}()

tun2socksStartOptions := &lwip.Tun2socksStartOptions{
TunFd: fd,
Socks5Server: strings.Replace(*bindAddress, "0.0.0.0", "127.0.0.1", -1),
Socks5Server: strings.Replace(global.BindAddress, "0.0.0.0", "127.0.0.1", -1),
FakeIPRange: "24.0.0.0/8",
MTU: 0,
EnableIPv6: true,
Expand Down
47 changes: 5 additions & 42 deletions app/src/main/java/org/bepass/oblivion/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

import com.suke.widget.SwitchButton;

import tun2socks.StartOptions;

public class MainActivity extends AppCompatActivity {
private ActivityResultLauncher<String> pushNotificationPermissionLauncher;
private ActivityResultLauncher<Intent> vpnPermissionLauncher;
Expand Down Expand Up @@ -205,11 +207,8 @@ private boolean isMyServiceRunning() {
return false;
}

private String getBindAddress(boolean addB) {
String B = " -b ";
if(!addB) {
B = "";
}
private String getBindAddress() {
String B = "";
String port = fileManager.getString("USERSETTING_port");
boolean enableLan = fileManager.getBoolean("USERSETTING_lan");
String Bind = "";
Expand All @@ -220,46 +219,10 @@ private String getBindAddress(boolean addB) {
return Bind;
}

private String calculateArgs() {
String Arg = "";
String endpoint = fileManager.getString("USERSETTING_endpoint");
String country = fileManager.getString("USERSETTING_country");
String license = fileManager.getString("USERSETTING_license");

boolean enablePsiphon = fileManager.getBoolean("USERSETTING_psiphon");
boolean enableGool = fileManager.getBoolean("USERSETTING_gool");

if(!endpoint.contains("engage.cloudflareclient.com")) {
Arg = "-e " + endpoint;
} else {
Arg = "-scan true";
}

Arg += getBindAddress(true);

if(!license.trim().isEmpty()) {
Arg += " -k " + license.trim();
}

if(enablePsiphon && !enableGool) {
Arg += " -cfon";
if(!country.trim().isEmpty() && country.length() == 2) {
Arg += " -country " + country.trim();
}
}

if(!enablePsiphon && enableGool) {
Arg += " -gool";
}

return Arg;
}

private void startVpnService() {
//Toast.makeText(getApplicationContext(), calculateArgs(), Toast.LENGTH_LONG).show();
Intent intent = new Intent(this, OblivionVpnService.class);
intent.putExtra("command", calculateArgs());
intent.putExtra("bindAddress", getBindAddress(false));
intent.putExtra("bindAddress", getBindAddress());
intent.setAction(OblivionVpnService.FLAG_VPN_START);
ContextCompat.startForegroundService(this, intent);
sendMessageToService();
Expand Down
80 changes: 71 additions & 9 deletions app/src/main/java/org/bepass/oblivion/OblivionVpnService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.VpnService;
import android.os.Build;
Expand All @@ -26,6 +27,7 @@
import okhttp3.Request;
import okhttp3.Response;
import tun2socks.Tun2socks;
import tun2socks.StartOptions;

import java.io.FileOutputStream;
import java.io.IOException;
Expand All @@ -34,6 +36,7 @@
import java.net.Proxy;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

public class OblivionVpnService extends VpnService {
Expand All @@ -45,10 +48,11 @@ public class OblivionVpnService extends VpnService {
private Notification notification;
private ParcelFileDescriptor mInterface;
private Thread vpnThread;
private String command;
private String bindAddress;
private final Handler handler = new Handler();

SharedPreferences fileManager;

static final int MSG_PERFORM_TASK = 1; // Identifier for the message
static final int MSG_TASK_COMPLETED = 2; // Identifier for the response
static final int MSG_TASK_FAILED = 3; // Identifier for the response
Expand Down Expand Up @@ -118,8 +122,8 @@ public static String pingOverHTTP(String bindAddress) {
try (Response response = client.newCall(request).execute()) {
return response.isSuccessful() ? "true" : "false";
} catch (IOException e) {
e.printStackTrace();
return e.getMessage().contains("ECONNREFUSED") || e.getMessage().contains("general failure") || e.getMessage().contains("timed out") ? "false" : "exception";
//e.printStackTrace();
return Objects.requireNonNull(e.getMessage()).contains("ECONNREFUSED") || e.getMessage().contains("general failure") || e.getMessage().contains("timed out") ? "false" : "exception";
}
}

Expand Down Expand Up @@ -210,7 +214,6 @@ private void clearLogFile() {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && FLAG_VPN_START.equals(intent.getAction())) {
command = intent.getStringExtra("command");
bindAddress = intent.getStringExtra("bindAddress");
runVpn();
return START_STICKY;
Expand Down Expand Up @@ -239,6 +242,7 @@ public void onRevoke() {
}

private void runVpn() {
fileManager = getApplicationContext().getSharedPreferences("UserData", Context.MODE_PRIVATE);
Log.i(TAG, "Clearing Logs");
clearLogFile();
Log.i(TAG, "Create Notification");
Expand Down Expand Up @@ -312,6 +316,64 @@ private void createNotification() {
.build();
}

private String getBindAddress(boolean addB) {
String B = " -b ";
if(!addB) {
B = "";
}
String port = fileManager.getString("USERSETTING_port", "");
boolean enableLan = fileManager.getBoolean("USERSETTING_lan", false);
String Bind = "";
Bind += B + "127.0.0.1:" + port;
if(enableLan) {
Bind = B + "0.0.0.0:" + port;
}
return Bind;
}

private StartOptions calculateArgs() {
StartOptions so = new StartOptions();
so.setPath(getApplicationContext().getFilesDir().getAbsolutePath());
so.setVerbose(true);
so.setVerbose(true);
String endpoint = fileManager.getString("USERSETTING_endpoint", "notset");
String country = fileManager.getString("USERSETTING_country", "");
String license = fileManager.getString("USERSETTING_license", "notset");

boolean enablePsiphon = fileManager.getBoolean("USERSETTING_psiphon", false);
boolean enableGool = fileManager.getBoolean("USERSETTING_gool", false);

if(!endpoint.contains("engage.cloudflareclient.com")) {
so.setEndpoint(endpoint);
} else {
so.setEndpoint("notset");
so.setScan(true);
}

so.setBindAddress(getBindAddress(false));

if(!license.trim().isEmpty()) {
so.setLicense(license.trim());
} else {
so.setLicense("notset");
}

if(enablePsiphon && !enableGool) {
so.setPsiphonEnabled(true);
if(!country.trim().isEmpty() && country.length() == 2) {
so.setCountry(country.trim());
}
}

if(!enablePsiphon && enableGool) {
so.setGool(true);
}

so.setRtt(1000);

return so;
}

private void configure() {
VpnService.Builder builder = new VpnService.Builder();
try {
Expand All @@ -333,11 +395,11 @@ private void configure() {
}
mInterface = builder.establish();
Log.i(TAG, "Interface created");
vpnThread = new Thread(() -> Tun2socks.runWarp(
command,
getApplicationContext().getFilesDir().getAbsolutePath(),
mInterface.getFd()
));

StartOptions so = calculateArgs();
so.setTunFd(mInterface.getFd());

vpnThread = new Thread(() -> Tun2socks.runWarp(so));
vpnThread.start();
}
}

0 comments on commit bab6b35

Please sign in to comment.