users.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. import logging
  2. from typing import Optional
  3. from open_webui.models.auths import Auths
  4. from open_webui.models.chats import Chats
  5. from open_webui.models.users import (
  6. UserModel,
  7. UserRoleUpdateForm,
  8. Users,
  9. UserSettings,
  10. UserUpdateForm,
  11. )
  12. from open_webui.constants import ERROR_MESSAGES
  13. from open_webui.env import SRC_LOG_LEVELS
  14. from fastapi import APIRouter, Depends, HTTPException, Request, status
  15. from pydantic import BaseModel
  16. from open_webui.utils.auth import get_admin_user, get_password_hash, get_verified_user
  17. log = logging.getLogger(__name__)
  18. log.setLevel(SRC_LOG_LEVELS["MODELS"])
  19. router = APIRouter()
  20. ############################
  21. # GetUsers
  22. ############################
  23. @router.get("/", response_model=list[UserModel])
  24. async def get_users(skip: int = 0, limit: int = 50, user=Depends(get_admin_user)):
  25. return Users.get_users(skip, limit)
  26. ############################
  27. # User Groups
  28. ############################
  29. @router.get("/groups")
  30. async def get_user_groups(user=Depends(get_verified_user)):
  31. return Users.get_user_groups(user.id)
  32. ############################
  33. # User Permissions
  34. ############################
  35. @router.get("/permissions")
  36. async def get_user_permissisions(user=Depends(get_verified_user)):
  37. return Users.get_user_groups(user.id)
  38. ############################
  39. # User Default Permissions
  40. ############################
  41. class WorkspacePermissions(BaseModel):
  42. models: bool
  43. knowledge: bool
  44. prompts: bool
  45. tools: bool
  46. class ChatPermissions(BaseModel):
  47. file_upload: bool
  48. delete: bool
  49. edit: bool
  50. temporary: bool
  51. class UserPermissions(BaseModel):
  52. workspace: WorkspacePermissions
  53. chat: ChatPermissions
  54. @router.get("/default/permissions")
  55. async def get_user_permissions(request: Request, user=Depends(get_admin_user)):
  56. return request.app.state.config.USER_PERMISSIONS
  57. @router.post("/default/permissions")
  58. async def update_user_permissions(
  59. request: Request, form_data: UserPermissions, user=Depends(get_admin_user)
  60. ):
  61. request.app.state.config.USER_PERMISSIONS = form_data.model_dump()
  62. return request.app.state.config.USER_PERMISSIONS
  63. ############################
  64. # UpdateUserRole
  65. ############################
  66. @router.post("/update/role", response_model=Optional[UserModel])
  67. async def update_user_role(form_data: UserRoleUpdateForm, user=Depends(get_admin_user)):
  68. if user.id != form_data.id and form_data.id != Users.get_first_user().id:
  69. return Users.update_user_role_by_id(form_data.id, form_data.role)
  70. raise HTTPException(
  71. status_code=status.HTTP_403_FORBIDDEN,
  72. detail=ERROR_MESSAGES.ACTION_PROHIBITED,
  73. )
  74. ############################
  75. # GetUserSettingsBySessionUser
  76. ############################
  77. @router.get("/user/settings", response_model=Optional[UserSettings])
  78. async def get_user_settings_by_session_user(user=Depends(get_verified_user)):
  79. user = Users.get_user_by_id(user.id)
  80. if user:
  81. return user.settings
  82. else:
  83. raise HTTPException(
  84. status_code=status.HTTP_400_BAD_REQUEST,
  85. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  86. )
  87. ############################
  88. # UpdateUserSettingsBySessionUser
  89. ############################
  90. @router.post("/user/settings/update", response_model=UserSettings)
  91. async def update_user_settings_by_session_user(
  92. form_data: UserSettings, user=Depends(get_verified_user)
  93. ):
  94. user = Users.update_user_by_id(user.id, {"settings": form_data.model_dump()})
  95. if user:
  96. return user.settings
  97. else:
  98. raise HTTPException(
  99. status_code=status.HTTP_400_BAD_REQUEST,
  100. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  101. )
  102. ############################
  103. # GetUserInfoBySessionUser
  104. ############################
  105. @router.get("/user/info", response_model=Optional[dict])
  106. async def get_user_info_by_session_user(user=Depends(get_verified_user)):
  107. user = Users.get_user_by_id(user.id)
  108. if user:
  109. return user.info
  110. else:
  111. raise HTTPException(
  112. status_code=status.HTTP_400_BAD_REQUEST,
  113. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  114. )
  115. ############################
  116. # UpdateUserInfoBySessionUser
  117. ############################
  118. @router.post("/user/info/update", response_model=Optional[dict])
  119. async def update_user_info_by_session_user(
  120. form_data: dict, user=Depends(get_verified_user)
  121. ):
  122. user = Users.get_user_by_id(user.id)
  123. if user:
  124. if user.info is None:
  125. user.info = {}
  126. user = Users.update_user_by_id(user.id, {"info": {**user.info, **form_data}})
  127. if user:
  128. return user.info
  129. else:
  130. raise HTTPException(
  131. status_code=status.HTTP_400_BAD_REQUEST,
  132. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  133. )
  134. else:
  135. raise HTTPException(
  136. status_code=status.HTTP_400_BAD_REQUEST,
  137. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  138. )
  139. ############################
  140. # GetUserById
  141. ############################
  142. class UserResponse(BaseModel):
  143. name: str
  144. profile_image_url: str
  145. @router.get("/{user_id}", response_model=UserResponse)
  146. async def get_user_by_id(user_id: str, user=Depends(get_verified_user)):
  147. # Check if user_id is a shared chat
  148. # If it is, get the user_id from the chat
  149. if user_id.startswith("shared-"):
  150. chat_id = user_id.replace("shared-", "")
  151. chat = Chats.get_chat_by_id(chat_id)
  152. if chat:
  153. user_id = chat.user_id
  154. else:
  155. raise HTTPException(
  156. status_code=status.HTTP_400_BAD_REQUEST,
  157. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  158. )
  159. user = Users.get_user_by_id(user_id)
  160. if user:
  161. return UserResponse(name=user.name, profile_image_url=user.profile_image_url)
  162. else:
  163. raise HTTPException(
  164. status_code=status.HTTP_400_BAD_REQUEST,
  165. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  166. )
  167. ############################
  168. # UpdateUserById
  169. ############################
  170. @router.post("/{user_id}/update", response_model=Optional[UserModel])
  171. async def update_user_by_id(
  172. user_id: str,
  173. form_data: UserUpdateForm,
  174. session_user=Depends(get_admin_user),
  175. ):
  176. user = Users.get_user_by_id(user_id)
  177. if user:
  178. if form_data.email.lower() != user.email:
  179. email_user = Users.get_user_by_email(form_data.email.lower())
  180. if email_user:
  181. raise HTTPException(
  182. status_code=status.HTTP_400_BAD_REQUEST,
  183. detail=ERROR_MESSAGES.EMAIL_TAKEN,
  184. )
  185. if form_data.password:
  186. hashed = get_password_hash(form_data.password)
  187. log.debug(f"hashed: {hashed}")
  188. Auths.update_user_password_by_id(user_id, hashed)
  189. Auths.update_email_by_id(user_id, form_data.email.lower())
  190. updated_user = Users.update_user_by_id(
  191. user_id,
  192. {
  193. "name": form_data.name,
  194. "email": form_data.email.lower(),
  195. "profile_image_url": form_data.profile_image_url,
  196. },
  197. )
  198. if updated_user:
  199. return updated_user
  200. raise HTTPException(
  201. status_code=status.HTTP_400_BAD_REQUEST,
  202. detail=ERROR_MESSAGES.DEFAULT(),
  203. )
  204. raise HTTPException(
  205. status_code=status.HTTP_400_BAD_REQUEST,
  206. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  207. )
  208. ############################
  209. # DeleteUserById
  210. ############################
  211. @router.delete("/{user_id}", response_model=bool)
  212. async def delete_user_by_id(user_id: str, user=Depends(get_admin_user)):
  213. if user.id != user_id:
  214. result = Auths.delete_auth_by_id(user_id)
  215. if result:
  216. return True
  217. raise HTTPException(
  218. status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
  219. detail=ERROR_MESSAGES.DELETE_USER_ERROR,
  220. )
  221. raise HTTPException(
  222. status_code=status.HTTP_403_FORBIDDEN,
  223. detail=ERROR_MESSAGES.ACTION_PROHIBITED,
  224. )