mirror of
https://port.numenaute.org/aleajactaest/bazar_alea.git
synced 2024-11-09 08:49:03 +00:00
adding xmpp
This commit is contained in:
parent
7d3f028768
commit
7c40a3d053
11 changed files with 718 additions and 19 deletions
|
@ -18,6 +18,7 @@ extends Node
|
||||||
|
|
||||||
signal send_msg_debug(message:String)
|
signal send_msg_debug(message:String)
|
||||||
signal send_msg_error(message:String)
|
signal send_msg_error(message:String)
|
||||||
|
signal chat_connected()
|
||||||
signal new_stanza(stanza)
|
signal new_stanza(stanza)
|
||||||
|
|
||||||
enum StreamState {
|
enum StreamState {
|
||||||
|
@ -52,6 +53,7 @@ enum XMPPState {
|
||||||
AUTHENTICATED, # We finished authenticate
|
AUTHENTICATED, # We finished authenticate
|
||||||
NOT_AUTHORIZED, # Not Authorize
|
NOT_AUTHORIZED, # Not Authorize
|
||||||
ACCOUNT_DISABLED, # Account Disable
|
ACCOUNT_DISABLED, # Account Disable
|
||||||
|
SENDED_START_STREAM,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ResultAuthenticate {
|
enum ResultAuthenticate {
|
||||||
|
@ -143,13 +145,14 @@ var status:StreamState = StreamState.END
|
||||||
var xmpp_state = XMPPState.NONE
|
var xmpp_state = XMPPState.NONE
|
||||||
var authentication_methods = []
|
var authentication_methods = []
|
||||||
var selected_mechanism_authenticate:String = ""
|
var selected_mechanism_authenticate:String = ""
|
||||||
#var order_preference_mechanism_authenticate: Array = ['PLAIN']
|
var order_preference_mechanism_authenticate: Array = ['PLAIN']
|
||||||
var order_preference_mechanism_authenticate: Array = ['DIGEST-MD5']
|
#var order_preference_mechanism_authenticate: Array = ['DIGEST-MD5']
|
||||||
var banned_mechanism_authenticate:Array = []
|
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
|
#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_step:int = 0
|
||||||
var auhtentification_challenge:Array = []
|
var auhtentification_challenge:Array = []
|
||||||
|
|
||||||
|
const listcar:String = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789"
|
||||||
|
|
||||||
#func reinit_stream():
|
#func reinit_stream():
|
||||||
# if ssl_peer != null:
|
# if ssl_peer != null:
|
||||||
|
@ -172,6 +175,21 @@ func _init() -> void:
|
||||||
# reinit_stream()
|
# 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:
|
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])
|
#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:
|
if xmppclient == false:
|
||||||
|
@ -426,6 +444,45 @@ func _process(delta) -> void:
|
||||||
count_connecting_time = 0
|
count_connecting_time = 0
|
||||||
xmpp_state = XMPPState.SELECT_MECHANISM_AUTHENTICATE
|
xmpp_state = XMPPState.SELECT_MECHANISM_AUTHENTICATE
|
||||||
banned_mechanism_authenticate.append(selected_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:
|
func get_xml_data(response:String, nodes:Array) -> String:
|
||||||
|
@ -517,8 +574,8 @@ func analyze_error(response:String) -> bool:
|
||||||
var stream_error = XMPPStreamError.new()
|
var stream_error = XMPPStreamError.new()
|
||||||
stream_error.parse_from_xml(response)
|
stream_error.parse_from_xml(response)
|
||||||
var error_name = stream_error.error_name_for_enum(stream_error.error_type)
|
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()], "%)"))
|
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()], "%)"))
|
||||||
error.emit(error)
|
send_msg_error.emit(error)
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
@ -614,7 +671,7 @@ func negotiate_ssl_authenticate_plain() -> void:
|
||||||
# UTF8NUL
|
# UTF8NUL
|
||||||
msg.push_back(0)
|
msg.push_back(0)
|
||||||
# authcid
|
# authcid
|
||||||
var t = account_name.split("@")[0]
|
var t:String = account_name.split("@")[0]
|
||||||
msg += t.to_ascii_buffer()
|
msg += t.to_ascii_buffer()
|
||||||
# UTF8NUL
|
# UTF8NUL
|
||||||
msg.push_back(0)
|
msg.push_back(0)
|
||||||
|
@ -628,7 +685,96 @@ func negotiate_ssl_authenticate_plain() -> void:
|
||||||
send_ssl_string(request_sasl)
|
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:
|
func negotiate_ssl_authenticate_digest_md5() -> bool:
|
||||||
|
""" NE MARCHE PAS !!!!!! """
|
||||||
send_msg_debug.emit("Stream: sending request for DIGEST-MD5 (step:%d)" % auhtentification_step)
|
send_msg_debug.emit("Stream: sending request for DIGEST-MD5 (step:%d)" % auhtentification_step)
|
||||||
if auhtentification_step == 0:
|
if auhtentification_step == 0:
|
||||||
var request_sasl:String = "<auth" + \
|
var request_sasl:String = "<auth" + \
|
||||||
|
@ -646,6 +792,10 @@ func negotiate_ssl_authenticate_digest_md5() -> bool:
|
||||||
var qop:String = ""
|
var qop:String = ""
|
||||||
var charset:String = ""
|
var charset:String = ""
|
||||||
var algorithm: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))
|
print(str(tab))
|
||||||
for item in tab:
|
for item in tab:
|
||||||
var tab2:Array = item.split("=")
|
var tab2:Array = item.split("=")
|
||||||
|
@ -663,7 +813,7 @@ func negotiate_ssl_authenticate_digest_md5() -> bool:
|
||||||
algorithm = value
|
algorithm = value
|
||||||
print(key," = ", value)
|
print(key," = ", value)
|
||||||
print(tmp, " ", qop, " ", charset, " ",nonce)
|
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)
|
send_msg_error.emit("Stream: Authenticate digest-md5, qop unknonw (%s)" % qop)
|
||||||
return false
|
return false
|
||||||
if charset != "utf-8":
|
if charset != "utf-8":
|
||||||
|
@ -672,7 +822,83 @@ func negotiate_ssl_authenticate_digest_md5() -> bool:
|
||||||
if algorithm != "md5-sess":
|
if algorithm != "md5-sess":
|
||||||
send_msg_error.emit("Stream: Authenticate digest-md5, algorithm unknonw (%s)" % algorithm)
|
send_msg_error.emit("Stream: Authenticate digest-md5, algorithm unknonw (%s)" % algorithm)
|
||||||
return false
|
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
|
auhtentification_step += 1
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
@ -699,7 +925,6 @@ func negotiate_ssl_sasl(authentication_methods : Array) -> bool:
|
||||||
send_msg_error.emit("Impossible to authenticate (unknown protocol)")
|
send_msg_error.emit("Impossible to authenticate (unknown protocol)")
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -962,3 +1187,102 @@ func remove_stream_header(text :String) -> String:
|
||||||
# tcp_peer.disconnect_from_host()
|
# tcp_peer.disconnect_from_host()
|
||||||
# set_process(false)
|
# set_process(false)
|
||||||
# stream_status = StreamState.END
|
# 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("&", "&")
|
||||||
|
tmp.replace("<", "<")
|
||||||
|
tmp.replace(">", ">")
|
||||||
|
tmp.replace("'", "'")
|
||||||
|
tmp.replace("\"", """)
|
||||||
|
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
12
client/Stream/chat.gd
Normal 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
55
client/Stream/chat.tscn
Normal 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"
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_scene load_steps=3 format=3 uid="uid://c688gu5xrshpg"]
|
[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"]
|
[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)
|
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
|
@ -12,7 +12,7 @@ config_version=5
|
||||||
|
|
||||||
config/name="Bazar d'Alea"
|
config/name="Bazar d'Alea"
|
||||||
run/main_scene="res://scenes/main.tscn"
|
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"
|
config/icon="res://icon.svg"
|
||||||
|
|
||||||
[autoload]
|
[autoload]
|
||||||
|
|
|
@ -17,6 +17,7 @@ var player_name: String
|
||||||
const player_path:String = "res://player/character.tscn"
|
const player_path:String = "res://player/character.tscn"
|
||||||
@export var PlayerCharacter = preload(player_path)
|
@export var PlayerCharacter = preload(player_path)
|
||||||
@export var debug_window: PackedScene
|
@export var debug_window: PackedScene
|
||||||
|
const chat_windows:String = "res://Stream/chat.tscn"
|
||||||
|
|
||||||
#@onready var _MainWindow: Window = get_window()
|
#@onready var _MainWindow: Window = get_window()
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ func _ready():
|
||||||
Stream.set_port_number(5222)
|
Stream.set_port_number(5222)
|
||||||
Stream.send_msg_debug.connect(show_stream_debug)
|
Stream.send_msg_debug.connect(show_stream_debug)
|
||||||
Stream.send_msg_error.connect(show_stream_error)
|
Stream.send_msg_error.connect(show_stream_error)
|
||||||
|
Stream.chat_connected.connect(show_chat)
|
||||||
#$Window.world_2d = _MainWindow.world_2d
|
#$Window.world_2d = _MainWindow.world_2d
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,6 +52,12 @@ func show_stream_error(msg:String):
|
||||||
print("ERROR [Stream] ", msg)
|
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():
|
func create_view_window():
|
||||||
pass
|
pass
|
||||||
# var new_window: Window = view_window.instantiate()
|
# var new_window: Window = view_window.instantiate()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_scene load_steps=4 format=3 uid="uid://cg5uqqd4ibdem"]
|
[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"]
|
[ext_resource type="Script" path="res://scenes/player.gd" id="1_br7n0"]
|
||||||
|
|
||||||
[sub_resource type="SphereShape3D" id="SphereShape3D_cjbav"]
|
[sub_resource type="SphereShape3D" id="SphereShape3D_cjbav"]
|
||||||
|
|
296
ejabberd.yml
Normal file
296
ejabberd.yml
Normal 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
|
||||||
|
|
|
@ -7,7 +7,7 @@ declare FORCE=0
|
||||||
declare IMPORT=0
|
declare IMPORT=0
|
||||||
declare ERASEIMPORT=0
|
declare ERASEIMPORT=0
|
||||||
declare WORKDIR="$(dirname $(readlink -f $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 OUTZIP="$WORKDIR/$(basename $GODOT_SRC)"
|
||||||
declare CLIENTDIR="$WORKDIR/client"
|
declare CLIENTDIR="$WORKDIR/client"
|
||||||
declare OPTION=""
|
declare OPTION=""
|
||||||
|
|
|
@ -26,7 +26,7 @@ then
|
||||||
else
|
else
|
||||||
docker start ejabberd
|
docker start ejabberd
|
||||||
docker logs -f ejabberd
|
docker logs -f ejabberd
|
||||||
docker stop
|
docker stop ejabberd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# https://localhost:5443/admin/
|
# https://localhost:5443/admin/
|
||||||
|
@ -36,4 +36,6 @@ fi
|
||||||
# docker exec -it ejabberd bin/ejabberdctl stats registeredusers
|
# 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 titi localhost titi
|
||||||
# docker exec -it ejabberd bin/ejabberdctl register undefined localhost undefined
|
# 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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue