mirror of
				https://github.com/h44z/wg-portal.git
				synced 2025-11-03 23:56:18 +00:00 
			
		
		
		
	V2 alpha - initial version (#172)
Initial alpha codebase for version 2 of WireGuard Portal. This version is considered unstable and incomplete (for example, no public REST API)! Use with care! Fixes/Implements the following issues: - OAuth support #154, #1 - New Web UI with internationalisation support #98, #107, #89, #62 - Postgres Support #49 - Improved Email handling #47, #119 - DNS Search Domain support #46 - Bugfixes #94, #48 --------- Co-authored-by: Fabian Wechselberger <wechselbergerf@hotmail.com>
This commit is contained in:
		
							
								
								
									
										6
									
								
								internal/lowlevel/doc.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								internal/lowlevel/doc.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
package lowlevel
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
This package contains wrappers for low level api's like netlink or the WireGuard control library.
 | 
			
		||||
Wrapping those external libraries makes mocking and testing code easier.
 | 
			
		||||
*/
 | 
			
		||||
							
								
								
									
										157
									
								
								internal/lowlevel/mocks/NetlinkClient.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								internal/lowlevel/mocks/NetlinkClient.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,157 @@
 | 
			
		||||
// Code generated by mockery v2.10.0. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package mocks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	mock "github.com/stretchr/testify/mock"
 | 
			
		||||
	netlink "github.com/vishvananda/netlink"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NetlinkClient is an autogenerated mock type for the NetlinkClient type
 | 
			
		||||
type NetlinkClient struct {
 | 
			
		||||
	mock.Mock
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddrAdd provides a mock function with given fields: link, addr
 | 
			
		||||
func (_m *NetlinkClient) AddrAdd(link netlink.Link, addr *netlink.Addr) error {
 | 
			
		||||
	ret := _m.Called(link, addr)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link, *netlink.Addr) error); ok {
 | 
			
		||||
		r0 = rf(link, addr)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddrList provides a mock function with given fields: link
 | 
			
		||||
func (_m *NetlinkClient) AddrList(link netlink.Link) ([]netlink.Addr, error) {
 | 
			
		||||
	ret := _m.Called(link)
 | 
			
		||||
 | 
			
		||||
	var r0 []netlink.Addr
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link) []netlink.Addr); ok {
 | 
			
		||||
		r0 = rf(link)
 | 
			
		||||
	} else {
 | 
			
		||||
		if ret.Get(0) != nil {
 | 
			
		||||
			r0 = ret.Get(0).([]netlink.Addr)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var r1 error
 | 
			
		||||
	if rf, ok := ret.Get(1).(func(netlink.Link) error); ok {
 | 
			
		||||
		r1 = rf(link)
 | 
			
		||||
	} else {
 | 
			
		||||
		r1 = ret.Error(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0, r1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddrReplace provides a mock function with given fields: link, addr
 | 
			
		||||
func (_m *NetlinkClient) AddrReplace(link netlink.Link, addr *netlink.Addr) error {
 | 
			
		||||
	ret := _m.Called(link, addr)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link, *netlink.Addr) error); ok {
 | 
			
		||||
		r0 = rf(link, addr)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkAdd provides a mock function with given fields: link
 | 
			
		||||
func (_m *NetlinkClient) LinkAdd(link netlink.Link) error {
 | 
			
		||||
	ret := _m.Called(link)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link) error); ok {
 | 
			
		||||
		r0 = rf(link)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkByName provides a mock function with given fields: name
 | 
			
		||||
func (_m *NetlinkClient) LinkByName(name string) (netlink.Link, error) {
 | 
			
		||||
	ret := _m.Called(name)
 | 
			
		||||
 | 
			
		||||
	var r0 netlink.Link
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(string) netlink.Link); ok {
 | 
			
		||||
		r0 = rf(name)
 | 
			
		||||
	} else {
 | 
			
		||||
		if ret.Get(0) != nil {
 | 
			
		||||
			r0 = ret.Get(0).(netlink.Link)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var r1 error
 | 
			
		||||
	if rf, ok := ret.Get(1).(func(string) error); ok {
 | 
			
		||||
		r1 = rf(name)
 | 
			
		||||
	} else {
 | 
			
		||||
		r1 = ret.Error(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0, r1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkDel provides a mock function with given fields: link
 | 
			
		||||
func (_m *NetlinkClient) LinkDel(link netlink.Link) error {
 | 
			
		||||
	ret := _m.Called(link)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link) error); ok {
 | 
			
		||||
		r0 = rf(link)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkSetDown provides a mock function with given fields: link
 | 
			
		||||
func (_m *NetlinkClient) LinkSetDown(link netlink.Link) error {
 | 
			
		||||
	ret := _m.Called(link)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link) error); ok {
 | 
			
		||||
		r0 = rf(link)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkSetMTU provides a mock function with given fields: link, mtu
 | 
			
		||||
func (_m *NetlinkClient) LinkSetMTU(link netlink.Link, mtu int) error {
 | 
			
		||||
	ret := _m.Called(link, mtu)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link, int) error); ok {
 | 
			
		||||
		r0 = rf(link, mtu)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkSetUp provides a mock function with given fields: link
 | 
			
		||||
func (_m *NetlinkClient) LinkSetUp(link netlink.Link) error {
 | 
			
		||||
	ret := _m.Called(link)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(netlink.Link) error); ok {
 | 
			
		||||
		r0 = rf(link)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										87
									
								
								internal/lowlevel/mocks/WireGuardClient.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								internal/lowlevel/mocks/WireGuardClient.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
// Code generated by mockery v2.10.0. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package mocks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	mock "github.com/stretchr/testify/mock"
 | 
			
		||||
	wgtypes "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// WireGuardClient is an autogenerated mock type for the WireGuardClient type
 | 
			
		||||
type WireGuardClient struct {
 | 
			
		||||
	mock.Mock
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close provides a mock function with given fields:
 | 
			
		||||
func (_m *WireGuardClient) Close() error {
 | 
			
		||||
	ret := _m.Called()
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func() error); ok {
 | 
			
		||||
		r0 = rf()
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConfigureDevice provides a mock function with given fields: name, cfg
 | 
			
		||||
func (_m *WireGuardClient) ConfigureDevice(name string, cfg wgtypes.Config) error {
 | 
			
		||||
	ret := _m.Called(name, cfg)
 | 
			
		||||
 | 
			
		||||
	var r0 error
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(string, wgtypes.Config) error); ok {
 | 
			
		||||
		r0 = rf(name, cfg)
 | 
			
		||||
	} else {
 | 
			
		||||
		r0 = ret.Error(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Device provides a mock function with given fields: name
 | 
			
		||||
func (_m *WireGuardClient) Device(name string) (*wgtypes.Device, error) {
 | 
			
		||||
	ret := _m.Called(name)
 | 
			
		||||
 | 
			
		||||
	var r0 *wgtypes.Device
 | 
			
		||||
	if rf, ok := ret.Get(0).(func(string) *wgtypes.Device); ok {
 | 
			
		||||
		r0 = rf(name)
 | 
			
		||||
	} else {
 | 
			
		||||
		if ret.Get(0) != nil {
 | 
			
		||||
			r0 = ret.Get(0).(*wgtypes.Device)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var r1 error
 | 
			
		||||
	if rf, ok := ret.Get(1).(func(string) error); ok {
 | 
			
		||||
		r1 = rf(name)
 | 
			
		||||
	} else {
 | 
			
		||||
		r1 = ret.Error(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0, r1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Devices provides a mock function with given fields:
 | 
			
		||||
func (_m *WireGuardClient) Devices() ([]*wgtypes.Device, error) {
 | 
			
		||||
	ret := _m.Called()
 | 
			
		||||
 | 
			
		||||
	var r0 []*wgtypes.Device
 | 
			
		||||
	if rf, ok := ret.Get(0).(func() []*wgtypes.Device); ok {
 | 
			
		||||
		r0 = rf()
 | 
			
		||||
	} else {
 | 
			
		||||
		if ret.Get(0) != nil {
 | 
			
		||||
			r0 = ret.Get(0).([]*wgtypes.Device)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var r1 error
 | 
			
		||||
	if rf, ok := ret.Get(1).(func() error); ok {
 | 
			
		||||
		r1 = rf()
 | 
			
		||||
	} else {
 | 
			
		||||
		r1 = ret.Error(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r0, r1
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										108
									
								
								internal/lowlevel/netlink.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								internal/lowlevel/netlink.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
package lowlevel
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/vishvananda/netlink"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A NetlinkClient is a type which can control a netlink device.
 | 
			
		||||
type NetlinkClient interface {
 | 
			
		||||
	LinkAdd(link netlink.Link) error
 | 
			
		||||
	LinkDel(link netlink.Link) error
 | 
			
		||||
	LinkByName(name string) (netlink.Link, error)
 | 
			
		||||
	LinkSetUp(link netlink.Link) error
 | 
			
		||||
	LinkSetDown(link netlink.Link) error
 | 
			
		||||
	LinkSetMTU(link netlink.Link, mtu int) error
 | 
			
		||||
	AddrReplace(link netlink.Link, addr *netlink.Addr) error
 | 
			
		||||
	AddrAdd(link netlink.Link, addr *netlink.Addr) error
 | 
			
		||||
	AddrList(link netlink.Link) ([]netlink.Addr, error)
 | 
			
		||||
	AddrDel(link netlink.Link, addr *netlink.Addr) error
 | 
			
		||||
	RouteAdd(route *netlink.Route) error
 | 
			
		||||
	RouteDel(route *netlink.Route) error
 | 
			
		||||
	RouteReplace(route *netlink.Route) error
 | 
			
		||||
	RouteList(link netlink.Link, family int) ([]netlink.Route, error)
 | 
			
		||||
	RouteListFiltered(family int, filter *netlink.Route, filterMask uint64) ([]netlink.Route, error)
 | 
			
		||||
	RuleAdd(rule *netlink.Rule) error
 | 
			
		||||
	RuleDel(rule *netlink.Rule) error
 | 
			
		||||
	RuleList(family int) ([]netlink.Rule, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NetlinkManager struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) LinkAdd(link netlink.Link) error { return netlink.LinkAdd(link) }
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) LinkDel(link netlink.Link) error { return netlink.LinkDel(link) }
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) LinkByName(name string) (netlink.Link, error) {
 | 
			
		||||
	return netlink.LinkByName(name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) LinkSetUp(link netlink.Link) error { return netlink.LinkSetUp(link) }
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) LinkSetDown(link netlink.Link) error { return netlink.LinkSetDown(link) }
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) LinkSetMTU(link netlink.Link, mtu int) error {
 | 
			
		||||
	return netlink.LinkSetMTU(link, mtu)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) AddrReplace(link netlink.Link, addr *netlink.Addr) error {
 | 
			
		||||
	return netlink.AddrReplace(link, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) AddrAdd(link netlink.Link, addr *netlink.Addr) error {
 | 
			
		||||
	return netlink.AddrAdd(link, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) AddrList(link netlink.Link) ([]netlink.Addr, error) {
 | 
			
		||||
	listIPv4, err := netlink.AddrList(link, netlink.FAMILY_V4)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	listIPv6, err := netlink.AddrList(link, netlink.FAMILY_V6)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ipAddresses := make([]netlink.Addr, 0, len(listIPv4)+len(listIPv6))
 | 
			
		||||
	ipAddresses = append(ipAddresses, listIPv4...)
 | 
			
		||||
	ipAddresses = append(ipAddresses, listIPv6...)
 | 
			
		||||
 | 
			
		||||
	return ipAddresses, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) AddrDel(link netlink.Link, addr *netlink.Addr) error {
 | 
			
		||||
	return netlink.AddrDel(link, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RouteAdd(route *netlink.Route) error {
 | 
			
		||||
	return netlink.RouteAdd(route)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RouteDel(route *netlink.Route) error {
 | 
			
		||||
	return netlink.RouteDel(route)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RouteReplace(route *netlink.Route) error {
 | 
			
		||||
	return netlink.RouteReplace(route)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RouteList(link netlink.Link, family int) ([]netlink.Route, error) {
 | 
			
		||||
	return netlink.RouteList(link, family)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RouteListFiltered(family int, filter *netlink.Route, filterMask uint64) ([]netlink.Route, error) {
 | 
			
		||||
	return netlink.RouteListFiltered(family, filter, filterMask)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RuleAdd(rule *netlink.Rule) error {
 | 
			
		||||
	return netlink.RuleAdd(rule)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RuleDel(rule *netlink.Rule) error {
 | 
			
		||||
	return netlink.RuleDel(rule)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n NetlinkManager) RuleList(family int) ([]netlink.Rule, error) {
 | 
			
		||||
	return netlink.RuleList(family)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								internal/lowlevel/wgctrl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								internal/lowlevel/wgctrl.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
package lowlevel
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A WireGuardClient is a type which can control a WireGuard device.
 | 
			
		||||
type WireGuardClient interface {
 | 
			
		||||
	io.Closer
 | 
			
		||||
	Devices() ([]*wgtypes.Device, error)
 | 
			
		||||
	Device(name string) (*wgtypes.Device, error)
 | 
			
		||||
	ConfigureDevice(name string, cfg wgtypes.Config) error
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user