Skip to content

Commit 84a9f79

Browse files
authored
Server nicknames (#48)
New feature: server nicknames
1 parent c6ff7b9 commit 84a9f79

File tree

5 files changed

+62
-12
lines changed

5 files changed

+62
-12
lines changed

src/cmd/add_server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type addServerCmdConfig struct {
2525
configFileServer string
2626
writeToClipboard bool
2727
port int
28+
nickname string
2829
}
2930

3031
var addServerCmdArgs = addServerCmdConfig{
@@ -35,6 +36,7 @@ var addServerCmdArgs = addServerCmdConfig{
3536
configFileServer: ConfigServer,
3637
writeToClipboard: false,
3738
port: USE_ENDPOINT_PORT,
39+
nickname: "",
3840
}
3941

4042
// addServerCmd represents the server command.
@@ -53,6 +55,7 @@ func init() {
5355
addServerCmd.Flags().StringSliceVarP(&addServerCmdArgs.allowedIPs, "routes", "r", addServerCmdArgs.allowedIPs, "[REQUIRED] CIDR IP ranges that will be routed through wiretap")
5456
addServerCmd.Flags().StringVarP(&addServerCmdArgs.serverAddress, "server-address", "s", addServerCmdArgs.serverAddress, "API address of server that new server will connect to, connects to client by default")
5557
addServerCmd.Flags().IntVarP(&addServerCmdArgs.port, "port", "p", addServerCmdArgs.port, "listener port to start on new server for wireguard relay. If --outbound, default is the port specified in --endpoint; otherwise default is 51820")
58+
addServerCmd.Flags().StringVarP(&addServerCmdArgs.nickname, "nickname", "n", addServerCmdArgs.nickname, "Server nickname to display in 'status' command")
5659
addServerCmd.Flags().BoolVarP(&addServerCmdArgs.writeToClipboard, "clipboard", "c", addServerCmdArgs.writeToClipboard, "copy configuration args to clipboard")
5760

5861
addServerCmd.Flags().StringVarP(&addServerCmdArgs.configFileRelay, "relay-input", "", addServerCmdArgs.configFileRelay, "filename of input relay config file")
@@ -167,6 +170,7 @@ func (c addServerCmdConfig) Run() {
167170
PublicKey: serverConfigE2EE.GetPublicKey(),
168171
AllowedIPs: c.allowedIPs,
169172
Endpoint: net.JoinHostPort(newRelayPrefixes[0].Addr().Next().Next().String(), fmt.Sprint(E2EEPort)),
173+
Nickname: c.nickname,
170174
})
171175
check("failed to generate new e2ee peer", err)
172176
clientConfigE2EE.AddPeer(serverE2EEPeer)
@@ -260,6 +264,7 @@ func (c addServerCmdConfig) Run() {
260264
PublicKey: serverConfigE2EE.GetPublicKey(),
261265
AllowedIPs: c.allowedIPs,
262266
Endpoint: net.JoinHostPort(addresses.NextServerRelayAddr4.String(), fmt.Sprint(E2EEPort)),
267+
Nickname: c.nickname,
263268
})
264269
check("failed to parse server as peer", err)
265270
clientConfigE2EE.AddPeer(serverPeerConfigE2EE)

src/cmd/configure.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type configureCmdConfig struct {
1818
endpoint string
1919
outbound bool
2020
port int
21+
nickname string
2122
configFileRelay string
2223
configFileE2EE string
2324
configFileServer string
@@ -43,6 +44,7 @@ var configureCmdArgs = configureCmdConfig{
4344
endpoint: Endpoint,
4445
outbound: false,
4546
port: USE_ENDPOINT_PORT,
47+
nickname: "",
4648
configFileRelay: ConfigRelay,
4749
configFileE2EE: ConfigE2EE,
4850
configFileServer: ConfigServer,
@@ -79,6 +81,8 @@ func init() {
7981
configureCmd.Flags().StringVarP(&configureCmdArgs.endpoint, "endpoint", "e", configureCmdArgs.endpoint, "[REQUIRED] IP:PORT (or [IP]:PORT for IPv6) of wireguard listener that server will connect to (example \"1.2.3.4:51820\")")
8082
configureCmd.Flags().BoolVar(&configureCmdArgs.outbound, "outbound", configureCmdArgs.outbound, "client will initiate handshake to server; --endpoint now specifies server's listening socket instead of client's, and --port assigns the server's listening port instead of client's")
8183
configureCmd.Flags().IntVarP(&configureCmdArgs.port, "port", "p", configureCmdArgs.port, "listener port for wireguard relay. Default is to copy the --endpoint port. If --outbound, sets port for the server; else for the client.")
84+
configureCmd.Flags().StringVarP(&configureCmdArgs.nickname, "nickname", "n", configureCmdArgs.nickname, "Server nickname to display in 'status' command")
85+
8286
configureCmd.Flags().StringVarP(&configureCmdArgs.configFileRelay, "relay-output", "", configureCmdArgs.configFileRelay, "wireguard relay config output filename")
8387
configureCmd.Flags().StringVarP(&configureCmdArgs.configFileE2EE, "e2ee-output", "", configureCmdArgs.configFileE2EE, "wireguard E2EE config output filename")
8488
configureCmd.Flags().StringVarP(&configureCmdArgs.configFileServer, "server-output", "s", configureCmdArgs.configFileServer, "wiretap server config output filename")
@@ -193,7 +197,6 @@ func (c configureCmdConfig) Run() {
193197

194198
err = serverConfigRelay.SetPort(serverPort)
195199
check("failed to set port", err)
196-
197200

198201
clientConfigRelayArgs := peer.ConfigArgs{
199202
ListenPort: clientPort,
@@ -239,6 +242,7 @@ func (c configureCmdConfig) Run() {
239242
PublicKey: serverConfigE2EE.GetPublicKey(),
240243
AllowedIPs: c.allowedIPs,
241244
Endpoint: net.JoinHostPort(relaySubnet4.Addr().Next().Next().String(), fmt.Sprint(E2EEPort)),
245+
Nickname: c.nickname,
242246
},
243247
},
244248
Addresses: clientE2EEAddrs,

src/cmd/status.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,12 @@ func (c statusCmdConfig) Run() {
134134
}
135135
}
136136
t.AddChild(tree.NodeString(fmt.Sprintf(`server
137-
relay: %v...
138-
e2ee: %v...
137+
nickname: %v
138+
relay: %v...
139+
e2ee: %v...
139140
140-
api: %v
141-
routes: %v `, c.relayConfig.GetPublicKey()[:8], c.e2eeConfig.GetPublicKey()[:8], api, strings.Join(ips, ","))))
141+
api: %v
142+
routes: %v `, c.peerConfig.GetNickname(), c.relayConfig.GetPublicKey()[:8], c.e2eeConfig.GetPublicKey()[:8], api, strings.Join(ips, ","))))
142143
child, err := t.Child(0)
143144
check("could not build tree", err)
144145
treeTraversal(node.children[i], child)

src/peer/config.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const (
4444
PowerShell
4545
)
4646

47+
const CUSTOM_PREFIX = "#@"
48+
4749
func GetConfig(args ConfigArgs) (Config, error) {
4850
c, err := NewConfig()
4951
if err != nil {
@@ -158,9 +160,16 @@ func ParseConfig(filename string) (c Config, err error) {
158160
case "[peer]":
159161
newPeer := PeerConfig{}
160162
for _, line := range lines[1:] {
161-
if len(line) == 0 || line[0] == '#' {
163+
if len(line) == 0 {
162164
continue
163165
}
166+
167+
if strings.HasPrefix(line, CUSTOM_PREFIX) { //special wiretap-specific values
168+
line = line[len(CUSTOM_PREFIX):]
169+
} else if line[0] == '#' {
170+
continue
171+
}
172+
164173
key, value, err := parseConfigLine(line)
165174
if err != nil {
166175
return c, err
@@ -178,6 +187,8 @@ func ParseConfig(filename string) (c Config, err error) {
178187
return c, e
179188
}
180189
err = newPeer.SetPersistentKeepaliveInterval(keepalive)
190+
case "nickname":
191+
err = newPeer.SetNickname(value)
181192
}
182193
if err != nil {
183194
return c, err
@@ -195,12 +206,12 @@ func ParseConfig(filename string) (c Config, err error) {
195206
}
196207

197208
func parseConfigLine(line string) (string, string, error) {
198-
split := strings.Fields(line)
199-
if len(split) != 3 {
200-
return "", "", fmt.Errorf("failed to parse line: incorrect number of fields: [%s]", line)
209+
key, val, found := strings.Cut(line, "=")
210+
if !found {
211+
return "", "", fmt.Errorf("failed to parse line: no = found: [%s]", line)
201212
}
202213

203-
return strings.ToLower(strings.TrimSpace(split[0])), strings.TrimSpace(split[2]), nil
214+
return strings.ToLower(strings.TrimSpace(key)), strings.TrimSpace(val), nil
204215
}
205216

206217
func (c *Config) MarshalJSON() ([]byte, error) {
@@ -403,7 +414,7 @@ func (c *Config) AsShareableFile() string {
403414
s.WriteString("[Peer]\n")
404415
s.WriteString(fmt.Sprintf("PublicKey = %s\n", c.config.PrivateKey.PublicKey().String()))
405416
s.WriteString("AllowedIPs = 0.0.0.0/32\n")
406-
417+
407418
return s.String()
408419
}
409420

src/peer/peer_config.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ import (
1515
type PeerConfig struct {
1616
config wgtypes.PeerConfig
1717
privateKey *wgtypes.Key
18+
nickname string
1819
}
1920

2021
type peerConfigJSON struct {
2122
Config wgtypes.PeerConfig
2223
PrivateKey *wgtypes.Key
24+
Nickname string
2325
}
2426

2527
type PeerConfigArgs struct {
@@ -32,6 +34,7 @@ type PeerConfigArgs struct {
3234
ReplaceAllowedIPs bool
3335
AllowedIPs []string
3436
PrivateKey string
37+
Nickname string
3538
}
3639

3740
func GetPeerConfig(args PeerConfigArgs) (PeerConfig, error) {
@@ -84,6 +87,13 @@ func GetPeerConfig(args PeerConfigArgs) (PeerConfig, error) {
8487
return PeerConfig{}, err
8588
}
8689
}
90+
91+
if args.Nickname != "" {
92+
err = c.SetNickname(args.Nickname)
93+
if err != nil {
94+
return PeerConfig{}, err
95+
}
96+
}
8797

8898
return c, nil
8999
}
@@ -99,13 +109,15 @@ func NewPeerConfig() (PeerConfig, error) {
99109
PublicKey: privateKey.PublicKey(),
100110
},
101111
privateKey: &privateKey,
112+
nickname: "",
102113
}, nil
103114
}
104115

105116
func (p *PeerConfig) MarshalJSON() ([]byte, error) {
106117
return json.Marshal(peerConfigJSON{
107118
p.config,
108119
p.privateKey,
120+
p.nickname,
109121
})
110122
}
111123

@@ -119,6 +131,7 @@ func (p *PeerConfig) UnmarshalJSON(b []byte) error {
119131

120132
p.config = tmp.Config
121133
p.privateKey = tmp.PrivateKey
134+
p.nickname = tmp.Nickname
122135

123136
return nil
124137
}
@@ -231,11 +244,27 @@ func (p *PeerConfig) SetPrivateKey(privateKey string) error {
231244
return nil
232245
}
233246

247+
func (p *PeerConfig) GetNickname() string {
248+
return p.nickname
249+
}
250+
251+
func (p *PeerConfig) SetNickname(nickname string) error {
252+
if nickname != "" {
253+
p.nickname = nickname
254+
}
255+
return nil
256+
}
257+
234258
func (p *PeerConfig) AsFile() string {
235259
var s strings.Builder
236-
237260
s.WriteString("[Peer]\n")
261+
262+
if p.nickname != "" {
263+
s.WriteString(fmt.Sprintf("%s Nickname = %s\n", CUSTOM_PREFIX, p.nickname))
264+
}
265+
238266
s.WriteString(fmt.Sprintf("PublicKey = %s\n", p.config.PublicKey.String()))
267+
239268
ips := []string{}
240269
for _, a := range p.config.AllowedIPs {
241270
ips = append(ips, a.String())

0 commit comments

Comments
 (0)