rpc.go 19 KB

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