1
0

rpc.go 19 KB

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