adding xmpp

This commit is contained in:
AleaJactaEst 2023-12-24 01:17:01 +01:00
parent 7d3f028768
commit 7c40a3d053
11 changed files with 718 additions and 19 deletions

View file

@ -18,6 +18,7 @@ extends Node
signal send_msg_debug(message:String)
signal send_msg_error(message:String)
signal chat_connected()
signal new_stanza(stanza)
enum StreamState {
@ -52,6 +53,7 @@ enum XMPPState {
AUTHENTICATED, # We finished authenticate
NOT_AUTHORIZED, # Not Authorize
ACCOUNT_DISABLED, # Account Disable
SENDED_START_STREAM,
}
enum ResultAuthenticate {
@ -143,13 +145,14 @@ var status:StreamState = StreamState.END
var xmpp_state = XMPPState.NONE
var authentication_methods = []
var selected_mechanism_authenticate:String = ""
#var order_preference_mechanism_authenticate: Array = ['PLAIN']
var order_preference_mechanism_authenticate: Array = ['DIGEST-MD5']
var banned_mechanism_authenticate:Array = []
var order_preference_mechanism_authenticate: Array = ['PLAIN']
#var order_preference_mechanism_authenticate: Array = ['DIGEST-MD5']
var banned_mechanism_authenticate:Array = ['DIGEST-MD5']
#DIGEST-MD5, PLAIN, SCRAM-SHA-512-PLUS, SCRAM-SHA-512, SCRAM-SHA-256-PLUS, SCRAM-SHA-256, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, X-OAUTH2
var auhtentification_step:int = 0
var auhtentification_challenge:Array = []
const listcar:String = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789"
#func reinit_stream():
# if ssl_peer != null:
@ -172,6 +175,21 @@ func _init() -> void:
# reinit_stream()
func _ready():
randomize()
var n1:PackedByteArray = set_PackedByteArray("Mufasa:testrealm@host.com:Circle Of Life")
var n2:PackedByteArray = hash_md5(n1)
print("n2:", n2.hex_encode())
var exemple = digest_md5( "Mufasa", "Circle Of Life", "testrealm@host.com", "dcd98b7102dd2f0e8b11d0f600bfb0c093", "/dir/index.html", "auth", "00000001", "0a4f113b", "utf-8", "md5-sess" )
print("exemple:", exemple)
exemple = digest_md5( "rob", "Circle Of Life", "cataclysm.cx", "OA6MG9tEQGm2hh", "xmpp/
cataclysm.cx", "auth", "00000001", "OA6MHXh6VqTrRk", "utf-8", "md5-sess" )
print("exemple 2:", exemple)
func _process(delta) -> void:
#print(server_xmpp_name, ":", port_number, " / get_status:" , tcp_peer.get_status(), " / count_connecting_time:", count_connecting_time, " / stream_status:", stream_status, " / xmpp_state:", XMPPState.keys()[xmpp_state])
if xmppclient == false:
@ -426,6 +444,45 @@ func _process(delta) -> void:
count_connecting_time = 0
xmpp_state = XMPPState.SELECT_MECHANISM_AUTHENTICATE
banned_mechanism_authenticate.append(selected_mechanism_authenticate)
if xmpp_state == XMPPState.AUTHENTICATED:
if tcp_peer.get_status() != StreamPeerTCP.STATUS_CONNECTED:
xmpp_state = XMPPState.NONE
count_connecting_time = 0
#send_msg_debug.emit("Stream: Lost flow 1")
#send_msg_debug.emit("Stream: Lost flow 1 : " + str(tcp_peer.get_status()) )
return
if (ssl_peer.has_method("poll")):
ssl_peer.poll()
if tcp_peer.get_status() != StreamPeerTCP.STATUS_CONNECTED:
xmpp_state = XMPPState.NONE
count_connecting_time = 0
#send_msg_debug.emit("Stream: Lost flow 2 : " + str(tcp_peer.get_status()) )
return
if ssl_peer.get_available_bytes()>0:
var response = ssl_peer.get_string(ssl_peer.get_available_bytes())
send_msg_debug.emit("Stream: response: " + response)
start_stream()
if xmpp_state == XMPPState.SENDED_START_STREAM:
if tcp_peer.get_status() != StreamPeerTCP.STATUS_CONNECTED:
xmpp_state = XMPPState.NONE
count_connecting_time = 0
#send_msg_debug.emit("Stream: Lost flow 1")
#send_msg_debug.emit("Stream: Lost flow 1 : " + str(tcp_peer.get_status()) )
return
if (ssl_peer.has_method("poll")):
ssl_peer.poll()
if tcp_peer.get_status() != StreamPeerTCP.STATUS_CONNECTED:
xmpp_state = XMPPState.NONE
count_connecting_time = 0
#send_msg_debug.emit("Stream: Lost flow 2 : " + str(tcp_peer.get_status()) )
return
if ssl_peer.get_available_bytes()>0:
var response = ssl_peer.get_string(ssl_peer.get_available_bytes())
send_msg_debug.emit("Stream: response: " + response)
response = remove_stream_header(response)
if not analyze_error(response):
analyze_stream(response)
# chat_connected.emit()
func get_xml_data(response:String, nodes:Array) -> String:
@ -517,8 +574,8 @@ func analyze_error(response:String) -> bool:
var stream_error = XMPPStreamError.new()
stream_error.parse_from_xml(response)
var error_name = stream_error.error_name_for_enum(stream_error.error_type)
var error = tr('A stream error of type "%" occured, or in other words: % (Stream errors cannot be recovered from, the connection will be closed.'.format([error_name, stream_error.human_friendly_error_message()], "%)"))
error.emit(error)
var error:String = tr('A stream error of type "%" occured, or in other words: % (Stream errors cannot be recovered from, the connection will be closed.'.format([error_name, stream_error.human_friendly_error_message()], "%)"))
send_msg_error.emit(error)
return true
return false
@ -614,7 +671,7 @@ func negotiate_ssl_authenticate_plain() -> void:
# UTF8NUL
msg.push_back(0)
# authcid
var t = account_name.split("@")[0]
var t:String = account_name.split("@")[0]
msg += t.to_ascii_buffer()
# UTF8NUL
msg.push_back(0)
@ -628,7 +685,96 @@ func negotiate_ssl_authenticate_plain() -> void:
send_ssl_string(request_sasl)
func hash_md5(data:PackedByteArray ) -> PackedByteArray:
var ctx = HashingContext.new()
ctx.start(HashingContext.HASH_MD5)
ctx.update(data)
var res = ctx.finish()
# Print the result as hex string and array.
printt("hash_md5:", res.hex_encode(), Array(res))
return res
func set_PackedByteArray(data:String) -> PackedByteArray:
# var ret:PackedByteArray = PackedByteArray()
# for item in data:
# print(item)
return data.to_ascii_buffer()
func digest_md5(username:String, password:String, realm:String, nonce:String, uri:String, qop:String, nc:String, cnonce:String, charset:String, algorithm:String) -> String:
if qop != "auth" and qop != "auth-int":
send_msg_error.emit("Stream: Authenticate digest-md5, qop unknonw (%s)" % qop)
return ""
if charset != "utf-8":
send_msg_error.emit("Stream: Authenticate digest-md5, charset unknonw (%s)" % charset)
return ""
if algorithm != "md5-sess":
send_msg_error.emit("Stream: Authenticate digest-md5, algorithm unknonw (%s)" % algorithm)
return ""
#var serv_type:String = "xmpp"
var X:String = username + ":" + realm + ":" + password
print("X:", X)
var Y:String = hash_md5(set_PackedByteArray(X)).hex_encode()
print("Y:", Y)
var A1:String = Y + ":" + nonce + ":" + cnonce
print("A1:", A1)
var A2:String = "AUTHENTICATE:" + uri
print("A2:", A2)
var HA1:String = hash_md5(set_PackedByteArray(A1)).hex_encode()
print("HA1:", HA1)
var HA2:String = hash_md5(set_PackedByteArray(A2)).hex_encode()
print("HA2:", HA2)
var KD:String = HA1 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + HA2
print("KD:", KD)
var Z:String = hash_md5(set_PackedByteArray(KD)).hex_encode()
print("Z:", Z)
#
# var HA1a:PackedByteArray = set_PackedByteArray(username + ":" + realm + ":" + password)
# print("HA1a:", HA1a.get_string_from_ascii())
# #var HA1b:PackedByteArray = set_PackedByteArray(":" + nonce + ":" + cnonce)
# #print("HA1b:", HA1b.hex_encode())
# var HA1c:PackedByteArray = hash_md5(HA1a)
# print("HA1c:", HA1c.hex_encode())
# var HA1d:PackedByteArray = hash_md5(set_PackedByteArray(HA1c.hex_encode() + ":" + nonce + ":" + cnonce))
# print("HA1d:", HA1d.hex_encode())
# var method:String = "AUTHENTICATE:"
# var HA2:PackedByteArray = PackedByteArray()
# if qop == "auth":
# HA2 = hash_md5(set_PackedByteArray(method + ":" + uri))
# print("HA2:", HA2.hex_encode())
# else:
# # HA2 = MD5(method:digestURI:MD5(entityBody))
# var entityBody:String = ""
# var u:PackedByteArray = hash_md5(set_PackedByteArray(entityBody))
# #var t1:PackedByteArray = set_PackedByteArray(method + ":" + uri + ":")
# var t:PackedByteArray = set_PackedByteArray(method + ":" + uri + ":" + u.hex_encode())
# HA2 = hash_md5(t)
# #var i1:PackedByteArray = set_PackedByteArray(":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":")
# var response:PackedByteArray = hash_md5(set_PackedByteArray(
# HA1d.hex_encode() +
# ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" +
# HA2.hex_encode()))
var ifrealm:String = ""
if realm != "":
ifrealm = ",realm=" + realm
var msg: String = \
"username=\"" + username + "\"" + \
ifrealm + \
",nonce=\"" + nonce + "\"" + \
",cnonce=\"" + cnonce + "\"" + \
",nc=" + nc + \
",qop=" + qop + \
",digest-uri=\"" + uri + "\"" + \
",response=" + Z + \
",charset=\"" + charset + "\""
print(msg)
return Marshalls.utf8_to_base64(msg)
func negotiate_ssl_authenticate_digest_md5() -> bool:
""" NE MARCHE PAS !!!!!! """
send_msg_debug.emit("Stream: sending request for DIGEST-MD5 (step:%d)" % auhtentification_step)
if auhtentification_step == 0:
var request_sasl:String = "<auth" + \
@ -646,6 +792,10 @@ func negotiate_ssl_authenticate_digest_md5() -> bool:
var qop:String = ""
var charset:String = ""
var algorithm:String = ""
var cnonce:String = ""
var nc:String = "00000001"
var username:String = account_name.split("@")[0]
#var username:String = account_name
print(str(tab))
for item in tab:
var tab2:Array = item.split("=")
@ -663,7 +813,7 @@ func negotiate_ssl_authenticate_digest_md5() -> bool:
algorithm = value
print(key," = ", value)
print(tmp, " ", qop, " ", charset, " ",nonce)
if qop != "auth":
if qop != "auth" and qop != "auth-int":
send_msg_error.emit("Stream: Authenticate digest-md5, qop unknonw (%s)" % qop)
return false
if charset != "utf-8":
@ -672,7 +822,83 @@ func negotiate_ssl_authenticate_digest_md5() -> bool:
if algorithm != "md5-sess":
send_msg_error.emit("Stream: Authenticate digest-md5, algorithm unknonw (%s)" % algorithm)
return false
print(tmp)
for car in nonce:
var v:String = listcar[randi() % listcar.length()]
cnonce += v
print(cnonce)
var auth_account = digest_md5(username,password,realm,nonce, "xmpp/" + server_xmpp_name, qop, nc, cnonce, charset, algorithm)
# print(tmp)
# # username:String, password:String, realm:String, nonce:String, uri:String, qop:String, nc:String, cnonce:String, charset:String, algorithm:String) -> String:
#
# var serv_type:String = "xmpp"
# #var HA1a:PackedStringArray = PackedStringArray([username ,":", realm , ":", password])
# var HA1a:PackedByteArray = set_PackedByteArray(username + ":" + realm + ":" + password)
#
# #var titi = username + ":" + realm + ":" + password
# #print("titi:", titi)
# #HA1a.push_back(username + ":" + realm + ":" + password)
# #var o1:PackedByteArray = set_PackedByteArray(username + ":" + realm + ":" + password)
# #print("o1:", o1.get_string_from_ascii())
# print("HA1a:", HA1a.hex_encode())
# var HA1b:PackedByteArray = set_PackedByteArray(":" + nonce + ":" + cnonce)
# print("HA1b:", HA1b.hex_encode())
# var HA1c:PackedByteArray = hash_md5(set_PackedByteArray(HA1a.hex_encode()))
# var HA1d:PackedByteArray = hash_md5(set_PackedByteArray(HA1c.hex_encode() + HA1b.hex_encode()))
# var method:String = "AUTHENTICATE:"
# var digest_uri:String = serv_type + "/" + server_xmpp_name
# var HA2:PackedByteArray
# if qop == "auth":
# #var t:PackedByteArray = set_PackedByteArray(method + ":" + digest_uri)
# HA2 = hash_md5(set_PackedByteArray(method + ":" + digest_uri))
# else:
# # HA2 = MD5(method:digestURI:MD5(entityBody))
# var entityBody:String = ""
# var u:PackedByteArray = hash_md5(set_PackedByteArray(entityBody))
# #var t1:PackedByteArray = set_PackedByteArray(method + ":" + digest_uri + ":")
# var t:PackedByteArray = set_PackedByteArray(method + ":" + digest_uri + ":" + u.hex_encode())
# HA2 = hash_md5(t)
# #var i1:PackedByteArray = set_PackedByteArray(":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":")
# var response:PackedByteArray = hash_md5(set_PackedByteArray(
# HA1d.hex_encode() +
# ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" +
# HA2.hex_encode()))
# var ifrealm:String = ""
# if realm != "":
# ifrealm = ",realm=" + realm
# var msg: PackedByteArray = set_PackedByteArray(
# "username=\"" + username + "\"" +
# ifrealm +
# ",nonce=\"" + nonce + "\"" +
# ",cnonce=\"" + cnonce + "\"" +
# ",nc=" + nc +
# ",qop=" + qop +
# ",digest-uri=\"" + digest_uri + "\"" +
# ",response=" + response.hex_encode() +
# ",charset=\"" + charset + "\""
# ) # + response
## charset=utf-8,username="chris",realm="elwood.innosoft.com",
## nonce="OA6MG9tEQGm2hh",nc=00000001,cnonce="OA6MHXh6VqTrRk",
## digest-uri="imap/elwood.innosoft.com",
## response=d388dad90d4bbd760a152321f2143af7,qop=auth
# print("msg:", msg.get_string_from_ascii())
## var msf2:PackedStringArray = PackedStringArray()
## var mystring:String = 'username="rob",realm="cataclysm.cx",nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk",nc=00000001,qop=auth,digest-uri="xmpp/cataclysm.cx",response=d388dad90d4bbd760a152321f2143af7,charset=utf-8,authzid="rob@cataclysm.cx/myResource"'.strip_edges()
## msf2.push_back(mystring)
## var sol:String = "dXNlcm5hbWU9InJvYiIscmVhbG09ImNhdGFjbHlzbS5jeCIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixjbm9uY2U9Ik9BNk1IWGg2VnFUclJrIixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL2NhdGFjbHlzbS5jeCIscmVzcG9uc2U9ZDM4OGRhZDkwZDRiYmQ3NjBhMTUyMzIxZjIxNDNhZjcsY2hhcnNldD11dGYtOCxhdXRoemlkPSJyb2JAY2F0YWNseXNtLmN4L215UmVzb3VyY2Ui"
## print("---", "".join(msf2))
## print("msf2:", Marshalls.raw_to_base64(msf2.to_byte_array()))
## print("msf2:", Marshalls.utf8_to_base64("".join(msf2)))
## print("msf2:", Marshalls.utf8_to_base64(mystring))
## if sol != Marshalls.raw_to_base64(msf2.to_byte_array()):
## print("********************************************** FAILED 1" )
## if sol != Marshalls.utf8_to_base64(mystring):
## print("********************************************** FAILED 2")
## if sol != Marshalls.utf8_to_base64("".join(msf2)):
## print("********************************************** FAILED 3")
# var auth_account:String = Marshalls.utf8_to_base64(msg.get_string_from_ascii())
var request_sasl:String = "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'" + \
" >" + auth_account + "</response>"
send_ssl_string(request_sasl)
auhtentification_step += 1
return true
return false
@ -699,7 +925,6 @@ func negotiate_ssl_sasl(authentication_methods : Array) -> bool:
send_msg_error.emit("Impossible to authenticate (unknown protocol)")
return false
#
#
#
@ -962,3 +1187,102 @@ func remove_stream_header(text :String) -> String:
# tcp_peer.disconnect_from_host()
# set_process(false)
# stream_status = StreamState.END
#
#
#
func analyze_stream(msg:String) -> void:
partial_stanza += msg
if partial_stanza.is_empty():
return
var complete_stanza = true
while complete_stanza == true:
var parser = XMLParser.new()
if partial_stanza.length() == 0:
return
parser.open_buffer( set_PackedByteArray(partial_stanza) )
var element_name = ""
var node_offset = 0
if parser.read() == OK and parser.get_node_type() == XMLParser.NODE_ELEMENT:
element_name = parser.get_node_name()
if parser.is_empty():
node_offset = partial_stanza.length()
if parser.read() == OK:
node_offset = parser.get_node_offset()
while parser.read() == OK and node_offset == 0:
if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
if parser.get_node_name() == element_name:
if parser.read() == OK:
node_offset = parser.get_node_offset()
else:
node_offset = partial_stanza.length()
if node_offset > 0:
# We have found a complete stanza.
var new_stanza:String = partial_stanza.left(node_offset)
if node_offset == partial_stanza.length():
partial_stanza = ""
else:
partial_stanza = partial_stanza.right(-node_offset)
#emit_signal("new_stanza", new_stanza)
print("new_stanza:", new_stanza)
else:
complete_stanza = false
func escape_html(msg:String) -> String:
var tmp = msg
tmp.replace("&", "&amp;")
tmp.replace("<", "&lt;")
tmp.replace(">", "&gt;")
tmp.replace("'", "&apos;")
tmp.replace("\"", "&quot;")
return tmp
func send_message_to_old(message, to):
if xmpp_state != XMPPState.AUTHENTICATED:
return
var msg:String = "<message to='" + escape_html(to) + "' type='chat'>\n" + \
" <body>" + escape_html(message) + "</body>\n" + \
"</message>"
send_ssl_string(msg)
func send_message_to_1(message, to):
if xmpp_state != XMPPState.AUTHENTICATED:
return
var msg:String = "<?xml version='1.0'?><stream:stream from='" + account_name + "' to='" + escape_html(to) + "' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>\n" + \
"<message to='" + escape_html(to) + "' > <body>" + escape_html(message) + "</body>\n" + \
"</message></stream:stream>"
send_ssl_string(msg)
func send_message_to(message, to):
if xmpp_state != XMPPState.AUTHENTICATED:
return
var msg:String = "<?xml version='1.0'?><stream:stream from='" + account_name + "' to='" + escape_html(to) + "' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>\n" + \
"<message > <body>" + escape_html(message) + "</body>\n" + \
"</message></stream:stream>"
send_ssl_string(msg)
func start_stream():
if xmpp_state != XMPPState.AUTHENTICATED:
return
var msg:String = "<?xml version='1.0'?>" + \
"<stream:stream" + \
" from='" + escape_html(account_name) + "'" + \
" to='" + escape_html(server_xmpp_name) + "'" + \
" version='1.0'" + \
" xml:lang='en'" + \
" xmlns='jabber:client'" + \
" xmlns:stream='http://etherx.jabber.org/streams'>\n" + \
"</stream:stream>"
send_ssl_string(msg)
xmpp_state = XMPPState.SENDED_START_STREAM

12
client/Stream/chat.gd Normal file
View file

@ -0,0 +1,12 @@
extends Window
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
Stream.send_message_to("coucou", "titi")
#Stream.send_message_to("Art thou not Romeo, and a Montague?", "romeo@example.net")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

55
client/Stream/chat.tscn Normal file
View file

@ -0,0 +1,55 @@
[gd_scene load_steps=2 format=3 uid="uid://becf5crej4o5v"]
[ext_resource type="Script" path="res://Stream/chat.gd" id="1_44t2b"]
[node name="chat" type="Window"]
title = "Chat"
initial_position = 1
size = Vector2i(500, 500)
always_on_top = true
script = ExtResource("1_44t2b")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="TabContainer" type="TabContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="World" type="TabBar" parent="VBoxContainer/TabContainer"]
layout_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/World"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/World"]
layout_mode = 1
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = -4.0
grow_horizontal = 2
grow_vertical = 0
[node name="TextEdit" type="TextEdit" parent="VBoxContainer/TabContainer/World"]
custom_minimum_size = Vector2(0, 70)
layout_mode = 1
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = -8.0
grow_horizontal = 2
grow_vertical = 0
text = "Exemple"
placeholder_text = "Taper votre texte"

View file

@ -1,6 +1,6 @@
[gd_scene load_steps=3 format=3 uid="uid://c688gu5xrshpg"]
[ext_resource type="PackedScene" uid="uid://b5ej7nfagdlmf" path="res://assets/root.glb" id="1_s8vvr"]
[ext_resource type="PackedScene" uid="uid://dfxlsfc5tcnb2" path="res://assets/root.glb" id="1_s8vvr"]
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_rf26g"]
data = PackedVector3Array(20, -1, -20, -21, -1, 20, -21, -1, -20, 20, -1, -20, 20, -1, 20, -21, -1, 20, 20, -3, 20, -21, -1, 20, 20, -1, 20, 20, -3, 20, -21, -3, 20, -21, -1, 20, -21, -3, 20, -21, -1, -20, -21, -1, 20, -21, -3, 20, -21, -3, -20, -21, -1, -20, -21, -3, -20, 20, -3, 20, 20, -3, -20, -21, -3, -20, -21, -3, 20, 20, -3, 20, 20, -3, -20, 20, -1, 20, 20, -1, -20, 20, -3, -20, 20, -3, 20, 20, -1, 20, -21, -3, -20, 20, -1, -20, -21, -1, -20, -21, -3, -20, 20, -3, -20, 20, -1, -20)

File diff suppressed because one or more lines are too long

View file

@ -12,7 +12,7 @@ config_version=5
config/name="Bazar d'Alea"
run/main_scene="res://scenes/main.tscn"
config/features=PackedStringArray("4.1", "Forward Plus")
config/features=PackedStringArray("4.2", "Forward Plus")
config/icon="res://icon.svg"
[autoload]

View file

@ -17,6 +17,7 @@ var player_name: String
const player_path:String = "res://player/character.tscn"
@export var PlayerCharacter = preload(player_path)
@export var debug_window: PackedScene
const chat_windows:String = "res://Stream/chat.tscn"
#@onready var _MainWindow: Window = get_window()
@ -39,6 +40,7 @@ func _ready():
Stream.set_port_number(5222)
Stream.send_msg_debug.connect(show_stream_debug)
Stream.send_msg_error.connect(show_stream_error)
Stream.chat_connected.connect(show_chat)
#$Window.world_2d = _MainWindow.world_2d
@ -50,6 +52,12 @@ func show_stream_error(msg:String):
print("ERROR [Stream] ", msg)
func show_chat():
print("INFO [Stream] open")
var new_window: Window = load(chat_windows).instantiate()
add_child(new_window)
func create_view_window():
pass
# var new_window: Window = view_window.instantiate()

View file

@ -1,6 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://cg5uqqd4ibdem"]
[ext_resource type="PackedScene" uid="uid://bng6cjt7kq1hv" path="res://assets/player.glb" id="1_bpxp1"]
[ext_resource type="PackedScene" uid="uid://cm1b2g86hox0p" path="res://assets/player.glb" id="1_bpxp1"]
[ext_resource type="Script" path="res://scenes/player.gd" id="1_br7n0"]
[sub_resource type="SphereShape3D" id="SphereShape3D_cjbav"]

296
ejabberd.yml Normal file
View file

@ -0,0 +1,296 @@
###
### ejabberd configuration file
###
### The parameters used in this configuration file are explained at
###
### https://docs.ejabberd.im/admin/configuration
###
### The configuration file is written in YAML.
### *******************************************************
### ******* !!! WARNING !!! *******
### ******* YAML IS INDENTATION SENSITIVE *******
### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
### *******************************************************
### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
###
#docker run --name test -it \
# -v $(pwd)/ejabberd.yml:/home/ejabberd/conf/ejabberd.yml \
# --publish 5222:5222 \
# --publish 5269:5269 \
# --publish 5280:5280 \
# --publish 5443:5443 \
# --publish 1883:1883 \
# ejabberd/ecs
hosts:
- localhost
loglevel: debug
log_rotate_size: 10485760
log_rotate_date: ""
log_rotate_count: 1
log_rate_limit: 100
certfiles:
- /home/ejabberd/conf/server.pem
ca_file: "/home/ejabberd/conf/cacert.pem"
## When using let's encrypt to generate certificates
##certfiles:
## - /etc/letsencrypt/live/localhost/fullchain.pem
## - /etc/letsencrypt/live/localhost/privkey.pem
##
##ca_file: "/etc/letsencrypt/live/localhost/fullchain.pem"
listen:
-
port: 5222
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
starttls_required: true
-
port: 5269
ip: "::"
module: ejabberd_s2s_in
max_stanza_size: 524288
-
port: 5443
ip: "::"
module: ejabberd_http
tls: true
request_handlers:
"/admin": ejabberd_web_admin
"/api": mod_http_api
"/bosh": mod_bosh
"/captcha": ejabberd_captcha
"/upload": mod_http_upload
"/ws": ejabberd_http_ws
"/oauth": ejabberd_oauth
-
port: 5280
ip: "::"
module: ejabberd_http
request_handlers:
"/admin": ejabberd_web_admin
-
port: 1883
ip: "::"
module: mod_mqtt
backlog: 1000
##
## https://docs.ejabberd.im/admin/configuration/#stun-and-turn
## ejabberd_stun: Handles STUN Binding requests
##
##-
## port: 3478
## ip: "0.0.0.0"
## transport: udp
## module: ejabberd_stun
## use_turn: true
## turn_ip: "{{ IP }}"
## auth_type: user
## auth_realm: "example.com"
##-
## port: 3478
## ip: "0.0.0.0"
## module: ejabberd_stun
## use_turn: true
## turn_ip: "{{ IP }}"
## auth_type: user
## auth_realm: "example.com"
##-
## port: 5349
## ip: "0.0.0.0"
## module: ejabberd_stun
## certfile: "/home/ejabberd/conf/server.pem"
## tls: true
## use_turn: true
## turn_ip: "{{ IP }}"
## auth_type: user
## auth_realm: "example.com"
##
## https://docs.ejabberd.im/admin/configuration/#sip
## To handle SIP (VOIP) requests:
##
##-
## port: 5060
## ip: "0.0.0.0"
## transport: udp
## module: ejabberd_sip
##-
## port: 5060
## ip: "0.0.0.0"
## module: ejabberd_sip
##-
## port: 5061
## ip: "0.0.0.0"
## module: ejabberd_sip
## tls: true
s2s_use_starttls: optional
acl:
local:
user_regexp: ""
loopback:
ip:
- 127.0.0.0/8
- ::1/128
- ::FFFF:127.0.0.1/128
admin:
user:
- "admin@localhost"
access_rules:
local:
allow: local
c2s:
deny: blocked
allow: all
announce:
allow: admin
configure:
allow: admin
muc_create:
allow: local
pubsub_createnode:
allow: local
trusted_network:
allow: loopback
api_permissions:
"console commands":
from:
- ejabberd_ctl
who: all
what: "*"
"admin access":
who:
access:
allow:
acl: loopback
acl: admin
oauth:
scope: "ejabberd:admin"
access:
allow:
acl: loopback
acl: admin
what:
- "*"
- "!stop"
- "!start"
"public commands":
who:
ip: 127.0.0.1/8
what:
- status
- connected_users_number
shaper:
normal: 1000
fast: 50000
shaper_rules:
max_user_sessions: 10
max_user_offline_messages:
5000: admin
100: all
c2s_shaper:
none: admin
normal: all
s2s_shaper: fast
max_fsm_queue: 10000
acme:
contact: "mailto:example-admin@example.com"
ca_url: "https://acme-staging-v02.api.letsencrypt.org/directory"
modules:
mod_adhoc: {}
mod_admin_extra: {}
mod_announce:
access: announce
mod_avatar: {}
mod_blocking: {}
mod_bosh: {}
mod_caps: {}
mod_carboncopy: {}
mod_client_state: {}
mod_configure: {}
mod_disco: {}
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: https://@HOST@:5443/upload
mod_last: {}
mod_mam:
## Mnesia is limited to 2GB, better to use an SQL backend
## For small servers SQLite is a good fit and is very easy
## to configure. Uncomment this when you have SQL configured:
## db_type: sql
assume_mam_usage: true
default: never
mod_mqtt: {}
mod_muc:
access:
- allow
access_admin:
- allow: admin
access_create: muc_create
access_persistent: muc_create
access_mam:
- allow
default_room_options:
allow_subscription: true # enable MucSub
mam: false
mod_muc_admin: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
mod_privacy: {}
mod_private: {}
mod_proxy65:
access: local
max_connections: 5
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
- flat
- pep
force_node_config:
## Avoid buggy clients to make their bookmarks public
storage:bookmarks:
access_model: whitelist
mod_push: {}
mod_push_keepalive: {}
mod_register:
## Only accept registration requests from the "trusted"
## network (see access_rules section above).
## Think twice before enabling registration from any
## address. See the Jabber SPAM Manifesto for details:
## https://github.com/ge0rg/jabber-spam-fighting-manifesto
ip_access: trusted_network
mod_roster:
versioning: true
mod_sip: {}
mod_s2s_dialback: {}
mod_shared_roster: {}
mod_stream_mgmt:
resend_on_timeout: if_offline
mod_vcard: {}
mod_vcard_xupdate: {}
mod_version:
show_os: false
### Local Variables:
### mode: yaml
### End:
### vim: set filetype=yaml tabstop=8

View file

@ -7,7 +7,7 @@ declare FORCE=0
declare IMPORT=0
declare ERASEIMPORT=0
declare WORKDIR="$(dirname $(readlink -f $0))"
declare GODOT_SRC="https://downloads.tuxfamily.org/godotengine/4.1.3/Godot_v4.1.3-stable_linux.x86_64.zip"
declare GODOT_SRC="https://downloads.tuxfamily.org/godotengine/4.2.1/Godot_v4.2.1-stable_linux.x86_64.zip"
declare OUTZIP="$WORKDIR/$(basename $GODOT_SRC)"
declare CLIENTDIR="$WORKDIR/client"
declare OPTION=""

View file

@ -26,7 +26,7 @@ then
else
docker start ejabberd
docker logs -f ejabberd
docker stop
docker stop ejabberd
fi
# https://localhost:5443/admin/
@ -36,4 +36,6 @@ fi
# docker exec -it ejabberd bin/ejabberdctl stats registeredusers
# docker exec -it ejabberd bin/ejabberdctl register titi localhost titi
# docker exec -it ejabberd bin/ejabberdctl register undefined localhost undefined
# docker exec -it ejabberd bin/ejabberdctl help commands
# docker exec -it ejabberd bin/ejabberdctl unban_ip 172.17.0.1