|
@@ -418,6 +418,18 @@ export default class ChatRoom extends Listenable {
|
418
|
418
|
&& this.options.hiddenDomain
|
419
|
419
|
=== jid.substring(jid.indexOf('@') + 1, jid.indexOf('/'));
|
420
|
420
|
|
|
421
|
+ // Check isHiddenDomain as a way to verify a live stream URL is from a
|
|
422
|
+ // trusted source. This prevents users from trying to display arbitrary
|
|
423
|
+ // live stream URLs.
|
|
424
|
+ if (member.isHiddenDomain) {
|
|
425
|
+ const liveStreamViewURLItem
|
|
426
|
+ = pres.getElementsByTagName('live-stream-view-url')[0];
|
|
427
|
+
|
|
428
|
+ if (liveStreamViewURLItem) {
|
|
429
|
+ member.liveStreamViewURL = liveStreamViewURLItem.textContent;
|
|
430
|
+ }
|
|
431
|
+ }
|
|
432
|
+
|
421
|
433
|
const xEl = pres.querySelector('x');
|
422
|
434
|
|
423
|
435
|
if (xEl) {
|
|
@@ -517,6 +529,13 @@ export default class ChatRoom extends Listenable {
|
517
|
529
|
member.status,
|
518
|
530
|
member.identity);
|
519
|
531
|
|
|
532
|
+ if (member.liveStreamViewURL) {
|
|
533
|
+ this.eventEmitter.emit(
|
|
534
|
+ XMPPEvents.LIVE_STREAM_URL_CHANGE,
|
|
535
|
+ from,
|
|
536
|
+ member.liveStreamViewURL);
|
|
537
|
+ }
|
|
538
|
+
|
520
|
539
|
// we are reporting the status with the join
|
521
|
540
|
// so we do not want a second event about status update
|
522
|
541
|
hasStatusUpdate = false;
|
|
@@ -556,6 +575,15 @@ export default class ChatRoom extends Listenable {
|
556
|
575
|
hasStatusUpdate = true;
|
557
|
576
|
memberOfThis.status = member.status;
|
558
|
577
|
}
|
|
578
|
+
|
|
579
|
+ if (memberOfThis.liveStreamViewURL !== member.liveStreamViewURL) {
|
|
580
|
+ memberOfThis.liveStreamViewURL = member.liveStreamViewURL;
|
|
581
|
+ this.eventEmitter.emit(
|
|
582
|
+ XMPPEvents.LIVE_STREAM_URL_CHANGE,
|
|
583
|
+ from,
|
|
584
|
+ member.liveStreamViewURL);
|
|
585
|
+ }
|
|
586
|
+
|
559
|
587
|
}
|
560
|
588
|
|
561
|
589
|
// after we had fired member or room joined events, lets fire events
|
|
@@ -754,7 +782,6 @@ export default class ChatRoom extends Listenable {
|
754
|
782
|
* whether this is the focus that left
|
755
|
783
|
*/
|
756
|
784
|
onParticipantLeft(jid, skipEvents) {
|
757
|
|
-
|
758
|
785
|
delete this.lastPresences[jid];
|
759
|
786
|
|
760
|
787
|
if (skipEvents) {
|
|
@@ -812,6 +839,13 @@ export default class ChatRoom extends Listenable {
|
812
|
839
|
const membersKeys = Object.keys(this.members);
|
813
|
840
|
|
814
|
841
|
if (!isSelfPresence) {
|
|
842
|
+ if (this.members[from].liveStreamViewURL) {
|
|
843
|
+ this.eventEmitter.emit(
|
|
844
|
+ XMPPEvents.LIVE_STREAM_URL_CHANGE,
|
|
845
|
+ from,
|
|
846
|
+ undefined);
|
|
847
|
+ }
|
|
848
|
+
|
815
|
849
|
delete this.members[from];
|
816
|
850
|
this.onParticipantLeft(from, false);
|
817
|
851
|
} else if (membersKeys.length > 0) {
|