/
RPC_aux.go
140 lines (114 loc) · 3.68 KB
/
RPC_aux.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
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
package mm
import (
"context"
"fmt"
"hash/crc32"
"log"
"sync"
jrm1 "github.com/vault-thirteen/JSON-RPC-M1"
ac "github.com/vault-thirteen/SimpleBB/pkg/ACM/client"
am "github.com/vault-thirteen/SimpleBB/pkg/ACM/models"
c "github.com/vault-thirteen/SimpleBB/pkg/common"
cmr "github.com/vault-thirteen/SimpleBB/pkg/common/models/rpc"
cn "github.com/vault-thirteen/SimpleBB/pkg/common/net"
)
// Auxiliary functions used in RPC functions.
// logError logs error if debug mode is enabled.
func (srv *Server) logError(err error) {
if err == nil {
return
}
if srv.settings.SystemSettings.IsDebugMode {
log.Println(err)
}
}
// processDatabaseError processes a database error.
func (srv *Server) processDatabaseError(err error) {
if err == nil {
return
}
if c.IsNetworkError(err) {
log.Println(fmt.Sprintf(c.ErrFDatabaseNetwork, err.Error()))
*(srv.dbErrors) <- err
} else {
srv.logError(err)
}
return
}
// databaseError processes the database error and returns an RPC error.
func (srv *Server) databaseError(err error) (re *jrm1.RpcError) {
srv.processDatabaseError(err)
return jrm1.NewRpcErrorByUser(c.RpcErrorCode_Database, c.RpcErrorMsg_Database, err)
}
// Token-related functions.
// mustBeAuthUserIPA ensures that user's IP address is set. If it is not set,
// an error is returned and the caller of this function must stop and return
// this error.
func (srv *Server) mustBeAuthUserIPA(auth *cmr.Auth) (re *jrm1.RpcError) {
if (auth == nil) ||
(len(auth.UserIPA) == 0) {
return jrm1.NewRpcErrorByUser(c.RpcErrorCode_Authorisation, c.RpcErrorMsg_Authorisation, nil)
}
var err error
auth.UserIPAB, err = cn.ParseIPA(auth.UserIPA)
if err != nil {
srv.logError(err)
return jrm1.NewRpcErrorByUser(c.RpcErrorCode_Authorisation, c.RpcErrorMsg_Authorisation, nil)
}
return nil
}
// mustBeAnAuthToken ensures that an authorisation token is present and is
// valid. If the token is absent or invalid, an error is returned and the caller
// of this function must stop and return this error. User data is returned when
// token is valid.
func (srv *Server) mustBeAnAuthToken(auth *cmr.Auth) (userRoles *am.GetSelfRolesResult, re *jrm1.RpcError) {
re = srv.mustBeAuthUserIPA(auth)
if re != nil {
return nil, re
}
if len(auth.Token) == 0 {
return nil, jrm1.NewRpcErrorByUser(c.RpcErrorCode_Authorisation, c.RpcErrorMsg_Authorisation, nil)
}
userRoles, re = srv.getUserSelfRoles(auth)
if re != nil {
return nil, re
}
return userRoles, nil
}
// Other functions.
func (srv *Server) getUserSelfRoles(auth *cmr.Auth) (userRoles *am.GetSelfRolesResult, re *jrm1.RpcError) {
var params = am.GetSelfRolesParams{
CommonParams: cmr.CommonParams{
Auth: auth,
},
}
userRoles = new(am.GetSelfRolesResult)
var err error
re, err = srv.acmServiceClient.MakeRequest(context.Background(), ac.FuncGetSelfRoles, params, userRoles)
if err != nil {
srv.logError(err)
return nil, jrm1.NewRpcErrorByUser(c.RpcErrorCode_RPCCall, c.RpcErrorMsg_RPCCall, nil)
}
if re != nil {
return nil, jrm1.NewRpcErrorByUser(c.RpcErrorCode_Authorisation, c.RpcErrorMsg_Authorisation, nil)
}
return userRoles, nil
}
func (srv *Server) doTestA(wg *sync.WaitGroup, errChan chan error) {
defer wg.Done()
var ap = am.TestParams{}
var ar = new(am.TestResult)
re, err := srv.acmServiceClient.MakeRequest(context.Background(), ac.FuncTest, ap, ar)
if err != nil {
errChan <- err
}
if re != nil {
errChan <- re.AsError()
}
}
func (srv *Server) getMessageTextChecksum(msgText string) (checksum uint32) {
return crc32.Checksum([]byte(msgText), srv.crcTable)
}
func (srv *Server) checkMessageTextChecksum(msgText string, checksum uint32) (ok bool) {
return srv.getMessageTextChecksum(msgText) == checksum
}