WgQuickBackend: Finish the implementation
Signed-off-by: Samuel Holland <samuel@sholland.org>
This commit is contained in:
		
							parent
							
								
									933a685585
								
							
						
					
					
						commit
						17f8c65b2e
					
				@ -13,6 +13,8 @@ import com.wireguard.android.util.ToolsInstaller;
 | 
				
			|||||||
import com.wireguard.config.Config;
 | 
					import com.wireguard.config.Config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileOutputStream;
 | 
				
			||||||
 | 
					import java.nio.charset.StandardCharsets;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -29,23 +31,45 @@ public final class WgQuickBackend implements Backend {
 | 
				
			|||||||
    private static final String TAG = "WireGuard/" + WgQuickBackend.class.getSimpleName();
 | 
					    private static final String TAG = "WireGuard/" + WgQuickBackend.class.getSimpleName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final Context context;
 | 
					    private final Context context;
 | 
				
			||||||
 | 
					    private final File localTemporaryDir;
 | 
				
			||||||
    private final RootShell rootShell;
 | 
					    private final RootShell rootShell;
 | 
				
			||||||
    private final ToolsInstaller toolsInstaller;
 | 
					    private final ToolsInstaller toolsInstaller;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public WgQuickBackend(final Context context, final RootShell rootShell,
 | 
					    public WgQuickBackend(final Context context, final RootShell rootShell,
 | 
				
			||||||
                          final ToolsInstaller toolsInstaller) {
 | 
					                          final ToolsInstaller toolsInstaller) {
 | 
				
			||||||
        this.context = context;
 | 
					        this.context = context;
 | 
				
			||||||
 | 
					        localTemporaryDir = new File(context.getCacheDir(), "tmp");
 | 
				
			||||||
        this.rootShell = rootShell;
 | 
					        this.rootShell = rootShell;
 | 
				
			||||||
        this.toolsInstaller = toolsInstaller;
 | 
					        this.toolsInstaller = toolsInstaller;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Config applyConfig(final Tunnel tunnel, final Config config) {
 | 
					    public Config applyConfig(final Tunnel tunnel, final Config config) throws Exception {
 | 
				
			||||||
        if (tunnel.getState() == State.UP)
 | 
					        if (tunnel.getState() == State.UP) {
 | 
				
			||||||
            throw new UnsupportedOperationException("Not implemented");
 | 
					            // Restart the tunnel to apply the new config.
 | 
				
			||||||
 | 
					            setState(tunnel, State.DOWN);
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                bringUpTunnel(tunnel, config);
 | 
				
			||||||
 | 
					            } catch (final Exception e) {
 | 
				
			||||||
 | 
					                // The new configuration didn't work, so try to go back to the old one.
 | 
				
			||||||
 | 
					                bringUpTunnel(tunnel, tunnel.getConfig());
 | 
				
			||||||
 | 
					                throw e;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return config;
 | 
					        return config;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int bringUpTunnel(final Tunnel tunnel, final Config config) throws Exception {
 | 
				
			||||||
 | 
					        final File tempFile = new File(localTemporaryDir, tunnel.getName() + ".conf");
 | 
				
			||||||
 | 
					        try (FileOutputStream stream = new FileOutputStream(tempFile, false)) {
 | 
				
			||||||
 | 
					            stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        final int result = rootShell.run(null, "wg-quick up '" + tempFile.getAbsolutePath() + '\'');
 | 
				
			||||||
 | 
					        if (!tempFile.delete())
 | 
				
			||||||
 | 
					            Log.w(TAG, "Couldn't delete temporary file after bringing up " + tunnel.getName());
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Set<String> enumerate() {
 | 
					    public Set<String> enumerate() {
 | 
				
			||||||
        final List<String> output = new ArrayList<>();
 | 
					        final List<String> output = new ArrayList<>();
 | 
				
			||||||
@ -85,11 +109,9 @@ public final class WgQuickBackend implements Backend {
 | 
				
			|||||||
        if (state == State.UP) {
 | 
					        if (state == State.UP) {
 | 
				
			||||||
            if (!new File("/sys/module/wireguard").exists())
 | 
					            if (!new File("/sys/module/wireguard").exists())
 | 
				
			||||||
                throw new ErrnoException("WireGuard module not loaded", OsConstants.ENODEV);
 | 
					                throw new ErrnoException("WireGuard module not loaded", OsConstants.ENODEV);
 | 
				
			||||||
            // FIXME: Assumes file layout from FileConfigStore. Use a temporary file.
 | 
					            result = bringUpTunnel(tunnel, tunnel.getConfig());
 | 
				
			||||||
            final File file = new File(context.getFilesDir(), tunnel.getName() + ".conf");
 | 
					 | 
				
			||||||
            result = rootShell.run(null, String.format("wg-quick up '%s'", file.getAbsolutePath()));
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            result = rootShell.run(null, String.format("wg-quick down '%s'", tunnel.getName()));
 | 
					            result = rootShell.run(null, "wg-quick down '" + tunnel.getName() + '\'');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (result != 0)
 | 
					        if (result != 0)
 | 
				
			||||||
            throw new Exception("wg-quick failed");
 | 
					            throw new Exception("wg-quick failed");
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user