デバイスIDをデバイスインスタンスパスに変更

ワンタイムパスワードが消去されないバグを修正
デバイス登録の際USBデバイスではなく入力デバイスの一覧を出力するように
自前のデバイスは0番として処理するように
This commit is contained in:
suti7yk5032 2024-09-07 13:40:13 +09:00
parent 61e01ae055
commit 7e35bd6089
3 changed files with 68 additions and 45 deletions

View file

@ -84,8 +84,8 @@ class DL():
cursor = self.db.cursor() cursor = self.db.cursor()
self.pc_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] self.pc_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
self.keyboard_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] self.keyboard_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
self.mouse_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] self.mouse_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
self.preset_games = self.server_config["bot"]["preset_games"] self.preset_games = self.server_config["bot"]["preset_games"]
self.debug = self.server_config["bot"]["debug"] self.debug = self.server_config["bot"]["debug"]
@ -110,7 +110,7 @@ class DL():
find_keyboard_list_table = cursor.fetchall() find_keyboard_list_table = cursor.fetchall()
print(find_keyboard_list_table) print(find_keyboard_list_table)
if find_keyboard_list_table[0][0] == False: if find_keyboard_list_table[0][0] == False:
cursor.execute("CREATE TABLE keyboard_list (keyboard_number INTEGER NOT NULL, using_member_id INTEGER, device_id TEXT, device_name TEXT, detail TEXT, PRIMARY KEY (keyboard_number), FOREIGN KEY (using_member_id) REFERENCES club_member(member_id))") cursor.execute("CREATE TABLE keyboard_list (keyboard_number INTEGER NOT NULL, using_member_id INTEGER, device_instance_path TEXT, device_name TEXT, detail TEXT, PRIMARY KEY (keyboard_number), FOREIGN KEY (using_member_id) REFERENCES club_member(member_id))")
for i in self.keyboard_list: for i in self.keyboard_list:
print(i) print(i)
cursor.execute("INSERT INTO keyboard_list (keyboard_number) VALUES (%s)", (i,)) cursor.execute("INSERT INTO keyboard_list (keyboard_number) VALUES (%s)", (i,))
@ -120,7 +120,7 @@ class DL():
find_mouse_list_table = cursor.fetchall() find_mouse_list_table = cursor.fetchall()
print(find_mouse_list_table) print(find_mouse_list_table)
if find_mouse_list_table[0][0] == False: if find_mouse_list_table[0][0] == False:
cursor.execute("CREATE TABLE mouse_list (mouse_number INTEGER NOT NULL, using_member_id INTEGER, device_id TEXT, device_name TEXT, detail TEXT, PRIMARY KEY (mouse_number), FOREIGN KEY (using_member_id) REFERENCES club_member(member_id))") cursor.execute("CREATE TABLE mouse_list (mouse_number INTEGER NOT NULL, using_member_id INTEGER, device_instance_path TEXT, device_name TEXT, detail TEXT, PRIMARY KEY (mouse_number), FOREIGN KEY (using_member_id) REFERENCES club_member(member_id))")
for i in self.mouse_list: for i in self.mouse_list:
print(i) print(i)
cursor.execute("INSERT INTO mouse_list (mouse_number) VALUES (%s)", (i,)) cursor.execute("INSERT INTO mouse_list (mouse_number) VALUES (%s)", (i,))

View file

