vpn.keks.cloud/app/Http/Controllers/PeerController.php

114 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Helper\WGKey;
use App\Models\Peer;
use App\Models\VPN;
use App\Services\WGRest;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Auth;
use IPTools\IP;
use IPTools\Network;
class PeerController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function overview() {
$user = Auth::user();
$vpn_id = session()->get("current_vpn");
$peers1 = Peer::query()->where("vpn_id", "=", $vpn_id)->where("user_id", "!=", $user->id)->get();
$peers2 = Peer::query()->where("vpn_id", "=", $vpn_id)->whereNull("user_id")->get();
$peers = [];
foreach ($peers1 as $p){
$peers[] = $p;
}
foreach ($peers2 as $p) {
$peers[] = $p;
}
$mypeers = Peer::query()->where("vpn_id", "=", $vpn_id)->where("user_id", "=", $user->id)->get();
return view("peer.overview",["peers" => $peers, "mypeers" => $mypeers]);
}
public function newView() {
return view("peer.new");
}
public function new(Request $request) {
$vpn_id = session()->get("current_vpn");
$vpn = VPN::query()->where("id", "=", $vpn_id)->firstOrFail();
$peer = new Peer();
$peer->name = $request->input("name");
$peer->user_id = Auth::user()->id;
$peer->vpn_id = $vpn_id;
//Calculate IP
$nework = Network::parse($vpn->network);
$peers = Peer::query()->where("vpn_id", "=", $vpn->id)->get();
$usedIPs = [];
foreach ($peers as $p) {
$usedIPs[] = $p->ip;
}
$first = true;
foreach ($nework as $ip) {
if($first) {
$first = false;
continue;
}
if(in_array($ip, $usedIPs)) {
continue;
}
$peer->ip = (string)$ip;
break;
}
//Generate Key
if($request->input("genKeys")) {
$keys = WGKey::generatePrivateKeyForPeer();
$peer->public_key = $keys["privkey"];
$peer->preshared_key = $keys["presharedkey"];
} else {
$peer->public_key = $request->input("public_key");
$peer->preshared_key = $request->input("preshared_key");
}
$peer->saveOrFail();
if($request->input("genKeys")) {
return view("peer.install", ["keys" => $keys, "peer" => $peer]);
}
}
public function syncPeers(WGRest $WGRest) {
$vpn_id = session()->get("current_vpn");
$this->syncPeersNow($vpn_id, $WGRest);
return redirect("/vpn?id=".$vpn_id);
}
private function syncPeersNow($vpnId, WGRest $WGRest) {
$vpn = VPN::query()->where("id", "=", $vpnId)->firstOrFail();
$peers = Peer::query()->where("vpn_id", "=", $vpn->id)->get();
$validePublicKeys = [];
foreach ($peers as $peer) {
$WGRest->createPeer($vpn->name, $peer->public_key, $peer->preshared_key, [$peer->ip."/32"]);
$validePublicKeys[] = $peer->public_key;
}
$wgPeers = $WGRest->getPeers($vpn->name);
foreach ($wgPeers as $peer) {
if(!in_array($peer["public_key"], $validePublicKeys)) {
$WGRest->deletePeer($vpn->name, $peer["peer_id"]);
}
}
}
}