plugin XEP-0166: set jingle_elt, desc_elt and transport_elt:
those values are set to corresponding domish.Element in session for session init/confirmation/accept workflow.
This commit is contained in:
parent
5c6578a1f6
commit
e485a64198
1 changed files with 25 additions and 6 deletions
|
|
@ -251,6 +251,7 @@ class XEP_0166:
|
|||
@param request(domsih.Element): jingle request
|
||||
@param client: %(doc_client)s
|
||||
"""
|
||||
del session["jingle_elt"]
|
||||
log.warning(f"Error while processing jingle request [{client.profile}]")
|
||||
if isinstance(failure_.value, defer.FirstError):
|
||||
failure_ = failure_.value.subFailure.value
|
||||
|
|
@ -510,6 +511,7 @@ class XEP_0166:
|
|||
client, session, XEP_0166.A_SESSION_INITIATE
|
||||
)
|
||||
jingle_elt["initiator"] = initiator.full()
|
||||
session["jingle_elt"] = jingle_elt
|
||||
|
||||
session_contents = session["contents"]
|
||||
|
||||
|
|
@ -527,11 +529,13 @@ class XEP_0166:
|
|||
)
|
||||
|
||||
# we build the session data for this content
|
||||
application_data = {}
|
||||
transport_data = content_data.transport_data
|
||||
session_content = {
|
||||
"application": content_data.application,
|
||||
"application_data": {},
|
||||
"application_data": application_data,
|
||||
"transport": transport,
|
||||
"transport_data": content_data.transport_data,
|
||||
"transport_data": transport_data,
|
||||
"creator": XEP_0166.ROLE_INITIATOR,
|
||||
"senders": content.get("senders", "both"),
|
||||
}
|
||||
|
|
@ -551,7 +555,7 @@ class XEP_0166:
|
|||
pass
|
||||
|
||||
# then the description element
|
||||
desc_elt = await utils.as_deferred(
|
||||
application_data["desc_elt"] = desc_elt = await utils.as_deferred(
|
||||
content_data.application.handler.jingle_session_init,
|
||||
client, session, content_data.content_name,
|
||||
*content_data.app_args, **content_data.app_kwargs
|
||||
|
|
@ -559,7 +563,7 @@ class XEP_0166:
|
|||
content_elt.addChild(desc_elt)
|
||||
|
||||
# and the transport one
|
||||
transport_elt = await utils.as_deferred(
|
||||
transport_data["transport_elt"] = transport_elt = await utils.as_deferred(
|
||||
transport.handler.jingle_session_init,
|
||||
client, session, content_data.content_name,
|
||||
)
|
||||
|
|
@ -570,6 +574,13 @@ class XEP_0166:
|
|||
client, session, iq_elt, jingle_elt
|
||||
):
|
||||
return sid
|
||||
|
||||
# processing is done, we can remove elements
|
||||
for content_data in session_contents.values():
|
||||
del content_data["application_data"]["desc_elt"]
|
||||
del content_data["transport_data"]["transport_elt"]
|
||||
del session["jingle_elt"]
|
||||
|
||||
if encrypted:
|
||||
for content in session["contents"].values():
|
||||
if "encryption" not in content:
|
||||
|
|
@ -742,7 +753,8 @@ class XEP_0166:
|
|||
) -> Dict[str, dict]:
|
||||
"""Parse contents elements and fill contents_dict accordingly
|
||||
|
||||
after the parsing, contents_dict will containt handlers, "desc_elt" and "transport_elt"
|
||||
after the parsing, contents_dict will containt handlers, "desc_elt" and
|
||||
"transport_elt"
|
||||
@param jingle_elt: parent <jingle> element, containing one or more <content>
|
||||
@param session: session data
|
||||
@param request: the whole request
|
||||
|
|
@ -979,6 +991,8 @@ class XEP_0166:
|
|||
client.send(xmlstream.toResponse(request, "result"))
|
||||
|
||||
|
||||
assert "jingle_elt" not in session
|
||||
session["jingle_elt"] = jingle_elt
|
||||
if not await self.host.trigger.async_point(
|
||||
"XEP-0166_on_session_initiate",
|
||||
client, session, request, jingle_elt
|
||||
|
|
@ -1017,6 +1031,7 @@ class XEP_0166:
|
|||
@param jingle_elt(domish.Element): jingle data of this session
|
||||
@param client: %(doc_client)s
|
||||
"""
|
||||
del session["jingle_elt"]
|
||||
confirmed = all(confirm_results)
|
||||
if not confirmed:
|
||||
return self.terminate(client, XEP_0166.REASON_DECLINE, session)
|
||||
|
|
@ -1025,6 +1040,7 @@ class XEP_0166:
|
|||
client, session, XEP_0166.A_SESSION_ACCEPT
|
||||
)
|
||||
jingle_elt["responder"] = session['local_jid'].full()
|
||||
session["jingle_elt"] = jingle_elt
|
||||
|
||||
# contents
|
||||
|
||||
|
|
@ -1076,6 +1092,7 @@ class XEP_0166:
|
|||
elements=False,
|
||||
)
|
||||
)
|
||||
d_list.addCallback(lambda __: session.pop("jingle_elt"))
|
||||
d_list.addCallback(lambda __: iq_elt.send())
|
||||
|
||||
def change_state(__, session):
|
||||
|
|
@ -1092,7 +1109,7 @@ class XEP_0166:
|
|||
|
||||
def on_session_terminate(self, client, request, jingle_elt, session):
|
||||
# TODO: check reason, display a message to user if needed
|
||||
log.debug("Jingle Session {} terminated".format(session["id"]))
|
||||
log.debug(f"Jingle Session {session['id']} terminated")
|
||||
try:
|
||||
reason_elt = next(jingle_elt.elements(NS_JINGLE, "reason"))
|
||||
except StopIteration:
|
||||
|
|
@ -1135,6 +1152,7 @@ class XEP_0166:
|
|||
client.send(xmlstream.toResponse(request, "result"))
|
||||
# and change the state
|
||||
session["state"] = STATE_ACTIVE
|
||||
session["jingle_elt"] = jingle_elt
|
||||
|
||||
await defer.DeferredList(self._call_plugins(
|
||||
client,
|
||||
|
|
@ -1154,6 +1172,7 @@ class XEP_0166:
|
|||
client, XEP_0166.A_START, session, app_method_name=None, elements=False
|
||||
)
|
||||
)
|
||||
negociate_dlist.addCallback(lambda __: session.pop("jingle_elt"))
|
||||
|
||||
def _on_session_cb(self, result, client, request, jingle_elt, session):
|
||||
client.send(xmlstream.toResponse(request, "result"))
|
||||
|
|
|
|||
Loading…
Reference in a new issue