@ -75,7 +75,7 @@ class Auth():
pc_info = cursor.fetchall() pc_info = cursor.fetchall()
if pc_info: if pc_info:
for device in device_list: for device in device_list:
cursor.execute("SELECT * FROM keyboard_list WHERE device_id = %s", (device["device_id"],)) cursor.execute("SELECT * FROM keyboard_list WHERE device_instance_path = %s", (device["device_instance_path"],))
keyboard_record = cursor.fetchall() keyboard_record = cursor.fetchall()
if keyboard_record: if keyboard_record:
keyboard_number = int(keyboard_record[0][0]) keyboard_number = int(keyboard_record[0][0])
@ -84,7 +84,7 @@ class Auth():
pass pass
for device in device_list: for device in device_list:
cursor.execute("SELECT * FROM mouse_list WHERE device_id = %s", (device["device_id"],)) cursor.execute("SELECT * FROM mouse_list WHERE device_instance_path = %s", (device["device_instance_path"],))
mouse_record = cursor.fetchall() mouse_record = cursor.fetchall()
if mouse_record: if mouse_record:
mouse_number = int(mouse_record[0][0]) mouse_number = int(mouse_record[0][0])
@ -116,14 +116,16 @@ class Auth():
def device_use_register(self, **kwargs): def device_use_register(self, **kwargs):
try: try:
pc_number = int(kwargs["pc_number"]) pc_number = int(kwargs["pc_number"])
if "keyboard_number" in kwargs: if kwargs["keyboard_number"] == "own":
keyboard_number = 0
else:
keyboard_number = int(kwargs["keyboard_number"]) keyboard_number = int(kwargs["keyboard_number"])
if kwargs["mouse_number"] == "own":
mouse_number = 0
else: else:
keyboard_number = None
if "mouse_number" in kwargs:
mouse_number = int(kwargs["mouse_number"]) mouse_number = int(kwargs["mouse_number"])
else:
mouse_number = None
cursor = self.db.cursor() cursor = self.db.cursor()
cursor.execute("SELECT * FROM pc_list WHERE pc_number = %s", (pc_number,)) cursor.execute("SELECT * FROM pc_list WHERE pc_number = %s", (pc_number,))
@ -135,9 +137,19 @@ class Auth():
cursor.execute("SELECT * FROM pc_usage_history WHERE member_id = %s AND pc_number = %s ORDER BY id DESC LIMIT 1", (pc_using_member_id, pc_number)) cursor.execute("SELECT * FROM pc_usage_history WHERE member_id = %s AND pc_number = %s ORDER BY id DESC LIMIT 1", (pc_using_member_id, pc_number))
pc_usage_history_record = cursor.fetchall() pc_usage_history_record = cursor.fetchall()
pc_usage_history_record_id = pc_usage_history_record[0][0] pc_usage_history_record_id = pc_usage_history_record[0][0]
cursor.execute("UPDATE pc_usage_history SET keyboard_number = %s, mouse_number = %s WHERE id = %s", (keyboard_number, mouse_number, pc_usage_history_record_id)) cursor.execute("UPDATE pc_usage_history SET keyboard_number = %s, mouse_number = %s WHERE id = %s", (keyboard_number, mouse_number, pc_usage_history_record_id))
if keyboard_number == 0:
pass
else:
cursor.execute("UPDATE keyboard_list SET using_member_id = %s WHERE keyboard_number = %s", (pc_using_member_id, keyboard_number)) cursor.execute("UPDATE keyboard_list SET using_member_id = %s WHERE keyboard_number = %s", (pc_using_member_id, keyboard_number))
if mouse_number == 0:
pass
else:
cursor.execute("UPDATE mouse_list SET using_member_id = %s WHERE mouse_number = %s", (pc_using_member_id, mouse_number)) cursor.execute("UPDATE mouse_list SET using_member_id = %s WHERE mouse_number = %s", (pc_using_member_id, mouse_number))
self.db.commit() self.db.commit()
return {"result": 0, "about": "ok"} return {"result": 0, "about": "ok"}
@ -153,7 +165,7 @@ class Auth():
cursor = self.db.cursor() cursor = self.db.cursor()
mode = kwargs["mode"] mode = kwargs["mode"]
number = kwargs["number"] number = kwargs["number"]
device_id = kwargs["device_id"] device_instance_path = kwargs["device_instance_path"]
device_name = kwargs["device_name"] device_name = kwargs["device_name"]
if mode == "keyboard": if mode == "keyboard":
@ -161,22 +173,22 @@ class Auth():
cursor.execute("SELECT * FROM keyboard_list WHERE keyboard_number = %s", (keyboard_number,)) cursor.execute("SELECT * FROM keyboard_list WHERE keyboard_number = %s", (keyboard_number,))
keyboard_record = cursor.fetchall() keyboard_record = cursor.fetchall()
if keyboard_record: if keyboard_record:
cursor.execute("UPDATE keyboard_list SET device_id = %s, device_name = %s WHERE keyboard_number = %s", (device_id, device_name, keyboard_number)) cursor.execute("UPDATE keyboard_list SET device_instance_path = %s, device_name = %s WHERE keyboard_number = %s", (device_instance_path, device_name, keyboard_number))
self.db.commit() self.db.commit()
return {"result": 0, "about": "ok"} return {"result": 0, "about": "ok"}
else: else:
cursor.execute("INSERT INTO keyboard_list (keyboard_number, device_id, device_name) VALUES (%s, %s, %s)", (keyboard_number, device_id, device_name)) cursor.execute("INSERT INTO keyboard_list (keyboard_number, device_instance_path, device_name) VALUES (%s, %s, %s)", (keyboard_number, device_instance_path, device_name))
return {"result": 0, "about": "ok"} return {"result": 0, "about": "ok"}
elif mode == "mouse": elif mode == "mouse":
mouse_number = int(kwargs["number"]) mouse_number = int(kwargs["number"])
cursor.execute("SELECT * FROM mouse_list WHERE mouse_number = %s", (mouse_number,)) cursor.execute("SELECT * FROM mouse_list WHERE mouse_number = %s", (mouse_number,))
mouse_record = cursor.fetchall() mouse_record = cursor.fetchall()
if mouse_record: if mouse_record:
cursor.execute("UPDATE mouse_list SET device_id = %s, device_name = %s WHERE mouse_number = %s", (device_id, device_name, mouse_number)) cursor.execute("UPDATE mouse_list SET device_instance_path = %s, device_name = %s WHERE mouse_number = %s", (device_instance_path, device_name, mouse_number))
self.db.commit() self.db.commit()
return {"result": 0, "about": "ok"} return {"result": 0, "about": "ok"}
else: else:
cursor.execute("INSERT INTO mouse_list (mouse_number, device_id, device_name) VALUES (%s, %s, %s)", (mouse_number, device_id, device_name)) cursor.execute("INSERT INTO mouse_list (mouse_number, device_instance_path, device_name) VALUES (%s, %s, %s)", (mouse_number, device_instance_path, device_name))
return {"result": 0, "about": "ok"} return {"result": 0, "about": "ok"}
except Exception as error: except Exception as error:
@ -324,7 +336,7 @@ def register():
pc_token = register_result["output_dict"]["pc_token"] pc_token = register_result["output_dict"]["pc_token"]
master_password = register_result["output_dict"]["master_password"] master_password = register_result["output_dict"]["master_password"]
master_password_hash = register_result["output_dict"]["master_password_hash"] master_password_hash = register_result["output_dict"]["master_password_hash"]
onetime_config["onetime"]["pcregister"] = None onetime_config["onetime"]["pc_register"] = None
with open(onetime_config_path, "w") as w: with open(onetime_config_path, "w") as w:
json.dump(onetime_config, w, indent=4) json.dump(onetime_config, w, indent=4)
return jsonify({'message': 'ok', 'pc_token': pc_token, 'master_password': master_password, 'master_password_hash': master_password_hash}), 200 return jsonify({'message': 'ok', 'pc_token': pc_token, 'master_password': master_password, 'master_password_hash': master_password_hash}), 200
@ -378,7 +390,7 @@ def device_register():
onetime_password = str(request.json.get('onetime')) onetime_password = str(request.json.get('onetime'))
mode = str(request.json.get('mode')) mode = str(request.json.get('mode'))
number = int(request.json.get('number')) number = int(request.json.get('number'))
device_id = str(request.json.get('device_id')) device_instance_path = str(request.json.get('device_instance_path'))
device_name = str(request.json.get('device_name')) device_name = str(request.json.get('device_name'))
if os.path.isfile(onetime_config_path): if os.path.isfile(onetime_config_path):
@ -388,18 +400,24 @@ def device_register():
if onetime_password == onetime_config["onetime"]["device_register"]: if onetime_password == onetime_config["onetime"]["device_register"]:
if mode == "keyboard": if mode == "keyboard":
print("キーボードの登録処理を開始...") print("キーボードの登録処理を開始...")
device_register = auth.device_register(mode="keyboard", number=number, device_id=device_id, device_name=device_name) device_register = auth.device_register(mode="keyboard", number=number, device_instance_path=device_instance_path, device_name=device_name)
if device_register["result"] == 0: if device_register["result"] == 0:
print(f"キーボード {number} 番の登録処理は成功しました.") print(f"キーボード {number} 番の登録処理は成功しました.")
onetime_config["onetime"]["device_register"] = None
with open(onetime_config_path, "w") as w:
json.dump(onetime_config, w, indent=4)
return jsonify({'message': 'ok'}), 200 return jsonify({'message': 'ok'}), 200
else: else:
print(f"キーボード {number} 番の登録処理は失敗しました.") print(f"キーボード {number} 番の登録処理は失敗しました.")
return jsonify({'message': 'error'}), 500 return jsonify({'message': 'error'}), 500
elif mode == "mouse": elif mode == "mouse":
print("マウスの登録処理を開始...") print("マウスの登録処理を開始...")
device_register = auth.device_register(mode="mouse", number=number, device_id=device_id, device_name=device_name) device_register = auth.device_register(mode="mouse", number=number, device_instance_path=device_instance_path, device_name=device_name)
if device_register["result"] == 0: if device_register["result"] == 0:
print(f"マウス {number} 番の登録処理は成功しました.") print(f"マウス {number} 番の登録処理は成功しました.")
onetime_config["onetime"]["device_register"] = None
with open(onetime_config_path, "w") as w:
json.dump(onetime_config, w, indent=4)
return jsonify({'message': 'ok'}), 200 return jsonify({'message': 'ok'}), 200
else: else:
print(f"マウス {number} 番の登録処理は失敗しました.") print(f"マウス {number} 番の登録処理は失敗しました.")

