Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

145 строки
4.2 KiB

  1. from fastapi import APIRouter
  2. from fastapi.param_functions import Depends
  3. from fastapi.security import OAuth2PasswordRequestForm
  4. from fastapi_login.exceptions import InvalidCredentialsException
  5. import xml.dom.minidom
  6. from binascii import unhexlify
  7. from ldap3.protocol.formatters.formatters import format_sid
  8. import argparse
  9. import json
  10. import ldap3
  11. import logging
  12. import os
  13. import ssl
  14. import sys
  15. import hashlib
  16. import binascii
  17. from datetime import datetime, timedelta
  18. import subprocess
  19. #from db import get_session
  20. from core.actions import get_user_by_name
  21. from core.security import manager
  22. from core.ldap import LDAPConsole
  23. from models.httpresponse import httpResponse400, httpResponse200, httpResponse500
  24. from models.mnuser import mnuser, post_mnuser
  25. router = APIRouter(
  26. prefix="/majornet"
  27. )
  28. def cast_to_dict(cid):
  29. out = {}
  30. for key, value in cid.items():
  31. if type(value) == bytes:
  32. out[key] = str(value)
  33. elif type(value) == list:
  34. if len(value) == 1:
  35. value = value[0]
  36. if type(value) == bytes:
  37. out[key] = str(value)
  38. elif type(value) == datetime:
  39. out[key] = value.strftime('%Y-%m-%d %T')
  40. elif type(value) == timedelta:
  41. # Output format to change
  42. out[key] = value.seconds
  43. else:
  44. out[key] = value
  45. else:
  46. newlist = []
  47. for element in value:
  48. if type(element) == bytes:
  49. newlist.append(str(element))
  50. elif type(element) == datetime:
  51. newlist.append(element.strftime('%Y-%m-%d %T'))
  52. elif type(element) == timedelta:
  53. # Output format to change
  54. newlist.append(element.seconds)
  55. out[key] = newlist
  56. elif type(value) == datetime:
  57. out[key] = value.strftime('%Y-%m-%d %T')
  58. elif type(value) == timedelta:
  59. # Output format to change
  60. out[key] = value.seconds
  61. else:
  62. out[key] = value
  63. return out
  64. def dict_get_paths(d):
  65. paths = []
  66. for key in d.keys():
  67. if type(d[key]) == dict:
  68. paths = [[key]+p for p in dict_get_paths(d[key])]
  69. else:
  70. paths.append([key])
  71. return paths
  72. def dict_path_access(d, path):
  73. for key in path:
  74. if key in d.keys():
  75. d = d[key]
  76. else:
  77. return None
  78. return d
  79. data = {}
  80. import os
  81. USE_LDAP = os.getenv("FASTAPI_LDAP_ENABLED", "false").lower() == "true"
  82. try:
  83. from ..core.ldap import LDAPConsole
  84. except Exception:
  85. LDAPConsole = None
  86. lc = LDAPConsole(debug=True) if (USE_LDAP and LDAPConsole) else None
  87. @router.get("/users/",tags=["MajorNet"], responses={200: {"model": httpResponse200}, 400: {"model": httpResponse400}, 500: {"model": httpResponse500}})
  88. async def get_majornet_users(current_user= Depends(manager)):
  89. response = lc.queryallusers("ou=users", attributes=['displayName','mail','uid'])
  90. data = {}
  91. for cn in response:
  92. path = cn.split(',')[::-1]
  93. tmp = data
  94. for key in path[:-1]:
  95. if key in tmp.keys():
  96. tmp = tmp[key]
  97. else:
  98. tmp[key] = {}
  99. tmp = tmp[key]
  100. tmp[path[-1]] = cast_to_dict(response[cn])
  101. json_data = json.dumps(data, indent=4)
  102. return data
  103. #,current_user= Depends(manager)
  104. #,current_user: Depends(manager)
  105. # response_model=post_mnuser,
  106. @router.post("/users/add_user/", response_model=post_mnuser, tags=["MajorNet"])
  107. async def majornet_add_user(mnuser:str, mnpasswd:str, mndisplayname:str, mnmail="", mnprofile= "default",current_user= Depends(manager) ):
  108. #print (current_user.username)
  109. #print (mnuser+" "+mnpasswd+" "+mndisplayname+" "+mnprofile)
  110. proc = subprocess.Popen(['perl', '/var/opt/FastAPI/addusr.pl', mnuser, mnpasswd , mndisplayname, mnmail ], stdout=subprocess.PIPE)
  111. stdout_value = proc.communicate()[0]
  112. stdout_value=stdout_value.decode('UTF-8')
  113. response = {"return_code": stdout_value.split(';')[0], "return_str" : stdout_value.split(';')[1] }
  114. return response