-
Notifications
You must be signed in to change notification settings - Fork 7
/
cs_negotiation.go
103 lines (91 loc) · 3.14 KB
/
cs_negotiation.go
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
package types
import (
"fmt"
"strings"
)
// CSNegotiationRequire defines Negotiation request
type CSNegotiationRequire string
const (
// CSNegotiationRequireTCP requires Plain TCP connection
CSNegotiationRequireTCP CSNegotiationRequire = "CS_NEG_REFUSE"
// CSNegotiationRequireSSL requires SSL connection
CSNegotiationRequireSSL CSNegotiationRequire = "CS_NEG_REQUIRE"
// CSNegotiationDontCare requires any of TCP or SSL connection
CSNegotiationDontCare CSNegotiationRequire = "CS_NEG_DONT_CARE"
)
// GetCSNegotiationRequire returns CSNegotiationRequire value from string
func GetCSNegotiationRequire(require string) (CSNegotiationRequire, error) {
csNegotiationPolicy := CSNegotiationRequireTCP
var err error = nil
switch strings.TrimSpace(strings.ToUpper(require)) {
case string(CSNegotiationRequireTCP), "TCP":
csNegotiationPolicy = CSNegotiationRequireTCP
case string(CSNegotiationRequireSSL), "SSL":
csNegotiationPolicy = CSNegotiationRequireSSL
case string(CSNegotiationDontCare), "DONT_CARE", "":
csNegotiationPolicy = CSNegotiationDontCare
default:
csNegotiationPolicy = CSNegotiationRequireTCP
err = fmt.Errorf("cannot parse string %s", require)
}
return csNegotiationPolicy, err
}
// CSNegotiationPolicy defines Negotiation result
type CSNegotiationPolicy string
const (
// CSNegotiationFailure presents negotiation is failed
CSNegotiationFailure CSNegotiationPolicy = "CS_NEG_FAILURE"
// CSNegotiationUseTCP uses Plain TCP connection
CSNegotiationUseTCP CSNegotiationPolicy = "CS_NEG_USE_TCP"
// CSNegotiationUseSSL uses SSL connection
CSNegotiationUseSSL CSNegotiationPolicy = "CS_NEG_USE_SSL"
)
// GetCSNegotiationPolicy returns CSNegotiationPolicy value from string
func GetCSNegotiationPolicy(policy string) (CSNegotiationPolicy, error) {
csNegotiationPolicy := CSNegotiationFailure
var err error = nil
switch strings.TrimSpace(strings.ToUpper(policy)) {
case string(CSNegotiationUseTCP), "TCP":
csNegotiationPolicy = CSNegotiationUseTCP
case string(CSNegotiationUseSSL), "SSL":
csNegotiationPolicy = CSNegotiationUseSSL
default:
csNegotiationPolicy = CSNegotiationFailure
err = fmt.Errorf("cannot parse string %s", policy)
}
return csNegotiationPolicy, err
}
// PerformCSNegotiation performs CSNegotiation and returns the policy determined
func PerformCSNegotiation(clientRequest CSNegotiationRequire, serverRequest CSNegotiationRequire) CSNegotiationPolicy {
if serverRequest == CSNegotiationDontCare {
switch clientRequest {
case CSNegotiationDontCare, CSNegotiationRequireTCP:
return CSNegotiationUseTCP
case CSNegotiationRequireSSL:
return CSNegotiationUseSSL
default:
return CSNegotiationFailure
}
}
if clientRequest == CSNegotiationDontCare {
switch serverRequest {
case CSNegotiationRequireTCP:
return CSNegotiationUseTCP
case CSNegotiationRequireSSL:
return CSNegotiationUseSSL
default:
return CSNegotiationFailure
}
}
if clientRequest == serverRequest {
switch clientRequest {
case CSNegotiationRequireTCP:
return CSNegotiationUseTCP
case CSNegotiationRequireSSL:
return CSNegotiationUseSSL
default:
return CSNegotiationFailure
}
}
return CSNegotiationFailure
}