2014-03-12 14:52:47 +01:00
/ *
Jappix - An open social platform
These are the IQ JS scripts for Jappix
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
License : AGPL
Author : Valérian Saliou
* /
// Bundle
var IQ = ( function ( ) {
/ * *
* Alias of this
* @ private
* /
var self = { } ;
2014-11-25 20:12:58 +01:00
/ * *
* Handles OOB request
* @ private
* @ param { string } iqType
* @ param { string } iqID
* @ param { object } iqNode
* @ return { undefined }
* /
self . _handleOOBRequest = function ( iqFrom , iqID , iqNode ) {
try {
/* REF: http://xmpp.org/extensions/xep-0066.html */
OOB . handle ( iqFrom , iqID , 'iq' , iqNode ) ;
Console . log ( 'Received IQ OOB request: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleOOBRequest' , e ) ;
}
} ;
/ * *
* Handles OOB reply
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ param { string } iqType
* @ param { string } iqID
* @ param { object } iqNode
* @ return { undefined }
* /
self . _handleOOBReply = function ( iqResponse , iqFrom , iqType , iqID , iqNode ) {
try {
// Get the values
var oob _url = DataStore . getDB ( Connection . desktop _hash , 'send/url' , iqID ) ;
var oob _desc = DataStore . getDB ( Connection . desktop _hash , 'send/desc' , iqID ) ;
var notif _id = hex _md5 ( oob _url + oob _desc + iqType + iqFrom + iqID ) ;
if ( $ ( iqNode ) . find ( 'error' ) . size ( ) ) {
// Error?
if ( $ ( iqNode ) . find ( 'error not-acceptable' ) . size ( ) ) {
// Rejected?
Notification . create ( 'send_reject' , iqFrom , [ iqFrom , oob _url , 'iq' , iqID , iqNode ] , oob _desc , notif _id ) ;
} else {
// Failed?
Notification . create ( 'send_fail' , iqFrom , [ iqFrom , oob _url , 'iq' , iqID , iqNode ] , oob _desc , notif _id ) ;
}
// Remove the file
$ . get ( oob _url + '&action=remove' ) ;
} else if ( iqType == 'result' ) {
// Success?
Notification . create ( 'send_accept' , iqFrom , [ iqFrom , oob _url , 'iq' , iqID , iqNode ] , oob _desc , notif _id ) ;
}
} catch ( e ) {
Console . error ( 'IQ._handleOOBReply' , e ) ;
}
} ;
/ * *
* Handles Software Version
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handleSoftwareVersion = function ( iqResponse , iqFrom ) {
try {
/* REF: http://xmpp.org/extensions/xep-0092.html */
iqQuery = iqResponse . setQuery ( NS _VERSION ) ;
iqQuery . appendChild ( iqResponse . buildNode ( 'name' , { 'xmlns' : NS _VERSION } , Caps . disco _infos . identity . name ) ) ;
iqQuery . appendChild ( iqResponse . buildNode ( 'version' , { 'xmlns' : NS _VERSION } , JAPPIX _VERSION ) ) ;
iqQuery . appendChild ( iqResponse . buildNode ( 'os' , { 'xmlns' : NS _VERSION } , BrowserDetect . OS ) ) ;
con . send ( iqResponse ) ;
Console . log ( 'Received software version query: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleSoftwareVersion' , e ) ;
}
} ;
/ * *
* Handles Last Activity
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handleLastActivity = function ( iqResponse , iqFrom ) {
try {
/* REF: http://xmpp.org/extensions/xep-0012.html */
iqQuery = iqResponse . setQuery ( NS _LAST ) ;
iqQuery . setAttribute ( 'seconds' , DateUtils . getLastActivity ( ) ) ;
con . send ( iqResponse ) ;
Console . log ( 'Received last activity query: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleLastActivity' , e ) ;
}
} ;
/ * *
* Handles Privacy Lists
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ param { string } iqQuery
* @ return { undefined }
* /
self . _handlePrivacyLists = function ( iqResponse , iqFrom , iqQuery ) {
try {
// REF : http://xmpp.org/extensions/xep-0016.html
// Roster push
con . send ( iqResponse ) ;
// Get the lists
$ ( iqQuery ) . find ( 'list' ) . each ( function ( ) {
Privacy . get ( $ ( this ) . attr ( 'name' ) ) ;
} ) ;
Console . log ( 'Received privacy lists push: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handlePrivacyLists' , e ) ;
}
} ;
/ * *
* Handles Roster Push
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ param { string } iqQuery
* @ return { undefined }
* /
self . _handleRosterPush = function ( iqResponse , iqFrom , iqQuery ) {
try {
// REF : http://xmpp.org/extensions/xep-0092.html
// Roster push
con . send ( iqResponse ) ;
// Get the values
$ ( iqQuery ) . find ( 'item' ) . each ( function ( ) {
Roster . parse ( $ ( this ) , 'presence' ) ;
} ) ;
Console . log ( 'Received roster push: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleRosterPush' , e ) ;
}
} ;
/ * *
* Handles Roster Item Exchange
* @ private
* @ param { object } iqNode
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handleRosterItemExchange = function ( iqNode , iqFrom ) {
try {
// Open a new notification
Notification . create ( 'rosterx' , iqFrom , [ iqNode ] , '' ) ;
Console . log ( 'Roster Item Exchange from: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleRosterItemExchange' , e ) ;
}
} ;
/ * *
* Handles Disco Info
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handleDiscoInfo = function ( iqResponse , iqFrom ) {
try {
/* REF: http://xmpp.org/extensions/xep-0030.html */
iqQuery = iqResponse . setQuery ( NS _DISCO _INFO ) ;
// We set the name of the client
iqQuery . appendChild ( iqResponse . buildNode ( 'identity' , {
'category' : Caps . disco _infos . identity . category ,
'type' : Caps . disco _infos . identity . type ,
'name' : Caps . disco _infos . identity . name ,
'xmlns' : NS _DISCO _INFO
} ) ) ;
// We set all the supported features
var disco _infos = Caps . myDiscoInfos ( ) ;
$ . each ( disco _infos , function ( i , disco _info ) {
iqQuery . appendChild ( iqResponse . buildNode ( 'feature' , { 'var' : disco _info , 'xmlns' : NS _DISCO _INFO } ) ) ;
} ) ;
con . send ( iqResponse ) ;
Console . log ( 'Received disco#infos query: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleDiscoInfo' , e ) ;
}
} ;
/ * *
* Handles User Time
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handleUserTime = function ( iqResponse , iqFrom ) {
try {
/* REF: http://xmpp.org/extensions/xep-0202.html */
var iqTime = iqResponse . appendNode ( 'time' , {
'xmlns' : NS _URN _TIME
} ) ;
iqTime . appendChild ( iqResponse . buildNode ( 'tzo' , {
'xmlns' : NS _URN _TIME
} , DateUtils . getTZO ( ) ) ) ;
iqTime . appendChild ( iqResponse . buildNode ( 'utc' , {
'xmlns' : NS _URN _TIME
} , DateUtils . getXMPPTime ( 'utc' ) ) ) ;
con . send ( iqResponse ) ;
Console . log ( 'Received local time query: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleUserTime' , e ) ;
}
} ;
/ * *
* Handles Ping
* @ private
* @ param { object } iqResponse
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handlePing = function ( iqResponse , iqFrom ) {
try {
/* REF: http://xmpp.org/extensions/xep-0199.html */
con . send ( iqResponse ) ;
Console . log ( 'Received a ping: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handlePing' , e ) ;
}
} ;
/ * *
* Handles Jingle
* @ private
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _handleJingle = function ( iqFrom ) {
try {
/* REF: http://xmpp.org/extensions/xep-0166.html */
// Handled via JSJaCJingle.route() (see above)
Console . log ( 'Received a Jingle packet: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._handleJingle' , e ) ;
}
} ;
/ * *
* Raises a not implemented error
* @ private
* @ param { object } iqResponse
* @ param { object } iqNode
* @ param { string } iqFrom
* @ return { undefined }
* /
self . _raiseNotImplemented = function ( iqResponse , iqNode , iqFrom ) {
try {
// Change IQ type
iqResponse . setType ( 'error' ) ;
// Append stanza content
for ( var c = 0 ; c < iqNode . childNodes . length ; c ++ ) {
iqResponse . getNode ( ) . appendChild ( iqNode . childNodes . item ( c ) . cloneNode ( true ) ) ;
}
// Append error content
var iqError = iqResponse . appendNode ( 'error' , { 'xmlns' : NS _CLIENT , 'code' : '501' , 'type' : 'cancel' } ) ;
iqError . appendChild ( iqResponse . buildNode ( 'feature-not-implemented' , { 'xmlns' : NS _STANZAS } ) ) ;
iqError . appendChild ( iqResponse . buildNode ( 'text' , { 'xmlns' : NS _STANZAS } , Common . _e ( "The feature requested is not implemented by the recipient or server and therefore cannot be processed." ) ) ) ;
con . send ( iqResponse ) ;
Console . log ( 'Received an unsupported IQ query from: ' + iqFrom ) ;
} catch ( e ) {
Console . error ( 'IQ._raiseNotImplemented' , e ) ;
}
} ;
2014-04-08 20:14:28 +02:00
/ * *
2014-03-12 14:52:47 +01:00
* Handles an incoming IQ packet
* @ public
* @ param { object } iq
* @ return { undefined }
* /
self . handle = function ( iq ) {
try {
// Gets the IQ content
var iqNode = iq . getNode ( ) ;
var iqFrom = Common . fullXID ( Common . getStanzaFrom ( iq ) ) ;
var iqID = iq . getID ( ) ;
var iqQueryXMLNS = iq . getQueryXMLNS ( ) ;
var iqQuery = iq . getQuery ( ) ;
var iqType = iq . getType ( ) ;
// Build the response
var iqResponse = new JSJaCIQ ( ) ;
iqResponse . setID ( iqID ) ;
iqResponse . setTo ( iqFrom ) ;
iqResponse . setType ( 'result' ) ;
// OOB request
if ( ( iqQueryXMLNS == NS _IQOOB ) && ( iqType == 'set' ) ) {
2014-11-25 20:12:58 +01:00
self . _handleOOBRequest ( iqFrom , iqID , iqNode ) ;
2014-03-12 14:52:47 +01:00
}
// OOB reply
else if ( DataStore . getDB ( Connection . desktop _hash , 'send/url' , iqID ) ) {
2014-11-25 20:12:58 +01:00
self . _handleOOBReply ( iqResponse , iqFrom , iqType , iqID , iqNode ) ;
2014-03-12 14:52:47 +01:00
}
// Software version query
else if ( ( iqQueryXMLNS == NS _VERSION ) && ( iqType == 'get' ) ) {
2014-11-25 20:12:58 +01:00
self . _handleSoftwareVersion ( iqResponse , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// Last activity query
else if ( ( iqQueryXMLNS == NS _LAST ) && ( iqType == 'get' ) ) {
2014-11-25 20:12:58 +01:00
self . _handleLastActivity ( iqResponse , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// Privacy lists push
2014-04-08 20:14:28 +02:00
else if ( ( iqQueryXMLNS == NS _PRIVACY ) && ( iqType == 'set' ) && Common . isSafeStanza ( iq ) ) {
2014-11-25 20:12:58 +01:00
self . _handlePrivacyLists ( iqResponse , iqFrom , iqQuery ) ;
2014-03-12 14:52:47 +01:00
}
// Roster push
2014-04-08 20:14:28 +02:00
else if ( ( iqQueryXMLNS == NS _ROSTER ) && ( iqType == 'set' ) && Common . isSafeStanza ( iq ) ) {
2014-11-25 20:12:58 +01:00
self . _handleRosterPush ( iqResponse , iqFrom , iqQuery ) ;
2014-03-12 14:52:47 +01:00
}
// Roster Item Exchange query
else if ( $ ( iqNode ) . find ( 'x[xmlns="' + NS _ROSTERX + '"]' ) . size ( ) ) {
2014-11-25 20:12:58 +01:00
self . _handleRosterItemExchange ( iqNode , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// Disco info query
else if ( ( iqQueryXMLNS == NS _DISCO _INFO ) && ( iqType == 'get' ) ) {
2014-11-25 20:12:58 +01:00
self . _handleDiscoInfo ( iqResponse , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// User time query
else if ( $ ( iqNode ) . find ( 'time' ) . size ( ) && ( iqType == 'get' ) ) {
2014-11-25 20:12:58 +01:00
self . _handleUserTime ( iqResponse , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// Ping
else if ( $ ( iqNode ) . find ( 'ping' ) . size ( ) && ( iqType == 'get' ) ) {
2014-11-25 20:12:58 +01:00
self . _handlePing ( iqResponse , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// Jingle
else if ( $ ( iqNode ) . find ( 'jingle' ) . size ( ) ) {
2014-11-25 20:12:58 +01:00
self . _handleJingle ( iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
// Not implemented
else if ( ! $ ( iqNode ) . find ( 'error' ) . size ( ) && ( ( iqType == 'get' ) || ( iqType == 'set' ) ) ) {
2014-11-25 20:12:58 +01:00
self . _raiseNotImplemented ( iqResponse , iqNode , iqFrom ) ;
2014-03-12 14:52:47 +01:00
}
} catch ( e ) {
Console . error ( 'IQ.handle' , e ) ;
}
} ;
/ * *
* Return class scope
* /
return self ;
} ) ( ) ;