114 lines
3.5 KiB
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"]);
|
|
}
|
|
}
|
|
}
|
|
}
|