rpc.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. package api
  2. import (
  3. "os"
  4. "time"
  5. "google.golang.org/grpc"
  6. "google.golang.org/grpc/codes"
  7. "github.com/Sirupsen/logrus"
  8. "github.com/cad/ovpm"
  9. "github.com/cad/ovpm/api/pb"
  10. "github.com/cad/ovpm/permset"
  11. "golang.org/x/net/context"
  12. )
  13. type AuthService struct{}
  14. func (s *AuthService) Status(ctx context.Context, req *pb.AuthStatusRequest) (*pb.AuthStatusResponse, error) {
  15. logrus.Debug("rpc call: auth status")
  16. username, err := GetUsernameFromContext(ctx)
  17. if err != nil {
  18. logrus.Debugln(err)
  19. return nil, grpc.Errorf(codes.Unauthenticated, "username not found with the provided credentials")
  20. }
  21. if username == "root" {
  22. userResp := pb.UserResponse_User{
  23. Username: username,
  24. IsAdmin: true,
  25. }
  26. return &pb.AuthStatusResponse{User: &userResp, IsRoot: true}, nil
  27. }
  28. user, err := ovpm.GetUser(username)
  29. if err != nil {
  30. logrus.Debugln(err)
  31. return nil, grpc.Errorf(codes.Unauthenticated, "user not found with the provided credentials")
  32. }
  33. userResp := pb.UserResponse_User{
  34. Username: user.GetUsername(),
  35. IsAdmin: user.IsAdmin(),
  36. }
  37. return &pb.AuthStatusResponse{User: &userResp}, nil
  38. }
  39. func (s *AuthService) Authenticate(ctx context.Context, req *pb.AuthAuthenticateRequest) (*pb.AuthAuthenticateResponse, error) {
  40. logrus.Debug("rpc call: auth authenticate")
  41. user, err := ovpm.GetUser(req.Username)
  42. if err != nil {
  43. return nil, grpc.Errorf(codes.Unauthenticated, "user not found with the provided credentials")
  44. }
  45. if !user.CheckPassword(req.Password) {
  46. return nil, grpc.Errorf(codes.Unauthenticated, "user not found with the provided credentials")
  47. }
  48. token, err := user.RenewToken()
  49. if err != nil {
  50. return nil, grpc.Errorf(codes.Internal, "token can not be generated")
  51. }
  52. return &pb.AuthAuthenticateResponse{Token: token}, nil
  53. }
  54. type UserService struct{}
  55. func (s *UserService) List(ctx context.Context, req *pb.UserListRequest) (*pb.UserResponse, error) {
  56. logrus.Debug("rpc call: user list")
  57. perms, err := permset.FromContext(ctx)
  58. if err != nil {
  59. return nil, grpc.Errorf(codes.Unauthenticated, "permset not found within the context")
  60. }
  61. // Check perms.
  62. if !perms.Contains(ovpm.GetAnyUserPerm) {
  63. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.GetAnyUserPerm is required for this operation")
  64. }
  65. var ut []*pb.UserResponse_User
  66. users, err := ovpm.GetAllUsers()
  67. if err != nil {
  68. logrus.Errorf("users can not be fetched: %v", err)
  69. os.Exit(1)
  70. return nil, err
  71. }
  72. for _, user := range users {
  73. isConnected, connectedSince, bytesSent, bytesReceived := user.ConnectionStatus()
  74. ut = append(ut, &pb.UserResponse_User{
  75. ServerSerialNumber: user.GetServerSerialNumber(),
  76. Username: user.GetUsername(),
  77. CreatedAt: user.GetCreatedAt(),
  78. IpNet: user.GetIPNet(),
  79. NoGw: user.IsNoGW(),
  80. HostId: user.GetHostID(),
  81. IsAdmin: user.IsAdmin(),
  82. IsConnected: isConnected,
  83. ConnectedSince: connectedSince.UTC().Format(time.RFC3339),
  84. BytesSent: bytesSent,
  85. BytesReceived: bytesReceived,
  86. })
  87. }
  88. return &pb.UserResponse{Users: ut}, nil
  89. }
  90. func (s *UserService) Create(ctx context.Context, req *pb.UserCreateRequest) (*pb.UserResponse, error) {
  91. logrus.Debugf("rpc call: user create: %s", req.Username)
  92. perms, err := permset.FromContext(ctx)
  93. if err != nil {
  94. return nil, grpc.Errorf(codes.Unauthenticated, "permset not found within the context")
  95. }
  96. // Check perms.
  97. if !perms.Contains(ovpm.CreateUserPerm) {
  98. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.CreateUserPerm is required for this operation")
  99. }
  100. var ut []*pb.UserResponse_User
  101. user, err := ovpm.CreateNewUser(req.Username, req.Password, req.NoGw, req.HostId, req.IsAdmin)
  102. if err != nil {
  103. return nil, err
  104. }
  105. pbUser := pb.UserResponse_User{
  106. Username: user.GetUsername(),
  107. ServerSerialNumber: user.GetServerSerialNumber(),
  108. NoGw: user.IsNoGW(),
  109. HostId: user.GetHostID(),
  110. IsAdmin: user.IsAdmin(),
  111. }
  112. ut = append(ut, &pbUser)
  113. return &pb.UserResponse{Users: ut}, nil
  114. }
  115. func (s *UserService) Update(ctx context.Context, req *pb.UserUpdateRequest) (*pb.UserResponse, error) {
  116. logrus.Debugf("rpc call: user update: %s", req.Username)
  117. var ut []*pb.UserResponse_User
  118. user, err := ovpm.GetUser(req.Username)
  119. if err != nil {
  120. return nil, err
  121. }
  122. var noGW bool
  123. switch req.Gwpref {
  124. case pb.UserUpdateRequest_NOGW:
  125. noGW = true
  126. case pb.UserUpdateRequest_GW:
  127. noGW = false
  128. default:
  129. noGW = user.NoGW
  130. }
  131. var admin bool
  132. switch req.AdminPref {
  133. case pb.UserUpdateRequest_ADMIN:
  134. admin = true
  135. case pb.UserUpdateRequest_NOADMIN:
  136. admin = false
  137. case pb.UserUpdateRequest_NOPREFADMIN:
  138. admin = user.IsAdmin()
  139. }
  140. perms, err := permset.FromContext(ctx)
  141. if err != nil {
  142. return nil, grpc.Errorf(codes.Unauthenticated, "permset not found within the context")
  143. }
  144. username, err := GetUsernameFromContext(ctx)
  145. if err != nil {
  146. logrus.Debugln(err)
  147. return nil, grpc.Errorf(codes.Unauthenticated, "username not found with the provided credentials")
  148. }
  149. // User has admin perms?
  150. if perms.Contains(ovpm.UpdateAnyUserPerm) {
  151. err = user.Update(req.Password, noGW, req.HostId, admin)
  152. if err != nil {
  153. return nil, err
  154. }
  155. ut = append(ut, &pb.UserResponse_User{
  156. Username: user.GetUsername(),
  157. ServerSerialNumber: user.GetServerSerialNumber(),
  158. NoGw: user.IsNoGW(),
  159. HostId: user.GetHostID(),
  160. IsAdmin: user.IsAdmin(),
  161. })
  162. return &pb.UserResponse{Users: ut}, nil
  163. }
  164. // User has self update perms?
  165. if perms.Contains(ovpm.UpdateSelfPerm) {
  166. if user.GetUsername() != username {
  167. return nil, grpc.Errorf(codes.PermissionDenied, "Caller can only update their user with ovpm.UpdateSelfPerm")
  168. }
  169. err = user.Update(req.Password, noGW, req.HostId, admin)
  170. if err != nil {
  171. return nil, err
  172. }
  173. ut = append(ut, &pb.UserResponse_User{
  174. Username: user.GetUsername(),
  175. ServerSerialNumber: user.GetServerSerialNumber(),
  176. NoGw: user.IsNoGW(),
  177. HostId: user.GetHostID(),
  178. IsAdmin: user.IsAdmin(),
  179. })
  180. return &pb.UserResponse{Users: ut}, nil
  181. }
  182. return nil, grpc.Errorf(codes.PermissionDenied, "Permissions are required for this operation.")
  183. }
  184. func (s *UserService) Delete(ctx context.Context, req *pb.UserDeleteRequest) (*pb.UserResponse, error) {
  185. logrus.Debugf("rpc call: user delete: %s", req.Username)
  186. var ut []*pb.UserResponse_User
  187. user, err := ovpm.GetUser(req.Username)
  188. if err != nil {
  189. return nil, err
  190. }
  191. perms, err := permset.FromContext(ctx)
  192. if err != nil {
  193. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  194. }
  195. if !perms.Contains(ovpm.DeleteAnyUserPerm) {
  196. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.DeleteAnyUserPerm is required for this operation.")
  197. }
  198. pbUser := pb.UserResponse_User{
  199. Username: user.GetUsername(),
  200. ServerSerialNumber: user.GetServerSerialNumber(),
  201. HostId: user.GetHostID(),
  202. IsAdmin: user.IsAdmin(),
  203. }
  204. ut = append(ut, &pbUser)
  205. err = user.Delete()
  206. if err != nil {
  207. return nil, err
  208. }
  209. return &pb.UserResponse{Users: ut}, nil
  210. }
  211. func (s *UserService) Renew(ctx context.Context, req *pb.UserRenewRequest) (*pb.UserResponse, error) {
  212. logrus.Debugf("rpc call: user renew cert: %s", req.Username)
  213. var ut []*pb.UserResponse_User
  214. user, err := ovpm.GetUser(req.Username)
  215. if err != nil {
  216. return nil, err
  217. }
  218. pbUser := pb.UserResponse_User{
  219. Username: user.GetUsername(),
  220. ServerSerialNumber: user.GetServerSerialNumber(),
  221. HostId: user.GetHostID(),
  222. IsAdmin: user.IsAdmin(),
  223. }
  224. ut = append(ut, &pbUser)
  225. perms, err := permset.FromContext(ctx)
  226. if err != nil {
  227. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  228. }
  229. if !perms.Contains(ovpm.RenewAnyUserPerm) {
  230. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.RenewAnyUserPerm is required for this operation.")
  231. }
  232. err = user.Renew()
  233. if err != nil {
  234. return nil, err
  235. }
  236. return &pb.UserResponse{Users: ut}, nil
  237. }
  238. func (s *UserService) GenConfig(ctx context.Context, req *pb.UserGenConfigRequest) (*pb.UserGenConfigResponse, error) {
  239. logrus.Debugf("rpc call: user genconfig: %s", req.Username)
  240. user, err := ovpm.GetUser(req.Username)
  241. if err != nil {
  242. return nil, err
  243. }
  244. username, err := GetUsernameFromContext(ctx)
  245. if err != nil {
  246. logrus.Debugln(err)
  247. return nil, grpc.Errorf(codes.Unauthenticated, "username not found with the provided credentials")
  248. }
  249. perms, err := permset.FromContext(ctx)
  250. if err != nil {
  251. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  252. }
  253. if perms.Contains(ovpm.GenConfigAnyUserPerm) {
  254. configBlob, err := ovpm.TheServer().DumpsClientConfig(user.GetUsername())
  255. if err != nil {
  256. return nil, err
  257. }
  258. return &pb.UserGenConfigResponse{ClientConfig: configBlob}, nil
  259. }
  260. if perms.Contains(ovpm.GenConfigSelfPerm) {
  261. if user.GetUsername() != username {
  262. return nil, grpc.Errorf(codes.PermissionDenied, "Caller can only genconfig for their user.")
  263. }
  264. configBlob, err := ovpm.TheServer().DumpsClientConfig(user.GetUsername())
  265. if err != nil {
  266. return nil, err
  267. }
  268. return &pb.UserGenConfigResponse{ClientConfig: configBlob}, nil
  269. }
  270. return nil, grpc.Errorf(codes.PermissionDenied, "Permissions are required for this operation.")
  271. }
  272. type VPNService struct{}
  273. func (s *VPNService) Status(ctx context.Context, req *pb.VPNStatusRequest) (*pb.VPNStatusResponse, error) {
  274. logrus.Debugf("rpc call: vpn status")
  275. server := ovpm.TheServer()
  276. perms, err := permset.FromContext(ctx)
  277. if err != nil {
  278. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  279. }
  280. if !perms.Contains(ovpm.GetVPNStatusPerm) {
  281. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.GetVPNStatusPerm is required for this operation.")
  282. }
  283. response := pb.VPNStatusResponse{
  284. Name: server.GetServerName(),
  285. SerialNumber: server.GetSerialNumber(),
  286. Hostname: server.GetHostname(),
  287. Port: server.GetPort(),
  288. Proto: server.GetProto(),
  289. Cert: server.GetCert(),
  290. CaCert: server.GetCACert(),
  291. Net: server.GetNet(),
  292. Mask: server.GetMask(),
  293. CreatedAt: server.GetCreatedAt(),
  294. Dns: server.GetDNS(),
  295. }
  296. return &response, nil
  297. }
  298. func (s *VPNService) Init(ctx context.Context, req *pb.VPNInitRequest) (*pb.VPNInitResponse, error) {
  299. logrus.Debugf("rpc call: vpn init")
  300. var proto string
  301. switch req.ProtoPref {
  302. case pb.VPNProto_TCP:
  303. proto = ovpm.TCPProto
  304. case pb.VPNProto_UDP:
  305. proto = ovpm.UDPProto
  306. case pb.VPNProto_NOPREF:
  307. proto = ovpm.UDPProto
  308. }
  309. perms, err := permset.FromContext(ctx)
  310. if err != nil {
  311. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  312. }
  313. if !perms.Contains(ovpm.InitVPNPerm) {
  314. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.InitVPNPerm is required for this operation.")
  315. }
  316. if err := ovpm.TheServer().Init(req.Hostname, req.Port, proto, req.IpBlock, req.Dns); err != nil {
  317. logrus.Errorf("server can not be created: %v", err)
  318. }
  319. return &pb.VPNInitResponse{}, nil
  320. }
  321. func (s *VPNService) Update(ctx context.Context, req *pb.VPNUpdateRequest) (*pb.VPNUpdateResponse, error) {
  322. logrus.Debugf("rpc call: vpn update")
  323. perms, err := permset.FromContext(ctx)
  324. if err != nil {
  325. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  326. }
  327. if !perms.Contains(ovpm.UpdateVPNPerm) {
  328. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.UpdateVPNPerm is required for this operation.")
  329. }
  330. if err := ovpm.TheServer().Update(req.IpBlock, req.Dns); err != nil {
  331. logrus.Errorf("server can not be updated: %v", err)
  332. }
  333. return &pb.VPNUpdateResponse{}, nil
  334. }
  335. func (s *VPNService) Restart(ctx context.Context, req *pb.VPNRestartRequest) (*pb.VPNRestartResponse, error) {
  336. logrus.Debugf("rpc call: vpn restart")
  337. perms, err := permset.FromContext(ctx)
  338. if err != nil {
  339. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  340. }
  341. if !perms.Contains(ovpm.RestartVPNPerm) {
  342. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.UpdateVPNPerm is required for this operation.")
  343. }
  344. ovpm.TheServer().RestartVPNProc()
  345. return &pb.VPNRestartResponse{}, nil
  346. }
  347. type NetworkService struct{}
  348. func (s *NetworkService) List(ctx context.Context, req *pb.NetworkListRequest) (*pb.NetworkListResponse, error) {
  349. logrus.Debug("rpc call: network list")
  350. var nt []*pb.Network
  351. perms, err := permset.FromContext(ctx)
  352. if err != nil {
  353. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  354. }
  355. if !perms.Contains(ovpm.ListNetworksPerm) {
  356. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.ListNetworksPerm is required for this operation.")
  357. }
  358. networks := ovpm.GetAllNetworks()
  359. for _, network := range networks {
  360. nt = append(nt, &pb.Network{
  361. Name: network.GetName(),
  362. Cidr: network.GetCIDR(),
  363. Type: network.GetType().String(),
  364. CreatedAt: network.GetCreatedAt(),
  365. AssociatedUsernames: network.GetAssociatedUsernames(),
  366. Via: network.GetVia(),
  367. })
  368. }
  369. return &pb.NetworkListResponse{Networks: nt}, nil
  370. }
  371. func (s *NetworkService) Create(ctx context.Context, req *pb.NetworkCreateRequest) (*pb.NetworkCreateResponse, error) {
  372. logrus.Debugf("rpc call: network create: %s", req.Name)
  373. perms, err := permset.FromContext(ctx)
  374. if err != nil {
  375. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  376. }
  377. if !perms.Contains(ovpm.CreateNetworkPerm) {
  378. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.CreateNetworkPerm is required for this operation.")
  379. }
  380. network, err := ovpm.CreateNewNetwork(req.Name, req.Cidr, ovpm.NetworkTypeFromString(req.Type), req.Via)
  381. if err != nil {
  382. return nil, err
  383. }
  384. n := pb.Network{
  385. Name: network.GetName(),
  386. Cidr: network.GetCIDR(),
  387. Type: network.GetType().String(),
  388. CreatedAt: network.GetCreatedAt(),
  389. AssociatedUsernames: network.GetAssociatedUsernames(),
  390. Via: network.GetVia(),
  391. }
  392. return &pb.NetworkCreateResponse{Network: &n}, nil
  393. }
  394. func (s *NetworkService) Delete(ctx context.Context, req *pb.NetworkDeleteRequest) (*pb.NetworkDeleteResponse, error) {
  395. logrus.Debugf("rpc call: network delete: %s", req.Name)
  396. perms, err := permset.FromContext(ctx)
  397. if err != nil {
  398. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  399. }
  400. if !perms.Contains(ovpm.DeleteNetworkPerm) {
  401. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.DeleteNetworkPerm is required for this operation.")
  402. }
  403. network, err := ovpm.GetNetwork(req.Name)
  404. if err != nil {
  405. return nil, err
  406. }
  407. err = network.Delete()
  408. if err != nil {
  409. return nil, err
  410. }
  411. n := pb.Network{
  412. Name: network.GetName(),
  413. Cidr: network.GetCIDR(),
  414. Type: network.GetType().String(),
  415. CreatedAt: network.GetCreatedAt(),
  416. AssociatedUsernames: network.GetAssociatedUsernames(),
  417. Via: network.GetVia(),
  418. }
  419. return &pb.NetworkDeleteResponse{Network: &n}, nil
  420. }
  421. func (s *NetworkService) GetAllTypes(ctx context.Context, req *pb.NetworkGetAllTypesRequest) (*pb.NetworkGetAllTypesResponse, error) {
  422. logrus.Debugf("rpc call: network get-types")
  423. var networkTypes []*pb.NetworkType
  424. perms, err := permset.FromContext(ctx)
  425. if err != nil {
  426. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  427. }
  428. if !perms.Contains(ovpm.GetNetworkTypesPerm) {
  429. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.GetNetworkTypesPerm is required for this operation.")
  430. }
  431. for _, nt := range ovpm.GetAllNetworkTypes() {
  432. if nt == ovpm.UNDEFINEDNET {
  433. continue
  434. }
  435. networkTypes = append(networkTypes, &pb.NetworkType{Type: nt.String(), Description: nt.Description()})
  436. }
  437. return &pb.NetworkGetAllTypesResponse{Types: networkTypes}, nil
  438. }
  439. func (s *NetworkService) GetAssociatedUsers(ctx context.Context, req *pb.NetworkGetAssociatedUsersRequest) (*pb.NetworkGetAssociatedUsersResponse, error) {
  440. logrus.Debugf("rpc call: network get-associated-users")
  441. perms, err := permset.FromContext(ctx)
  442. if err != nil {
  443. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  444. }
  445. if !perms.Contains(ovpm.GetNetworkAssociatedUsersPerm) {
  446. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.GetNetworkAssociatedUsersPerm is required for this operation.")
  447. }
  448. network, err := ovpm.GetNetwork(req.Name)
  449. if err != nil {
  450. return nil, err
  451. }
  452. usernames := network.GetAssociatedUsernames()
  453. return &pb.NetworkGetAssociatedUsersResponse{Usernames: usernames}, nil
  454. }
  455. func (s *NetworkService) Associate(ctx context.Context, req *pb.NetworkAssociateRequest) (*pb.NetworkAssociateResponse, error) {
  456. logrus.Debugf("rpc call: network associate")
  457. perms, err := permset.FromContext(ctx)
  458. if err != nil {
  459. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  460. }
  461. if !perms.Contains(ovpm.AssociateNetworkUserPerm) {
  462. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.AssociateNetworkUserPerm is required for this operation.")
  463. }
  464. network, err := ovpm.GetNetwork(req.Name)
  465. if err != nil {
  466. return nil, err
  467. }
  468. err = network.Associate(req.Username)
  469. if err != nil {
  470. return nil, err
  471. }
  472. return &pb.NetworkAssociateResponse{}, nil
  473. }
  474. func (s *NetworkService) Dissociate(ctx context.Context, req *pb.NetworkDissociateRequest) (*pb.NetworkDissociateResponse, error) {
  475. logrus.Debugf("rpc call: network dissociate")
  476. perms, err := permset.FromContext(ctx)
  477. if err != nil {
  478. return nil, grpc.Errorf(codes.Unauthenticated, "Can't get permset from context")
  479. }
  480. if !perms.Contains(ovpm.DissociateNetworkUserPerm) {
  481. return nil, grpc.Errorf(codes.PermissionDenied, "ovpm.DissociateNetworkUserPerm is required for this operation.")
  482. }
  483. network, err := ovpm.GetNetwork(req.Name)
  484. if err != nil {
  485. return nil, err
  486. }
  487. err = network.Dissociate(req.Username)
  488. if err != nil {
  489. return nil, err
  490. }
  491. return &pb.NetworkDissociateResponse{}, nil
  492. }
  493. // NewRPCServer returns a new gRPC server.
  494. func NewRPCServer() *grpc.Server {
  495. var opts []grpc.ServerOption
  496. opts = append(opts, grpc.UnaryInterceptor(AuthUnaryInterceptor))
  497. s := grpc.NewServer(opts...)
  498. //s := grpc.NewServer()
  499. pb.RegisterUserServiceServer(s, &UserService{})
  500. pb.RegisterVPNServiceServer(s, &VPNService{})
  501. pb.RegisterNetworkServiceServer(s, &NetworkService{})
  502. pb.RegisterAuthServiceServer(s, &AuthService{})
  503. return s
  504. }