115 lines
3.7 KiB
GDScript
115 lines
3.7 KiB
GDScript
@tool
|
|
extends EditorInspectorPlugin
|
|
|
|
const BufferedHttpClient = preload("res://addons/twitcher/lib/http/buffered_http_client.gd")
|
|
const EncryptionKeyProvider: CryptoKeyProvider = preload("res://addons/twitcher/lib/oOuch/default_key_provider.tres")
|
|
|
|
|
|
func _can_handle(object: Object) -> bool:
|
|
return object is OAuthSetting
|
|
|
|
|
|
func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool) -> bool:
|
|
if name == "well_known_url":
|
|
add_property_editor("well_known_url", WellKnownUriProperty.new())
|
|
return true
|
|
if name == "client_id":
|
|
add_property_editor("client_secret", SecretProperty.new(), true, "Client Secret")
|
|
return false
|
|
|
|
|
|
class SecretProperty extends EditorProperty:
|
|
var _line_edit: LineEdit = LineEdit.new()
|
|
|
|
|
|
func _init() -> void:
|
|
_line_edit.secret = true
|
|
_line_edit.text_submitted.connect(_on_text_changed)
|
|
_line_edit.focus_exited.connect(_on_focus_exited)
|
|
add_child(_line_edit)
|
|
add_focusable(_line_edit)
|
|
|
|
|
|
func _update_property() -> void:
|
|
var secret = get_edited_object()[get_edited_property()]
|
|
|
|
if secret == "": _line_edit.text = ""
|
|
var value_raw := Marshalls.base64_to_raw(secret)
|
|
var value_bytes := EncryptionKeyProvider.decrypt(value_raw)
|
|
_line_edit.text = value_bytes.get_string_from_utf8()
|
|
|
|
|
|
func _on_focus_exited() -> void:
|
|
_save()
|
|
|
|
|
|
func _on_text_changed(_new_text: String) -> void:
|
|
_save()
|
|
|
|
|
|
func _save() -> void:
|
|
var plain_value = _line_edit.text
|
|
if plain_value == "":
|
|
emit_changed(get_edited_property(), "")
|
|
return
|
|
var encrypted_value := EncryptionKeyProvider.encrypt(plain_value.to_utf8_buffer())
|
|
emit_changed(get_edited_property(), Marshalls.raw_to_base64(encrypted_value))
|
|
|
|
|
|
class WellKnownUriProperty extends EditorProperty:
|
|
var _url_regex = RegEx.create_from_string("((https?://)?([^:/]+))(:([0-9]+))?(/.*)?")
|
|
|
|
var _container: VBoxContainer
|
|
var _well_known_url: LineEdit
|
|
var _submit: Button
|
|
var _client: BufferedHttpClient
|
|
|
|
func _init() -> void:
|
|
_container = VBoxContainer.new()
|
|
_client = BufferedHttpClient.new()
|
|
_client.name = "OauthSettingInspectorClient"
|
|
add_child(_client)
|
|
|
|
_well_known_url = LineEdit.new()
|
|
_well_known_url.placeholder_text = "https://id.twitch.tv/oauth2/.well-known/openid-configuration"
|
|
_well_known_url.text_changed.connect(_on_text_changed)
|
|
add_focusable(_well_known_url)
|
|
_container.add_child(_well_known_url)
|
|
|
|
_submit = Button.new()
|
|
_submit.pressed.connect(_on_submit_clicked)
|
|
_submit.text = "Update URIs"
|
|
_container.add_child(_submit)
|
|
add_focusable(_submit)
|
|
add_child(_container)
|
|
|
|
|
|
func _on_text_changed(new_text: String) -> void:
|
|
emit_changed(get_edited_property(), new_text)
|
|
|
|
|
|
func _update_property() -> void:
|
|
_well_known_url.text = get_edited_object()[get_edited_property()]
|
|
|
|
|
|
func load_from_wellknown(wellknow_url: String) -> void:
|
|
var request = _client.request(wellknow_url, HTTPClient.METHOD_GET, {}, "")
|
|
var response = await _client.wait_for_request(request) as BufferedHttpClient.ResponseData
|
|
var json = JSON.parse_string(response.response_data.get_string_from_utf8())
|
|
|
|
var device_code = json.get("device_authorization_endpoint", "")
|
|
if device_code != "":
|
|
emit_changed(&"device_authorization_url", device_code)
|
|
var token_endpoint = json["token_endpoint"]
|
|
if token_endpoint != "":
|
|
emit_changed(&"token_url", token_endpoint)
|
|
var authorization_endpoint = json["authorization_endpoint"]
|
|
if authorization_endpoint != "":
|
|
emit_changed(&"authorization_url", authorization_endpoint)
|
|
|
|
|
|
func _on_submit_clicked() -> void:
|
|
_submit.disabled = true
|
|
var wellknownurl = _well_known_url.text if _well_known_url.text != "" else _well_known_url.placeholder_text
|
|
await load_from_wellknown(wellknownurl)
|
|
_submit.disabled = false
|