summaryrefslogtreecommitdiff
path: root/types/types.go
blob: 237668be47803dbcf22a8cd2b4e16abae887a6d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// package types lists the various public types that are returned to clients
package types

import (
	"encoding/json"
	"time"
)

// TODO: Discovery here is the same as the upstream discovery format, should we separate this as well?
// Shared server types
// Structs that define the json format for
// url: "https://disco.eduvpn.org/v2/organization_list.json"
type DiscoveryOrganizations struct {
	Version   uint64                  `json:"v"`
	List      []DiscoveryOrganization `json:"organization_list,omitempty"`
	Timestamp time.Time               `json:"go_timestamp"`
}

type DiscoveryOrganization struct {
	DisplayName        DiscoMapOrString `json:"display_name,omitempty"`
	OrgID              string           `json:"org_id"`
	SecureInternetHome string           `json:"secure_internet_home,omitempty"`
	KeywordList        DiscoMapOrString `json:"keyword_list,omitempty"`
}

// Structs that define the json format for
// url: "https://disco.eduvpn.org/v2/server_list.json"
type DiscoveryServers struct {
	Version   uint64            `json:"v"`
	List      []DiscoveryServer `json:"server_list,omitempty"`
	Timestamp time.Time         `json:"go_timestamp"`
}

type DiscoMapOrString map[string]string

// The display name can either be a map or a string in the server list
// Unmarshal it by first trying a string and then the map.
func (displayName *DiscoMapOrString) UnmarshalJSON(data []byte) error {
	var displayNameString string

	err := json.Unmarshal(data, &displayNameString)

	if err == nil {
		*displayName = map[string]string{"en": displayNameString}
		return nil
	}

	var resultingMap map[string]string

	err = json.Unmarshal(data, &resultingMap)

	if err == nil {
		*displayName = resultingMap
		return nil
	}
	return err
}

type DiscoveryServer struct {
	AuthenticationURLTemplate string           `json:"authentication_url_template"`
	BaseURL                   string           `json:"base_url"`
	CountryCode               string           `json:"country_code"`
	DisplayName               DiscoMapOrString `json:"display_name,omitempty"`
	KeywordList               DiscoMapOrString `json:"keyword_list,omitempty"`
	PublicKeyList             []string         `json:"public_key_list"`
	Type                      string           `json:"server_type"`
	SupportContact            []string         `json:"support_contact"`
}

type Expiry struct {
	StartTime int64 `json:"start_time"`
	EndTime int64 `json:"end_time"`
	ButtonTime int64 `json:"button_time"`
	CountdownTime int64 `json:"countdown_time"`
	NotificationTimes []int64 `json:"notification_times"`
}

type Protocol int8

const (
	// PROTOCOL_UNKNOWN indicates that the protocol is not known
	PROTOCOL_UNKNOWN Protocol = iota
	// PROTOCOL_OPENVPN indicates that the protocol is OpenVPN
	PROTOCOL_OPENVPN
	// PROTOCOL_WIREGUARD indicates that the protocol is WireGuard
	PROTOCOL_WIREGUARD
)

type Profile struct {
	Identifier  string            `json:"identifier"`
	DisplayName map[string]string `json:"display_name,omitempty"`
	Protocols   []Protocol        `json:"supported_protocols"`
}

type Profiles struct {
	Map     map[string]Profile `json:"map,omitempty"`
	Current string             `json:"current"`
}

type Tokens struct {
	Access  string `json:"access_token"`
	Refresh string `json:"refresh_token"`
	Expires int64  `json:"expires_in"`
}

type GenericServer struct {
	DisplayName map[string]string `json:"display_name,omitempty"`
	Identifier  string            `json:"identifier"`
	Profiles    Profiles          `json:"profiles"`
}

type InstituteServer struct {
	GenericServer
	Delisted bool `json:"delisted"`
}

type SecureInternetServer struct {
	GenericServer
	CountryCode string `json:"country_code"`
	Delisted    bool   `json:"delisted"`
}

type ServerList struct {
	Institutes     []InstituteServer     `json:"institute_access_servers,omitempty"`
	SecureInternet *SecureInternetServer `json:"secure_internet_server,omitempty"`
	Custom         []GenericServer       `json:"custom_servers,omitempty"`
}

type Configuration struct {
	VPNConfig      string   `json:"config"`
	Protocol       Protocol `json:"protocol"`
	DefaultGateway bool     `json:"default_gateway"`
	Tokens         Tokens   `json:"tokens"`
}

type ServerType int8

const (
	SERVER_UNKNOWN ServerType = iota

	SERVER_INSTITUTE_ACCESS

	SERVER_SECURE_INTERNET

	SERVER_CUSTOM
)

type CurrentServer struct {
	Institute      *InstituteServer      `json:"institute_access_server,omitempty"`
	SecureInternet *SecureInternetServer `json:"secure_internet_server,omitempty"`
	Custom         *GenericServer        `json:"custom_server,omitempty"`
	Type           ServerType            `json:"server_type"`
}