View file

@ -45,34 +45,36 @@ elif os.path.isfile(client_config_path):
with open(client_config_path, "r") as r: with open(client_config_path, "r") as r:
client_config = json.load(r) client_config = json.load(r)
def get_usb_devices(): def get_input_devices():
str_computer = "." str_computer = "."
obj_wmi_service = win32com.client.Dispatch("WbemScripting.SWbemLocator") obj_wmi_service = win32com.client.Dispatch("WbemScripting.SWbemLocator")
obj_swem_services = obj_wmi_service.ConnectServer(str_computer, "root\\cimv2") obj_swem_services = obj_wmi_service.ConnectServer(str_computer, "root\\cimv2")
col_items = obj_swem_services.ExecQuery("Select * from Win32_PnPEntity where PNPDeviceID like 'USB%'") col_items = obj_swem_services.ExecQuery("Select * from Win32_PnPEntity where PNPDeviceID like 'HID%'")
devices = [] input_devices = []
for obj_item in col_items: for obj_item in col_items:
devices.append({ input_devices.append({
"device_id": obj_item.DeviceID, "device_id": obj_item.DeviceID,
"PNPDeviceID": obj_item.PNPDeviceID, "PNPDeviceID": obj_item.PNPDeviceID,
"device_name": obj_item.Description, "Description": obj_item.Description,
"name": obj_item.Name, "device_name": obj_item.Name,
"Manufacturer": obj_item.Manufacturer, "Manufacturer": obj_item.Manufacturer,
"Service": obj_item.Service "Service": obj_item.Service,
"FriendlyName": obj_item.Name, # デバイスとプリンターで表示される名前
"device_instance_path": obj_item.DeviceID # デバイスインスタンスパス
}) })
return devices return input_devices
def device_register(**kwargs): def device_register(**kwargs):
onetime = str(kwargs["onetime"]) onetime = str(kwargs["onetime"])
mode = str(kwargs["mode"]) mode = str(kwargs["mode"])
number = int(kwargs["number"]) number = int(kwargs["number"])
device_id = str(kwargs["device_id"]) device_instance_path = str(kwargs["device_instance_path"])
device_name = str(kwargs["device_name"]) device_name = str(kwargs["device_name"])
device_register_json = { device_register_json = {
"number": number, "number": number,
"device_id": device_id, "device_instance_path": device_instance_path,
"device_name": device_name, "device_name": device_name,
"mode": mode, "mode": mode,
"onetime": onetime "onetime": onetime
@ -316,27 +318,29 @@ class Lock(customtkinter.CTkToplevel):
self.signin_button.configure(state="normal", fg_color="#3c8dd0") self.signin_button.configure(state="normal", fg_color="#3c8dd0")
self.signout_button.configure(state="normal", fg_color="#3c8dd0") self.signout_button.configure(state="normal", fg_color="#3c8dd0")
def get_usb_devices(self): def get_input_devices(self):
try: try:
pythoncom.CoInitialize() pythoncom.CoInitialize()
str_computer = "." str_computer = "."
obj_wmi_service = win32com.client.Dispatch("WbemScripting.SWbemLocator") obj_wmi_service = win32com.client.Dispatch("WbemScripting.SWbemLocator")
obj_swem_services = obj_wmi_service.ConnectServer(str_computer, "root\\cimv2") obj_swem_services = obj_wmi_service.ConnectServer(str_computer, "root\\cimv2")
col_items = obj_swem_services.ExecQuery("Select * from Win32_PnPEntity where PNPDeviceID like 'USB%'") col_items = obj_swem_services.ExecQuery("Select * from Win32_PnPEntity where PNPDeviceID like 'HID%'")
devices = [] input_devices = []
for obj_item in col_items: for obj_item in col_items:
devices.append({ input_devices.append({
"device_id": obj_item.DeviceID, "DeviceID": obj_item.DeviceID,
"PNPDeviceID": obj_item.PNPDeviceID, "PNPDeviceID": obj_item.PNPDeviceID,
"Description": obj_item.Description, "Description": obj_item.Description,
"device_name": obj_item.Name, "Name": obj_item.Name,
"Manufacturer": obj_item.Manufacturer, "Manufacturer": obj_item.Manufacturer,
"Service": obj_item.Service "Service": obj_item.Service,
"FriendlyName": obj_item.Name,
"DeviceInstancePath": obj_item.DeviceID
}) })
pythoncom.CoUninitialize() pythoncom.CoUninitialize()
return devices return input_devices
except pythoncom.com_error as e: except pythoncom.com_error as e:
print("Error:", e) print("Error:", e)
return [] return []
@ -344,7 +348,7 @@ class Lock(customtkinter.CTkToplevel):
def auth(self): def auth(self):
self.button_disable() self.button_disable()
password = str(self.password_entry.get()) password = str(self.password_entry.get())
devices = self.get_usb_devices() devices = self.get_input_devices()
if len(password) == 10: if len(password) == 10:
print("マスターパスワードで認証を試行します。") print("マスターパスワードで認証を試行します。")
@ -563,16 +567,17 @@ if __name__ == '__main__':
pass pass
else: else:
mode = input('登録するデバイスはキーボードとマウスのどちらですか?(keyboard/mouse): ') mode = input('登録するデバイスはキーボードとマウスのどちらですか?(keyboard/mouse): ')
usb_devices = get_usb_devices() input_devices = get_input_devices()
i = 0 i = 0
for device in usb_devices: for device in input_devices:
print(f"{str(i + 1)} 番目 | デバイス名: {device['device_name']} \n製造元: {device['Manufacturer']} \nデバイスID: {device['device_id']}") print(f"{str(i + 1)} 番目 | デバイス名: {device['device_name']} \n製造元: {device['Manufacturer']} \nデバイスインスタンスパス: {device['device_instance_path']}")
print("-" * 20) print("-" * 20)
i += 1 i += 1
device_num = input('どのデバイスを登録しますか?番号で指定してください: ') device_num = input('どのデバイスを登録しますか?番号で指定してください: ')
device_register_num = input('そのデバイスは何番目のデバイスとして登録しますか?番号で指定してください: ') device_register_num = input('そのデバイスは何番目のデバイスとして登録しますか?番号で指定してください: ')
onetime = input('ワンタイムパスワードを入力してください: ') onetime = input('ワンタイムパスワードを入力してください: ')
device_register_result = device_register(onetime=onetime, mode=mode, number=int(device_register_num), device_id=usb_devices[int(device_num) - 1]["device_id"], device_name=usb_devices[int(device_num) - 1]["device_name"]) device_register_result = device_register(onetime=onetime, mode=mode, number=int(device_register_num), device_instance_path=input_devices[int(device_num) - 1]["device_instance_path"], device_name=input_devices[int(device_num) - 1]["device_name"])
if device_register_result["result"] == 0: if device_register_result["result"] == 0:
print("登録されました。") print("登録されました。")
elif device_register_result["result"] == 1: elif device_register_result["result"] == 1: