oauth.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package admin
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/lejianwen/rustdesk-api/v2/global"
  5. "github.com/lejianwen/rustdesk-api/v2/http/request/admin"
  6. adminReq "github.com/lejianwen/rustdesk-api/v2/http/request/admin"
  7. "github.com/lejianwen/rustdesk-api/v2/http/response"
  8. "github.com/lejianwen/rustdesk-api/v2/service"
  9. "strconv"
  10. )
  11. type Oauth struct {
  12. }
  13. // Info
  14. func (o *Oauth) Info(c *gin.Context) {
  15. code := c.Query("code")
  16. if code == "" {
  17. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  18. return
  19. }
  20. v := service.AllService.OauthService.GetOauthCache(code)
  21. if v == nil {
  22. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  23. return
  24. }
  25. response.Success(c, v)
  26. }
  27. func (o *Oauth) ToBind(c *gin.Context) {
  28. f := &adminReq.BindOauthForm{}
  29. err := c.ShouldBindJSON(f)
  30. if err != nil {
  31. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  32. return
  33. }
  34. u := service.AllService.UserService.CurUser(c)
  35. utr := service.AllService.UserService.UserThirdInfo(u.Id, f.Op)
  36. if utr.Id > 0 {
  37. response.Fail(c, 101, response.TranslateMsg(c, "OauthHasBindOtherUser"))
  38. return
  39. }
  40. err, state, verifier, nonce, url := service.AllService.OauthService.BeginAuth(f.Op)
  41. if err != nil {
  42. response.Error(c, response.TranslateMsg(c, err.Error()))
  43. return
  44. }
  45. service.AllService.OauthService.SetOauthCache(state, &service.OauthCacheItem{
  46. Action: service.OauthActionTypeBind,
  47. Op: f.Op,
  48. UserId: u.Id,
  49. Verifier: verifier,
  50. Nonce: nonce,
  51. }, 5*60)
  52. response.Success(c, gin.H{
  53. "code": state,
  54. "url": url,
  55. })
  56. }
  57. // Confirm 确认授权登录
  58. func (o *Oauth) Confirm(c *gin.Context) {
  59. j := &adminReq.OauthConfirmForm{}
  60. err := c.ShouldBindJSON(j)
  61. if err != nil {
  62. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  63. return
  64. }
  65. if j.Code == "" {
  66. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  67. return
  68. }
  69. v := service.AllService.OauthService.GetOauthCache(j.Code)
  70. if v == nil {
  71. response.Fail(c, 101, response.TranslateMsg(c, "OauthExpired"))
  72. return
  73. }
  74. u := service.AllService.UserService.CurUser(c)
  75. v.UserId = u.Id
  76. service.AllService.OauthService.SetOauthCache(j.Code, v, 0)
  77. response.Success(c, v)
  78. }
  79. func (o *Oauth) BindConfirm(c *gin.Context) {
  80. j := &adminReq.OauthConfirmForm{}
  81. err := c.ShouldBindJSON(j)
  82. if err != nil {
  83. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  84. return
  85. }
  86. if j.Code == "" {
  87. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  88. return
  89. }
  90. oauthService := service.AllService.OauthService
  91. oauthCache := oauthService.GetOauthCache(j.Code)
  92. if oauthCache == nil {
  93. response.Fail(c, 101, response.TranslateMsg(c, "OauthExpired"))
  94. return
  95. }
  96. oauthUser := oauthCache.ToOauthUser()
  97. user := service.AllService.UserService.CurUser(c)
  98. err = oauthService.BindOauthUser(user.Id, oauthUser, oauthCache.Op)
  99. if err != nil {
  100. response.Fail(c, 101, response.TranslateMsg(c, "BindFail"))
  101. return
  102. }
  103. oauthCache.UserId = user.Id
  104. oauthService.SetOauthCache(j.Code, oauthCache, 0)
  105. response.Success(c, oauthCache)
  106. }
  107. func (o *Oauth) Unbind(c *gin.Context) {
  108. f := &adminReq.UnBindOauthForm{}
  109. err := c.ShouldBindJSON(f)
  110. if err != nil {
  111. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  112. return
  113. }
  114. u := service.AllService.UserService.CurUser(c)
  115. utr := service.AllService.UserService.UserThirdInfo(u.Id, f.Op)
  116. if utr.Id == 0 {
  117. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  118. return
  119. }
  120. err = service.AllService.OauthService.UnBindOauthUser(u.Id, f.Op)
  121. if err != nil {
  122. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  123. return
  124. }
  125. response.Success(c, nil)
  126. }
  127. // Detail Oauth
  128. // @Tags Oauth
  129. // @Summary Oauth详情
  130. // @Description Oauth详情
  131. // @Accept json
  132. // @Produce json
  133. // @Param id path int true "ID"
  134. // @Success 200 {object} response.Response{data=model.Oauth}
  135. // @Failure 500 {object} response.Response
  136. // @Router /admin/oauth/detail/{id} [get]
  137. // @Security token
  138. func (o *Oauth) Detail(c *gin.Context) {
  139. id := c.Param("id")
  140. iid, _ := strconv.Atoi(id)
  141. u := service.AllService.OauthService.InfoById(uint(iid))
  142. if u.Id > 0 {
  143. response.Success(c, u)
  144. return
  145. }
  146. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  147. return
  148. }
  149. // Create 创建Oauth
  150. // @Tags Oauth
  151. // @Summary 创建Oauth
  152. // @Description 创建Oauth
  153. // @Accept json
  154. // @Produce json
  155. // @Param body body admin.OauthForm true "Oauth信息"
  156. // @Success 200 {object} response.Response{data=model.Oauth}
  157. // @Failure 500 {object} response.Response
  158. // @Router /admin/oauth/create [post]
  159. // @Security token
  160. func (o *Oauth) Create(c *gin.Context) {
  161. f := &admin.OauthForm{}
  162. if err := c.ShouldBindJSON(f); err != nil {
  163. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  164. return
  165. }
  166. errList := global.Validator.ValidStruct(c, f)
  167. if len(errList) > 0 {
  168. response.Fail(c, 101, errList[0])
  169. return
  170. }
  171. u := f.ToOauth()
  172. err := u.FormatOauthInfo()
  173. if err != nil {
  174. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  175. return
  176. }
  177. ex := service.AllService.OauthService.InfoByOp(u.Op)
  178. if ex.Id > 0 {
  179. response.Fail(c, 101, response.TranslateMsg(c, "ItemExists"))
  180. return
  181. }
  182. err = service.AllService.OauthService.Create(u)
  183. if err != nil {
  184. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  185. return
  186. }
  187. response.Success(c, nil)
  188. }
  189. // List 列表
  190. // @Tags Oauth
  191. // @Summary Oauth列表
  192. // @Description Oauth列表
  193. // @Accept json
  194. // @Produce json
  195. // @Param page query int false "页码"
  196. // @Param page_size query int false "页大小"
  197. // @Success 200 {object} response.Response{data=model.OauthList}
  198. // @Failure 500 {object} response.Response
  199. // @Router /admin/oauth/list [get]
  200. // @Security token
  201. func (o *Oauth) List(c *gin.Context) {
  202. query := &admin.PageQuery{}
  203. if err := c.ShouldBindQuery(query); err != nil {
  204. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  205. return
  206. }
  207. res := service.AllService.OauthService.List(query.Page, query.PageSize, nil)
  208. response.Success(c, res)
  209. }
  210. // Update 编辑
  211. // @Tags Oauth
  212. // @Summary Oauth编辑
  213. // @Description Oauth编辑
  214. // @Accept json
  215. // @Produce json
  216. // @Param body body admin.OauthForm true "Oauth信息"
  217. // @Success 200 {object} response.Response{data=model.OauthList}
  218. // @Failure 500 {object} response.Response
  219. // @Router /admin/oauth/update [post]
  220. // @Security token
  221. func (o *Oauth) Update(c *gin.Context) {
  222. f := &admin.OauthForm{}
  223. if err := c.ShouldBindJSON(f); err != nil {
  224. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  225. return
  226. }
  227. if f.Id == 0 {
  228. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  229. return
  230. }
  231. errList := global.Validator.ValidStruct(c, f)
  232. if len(errList) > 0 {
  233. response.Fail(c, 101, errList[0])
  234. return
  235. }
  236. u := f.ToOauth()
  237. err := service.AllService.OauthService.Update(u)
  238. if err != nil {
  239. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  240. return
  241. }
  242. response.Success(c, nil)
  243. }
  244. // Delete 删除
  245. // @Tags Oauth
  246. // @Summary Oauth删除
  247. // @Description Oauth删除
  248. // @Accept json
  249. // @Produce json
  250. // @Param body body admin.OauthForm true "Oauth信息"
  251. // @Success 200 {object} response.Response
  252. // @Failure 500 {object} response.Response
  253. // @Router /admin/oauth/delete [post]
  254. // @Security token
  255. func (o *Oauth) Delete(c *gin.Context) {
  256. f := &admin.OauthForm{}
  257. if err := c.ShouldBindJSON(f); err != nil {
  258. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  259. return
  260. }
  261. id := f.Id
  262. errList := global.Validator.ValidVar(c, id, "required,gt=0")
  263. if len(errList) > 0 {
  264. response.Fail(c, 101, errList[0])
  265. return
  266. }
  267. u := service.AllService.OauthService.InfoById(f.Id)
  268. if u.Id > 0 {
  269. err := service.AllService.OauthService.Delete(u)
  270. if err == nil {
  271. response.Success(c, nil)
  272. return
  273. }
  274. response.Fail(c, 101, err.Error())
  275. return
  276. }
  277. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  278. }