Files
org.ccalm.jwt/update_password.py
2024-12-25 17:24:24 +05:00

111 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import psycopg2
import re
import yaml
def generate_password(length=8):
# Определяем возможные символы для разных категорий
lower_case = string.ascii_lowercase
upper_case = string.ascii_uppercase
digits = string.digits
special_characters = string.punctuation
# Гарантируем, что в пароле будет хотя бы один символ каждого типа
password = [
secrets.choice(lower_case), # строчная буква
secrets.choice(upper_case), # заглавная буква
secrets.choice(digits), # цифра
secrets.choice(special_characters) # спецсимвол
]
# Заполняем оставшиеся символы случайными из всех категорий
all_characters = lower_case + upper_case + digits + special_characters
password += [secrets.choice(all_characters) for _ in range(length - 4)]
# Перемешиваем полученные символы
secrets.SystemRandom().shuffle(password)
# Собираем строку из символов и возвращаем
return ''.join(password)
# Функция для чтения конфигурации из YAML файла
def get_configurations(properties_file):
with open(properties_file, 'r') as file:
config = yaml.safe_load(file) # Чтение YAML файла
# Извлекаем данные из конфигурации
db_url = config.get('spring', {}).get('datasource', {}).get('url', '')
db_user = config.get('spring', {}).get('datasource', {}).get('username', '')
current_password = config.get('spring', {}).get('datasource', {}).get('password', '')
# Разбираем URL для получения host, port, и dbname
match = re.match(r'jdbc:postgresql://([^:]+):(\d+)/([^?]+)', db_url)
if match:
db_host = match.group(1)
db_port = match.group(2)
db_name = match.group(3)
else:
raise ValueError("Database URL is invalid in the properties file.")
return db_host, db_port, db_name, db_user, current_password
# Функция для обновления пароля в файле конфигурации
def update_password_in_file(properties_file, current_password, new_password):
with open(properties_file, 'r') as file:
content = file.read()
# Заменяем старый пароль на новый
updated_content = re.sub(rf'spring.datasource.password={current_password}', f'spring.datasource.password={new_password}', content)
with open(properties_file, 'w') as file:
file.write(updated_content)
# Основная функция для смены пароля в PostgreSQL
def change_postgresql_password(db_host, db_port, db_name, db_user, current_password, new_password):
try:
# Подключаемся к PostgreSQL с использованием старого пароля
conn = psycopg2.connect(
dbname=db_name,
user=db_user,
password=current_password,
host=db_host,
port=db_port
)
conn.autocommit = True
# Создаем курсор для выполнения SQL-запроса
cursor = conn.cursor()
# Запрос для изменения пароля пользователя
cursor.execute(f"ALTER USER {db_user} WITH PASSWORD '{new_password}';")
cursor.close()
conn.close()
print(f"Password for user {db_user} successfully changed.")
except Exception as e:
print(f"Error changing password in PostgreSQL: {e}")
return False
return True
# Главная логика скрипта
def main():
# Путь к файлу конфигурации Spring Boot
properties_file = "application.yml"
# Получаем данные из файла конфигурации
db_host, db_port, db_name, db_user, current_password = get_configurations(properties_file)
# Новый пароль
new_password = generate_password() # Укажите новый пароль здесь
# Меняем пароль в PostgreSQL
if change_postgresql_password(db_host, db_port, db_name, db_user, current_password, new_password):
# Обновляем пароль в файле конфигурации
update_password_in_file(properties_file, current_password, new_password)
print(f"Password updated successfully in {properties_file}.")
else:
print("Password change failed.")
if __name__ == "__main__":
main()