2015-10-31 18:10:57 -04:00
< ? php
/**
* Name : XMPP ( Jabber )
* Description : Embedded XMPP ( Jabber ) client
* Version : 0.1
* Author : Michael Vogel < https :// pirati . ca / profile / heluecht >
2019-06-01 08:21:22 -04:00
* Status : Unsupported
2015-10-31 18:10:57 -04:00
*/
2018-07-24 17:54:00 -04:00
2017-11-25 21:30:56 -05:00
use Friendica\App ;
2017-11-06 18:55:24 -05:00
use Friendica\Core\Config ;
2018-12-26 02:28:16 -05:00
use Friendica\Core\Hook ;
2018-01-22 14:03:11 -05:00
use Friendica\Core\L10n ;
2018-10-31 10:55:15 -04:00
use Friendica\Core\Renderer ;
2019-12-15 18:47:24 -05:00
use Friendica\DI ;
2018-11-08 11:45:19 -05:00
use Friendica\Util\Strings ;
2017-11-06 18:55:24 -05:00
2017-11-25 21:30:56 -05:00
function xmpp_install ()
{
2018-12-26 02:28:16 -05:00
Hook :: register ( 'addon_settings' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings' );
Hook :: register ( 'addon_settings_post' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings_post' );
Hook :: register ( 'page_end' , 'addon/xmpp/xmpp.php' , 'xmpp_script' );
Hook :: register ( 'logged_in' , 'addon/xmpp/xmpp.php' , 'xmpp_login' );
2015-10-31 18:10:57 -04:00
}
2017-11-25 21:30:56 -05:00
function xmpp_uninstall ()
{
2018-12-26 02:28:16 -05:00
Hook :: unregister ( 'addon_settings' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings' );
Hook :: unregister ( 'addon_settings_post' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings_post' );
Hook :: unregister ( 'page_end' , 'addon/xmpp/xmpp.php' , 'xmpp_script' );
Hook :: unregister ( 'logged_in' , 'addon/xmpp/xmpp.php' , 'xmpp_login' );
2015-10-31 18:10:57 -04:00
}
2018-01-20 08:57:41 -05:00
function xmpp_addon_settings_post ()
2017-11-25 21:30:56 -05:00
{
2018-07-24 17:54:00 -04:00
if ( ! local_user () || empty ( $_POST [ 'xmpp-settings-submit' ])) {
2015-11-11 16:27:11 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
2018-07-24 17:54:00 -04:00
2020-01-18 10:54:49 -05:00
DI :: pConfig () -> set ( local_user (), 'xmpp' , 'enabled' , $_POST [ 'xmpp_enabled' ] ? ? false );
DI :: pConfig () -> set ( local_user (), 'xmpp' , 'individual' , $_POST [ 'xmpp_individual' ] ? ? false );
DI :: pConfig () -> set ( local_user (), 'xmpp' , 'bosh_proxy' , $_POST [ 'xmpp_bosh_proxy' ] ? ? '' );
2015-11-11 16:27:11 -05:00
2020-01-18 14:52:33 -05:00
info ( DI :: l10n () -> t ( 'XMPP settings updated.' ) . EOL );
2015-11-11 16:27:11 -05:00
}
2018-01-20 08:57:41 -05:00
function xmpp_addon_settings ( App $a , & $s )
2017-11-25 21:30:56 -05:00
{
if ( ! local_user ()) {
2015-11-11 16:27:11 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
2015-11-11 16:27:11 -05:00
/* Add our stylesheet to the xmpp so we can make our settings look nice */
2019-12-30 14:02:08 -05:00
DI :: page ()[ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . DI :: baseUrl () -> get () . '/addon/xmpp/xmpp.css' . '" media="all" />' . " \r \n " ;
2015-11-11 16:27:11 -05:00
/* Get the current state of our config variable */
2020-01-18 10:50:56 -05:00
$enabled = intval ( DI :: pConfig () -> get ( local_user (), 'xmpp' , 'enabled' ));
2015-11-11 16:27:11 -05:00
$enabled_checked = (( $enabled ) ? ' checked="checked" ' : '' );
2020-01-18 10:50:56 -05:00
$individual = intval ( DI :: pConfig () -> get ( local_user (), 'xmpp' , 'individual' ));
2015-11-11 16:27:11 -05:00
$individual_checked = (( $individual ) ? ' checked="checked" ' : '' );
2020-01-18 10:50:56 -05:00
$bosh_proxy = DI :: pConfig () -> get ( local_user (), " xmpp " , " bosh_proxy " );
2015-11-11 16:27:11 -05:00
/* Add some HTML to the existing form */
$s .= '<span id="settings_xmpp_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_xmpp_expanded\'); openClose(\'settings_xmpp_inflated\');">' ;
2020-01-18 14:52:33 -05:00
$s .= '<h3>' . DI :: l10n () -> t ( 'XMPP-Chat (Jabber)' ) . '</h3>' ;
2015-11-11 16:27:11 -05:00
$s .= '</span>' ;
$s .= '<div id="settings_xmpp_expanded" class="settings-block" style="display: none;">' ;
$s .= '<span class="fakelink" onclick="openClose(\'settings_xmpp_expanded\'); openClose(\'settings_xmpp_inflated\');">' ;
2020-01-18 14:52:33 -05:00
$s .= '<h3>' . DI :: l10n () -> t ( 'XMPP-Chat (Jabber)' ) . '</h3>' ;
2015-11-11 16:27:11 -05:00
$s .= '</span>' ;
$s .= '<div id="xmpp-settings-wrapper">' ;
2020-01-18 14:52:33 -05:00
$s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . DI :: l10n () -> t ( 'Enable Webchat' ) . '</label>' ;
2015-11-11 16:27:11 -05:00
$s .= '<input id="xmpp-enabled" type="checkbox" name="xmpp_enabled" value="1" ' . $enabled_checked . '/>' ;
$s .= '<div class="clear"></div>' ;
2017-11-06 18:55:24 -05:00
if ( Config :: get ( " xmpp " , " central_userbase " )) {
2020-01-18 14:52:33 -05:00
$s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . DI :: l10n () -> t ( 'Individual Credentials' ) . '</label>' ;
2015-11-11 16:27:11 -05:00
$s .= '<input id="xmpp-individual" type="checkbox" name="xmpp_individual" value="1" ' . $individual_checked . '/>' ;
$s .= '<div class="clear"></div>' ;
}
2020-01-18 10:50:56 -05:00
if ( ! Config :: get ( " xmpp " , " central_userbase " ) || DI :: pConfig () -> get ( local_user (), " xmpp " , " individual " )) {
2020-01-18 14:52:33 -05:00
$s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">' . DI :: l10n () -> t ( 'Jabber BOSH host' ) . '</label>' ;
2017-11-25 21:30:56 -05:00
$s .= ' <input id="xmpp-bosh-proxy" type="text" name="xmpp_bosh_proxy" value="' . $bosh_proxy . '" />' ;
2015-11-11 16:27:11 -05:00
$s .= '<div class="clear"></div>' ;
}
$s .= '</div>' ;
/* provide a submit button */
2020-01-18 14:52:33 -05:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . DI :: l10n () -> t ( 'Save Settings' ) . '" /></div></div>' ;
2015-11-11 16:27:11 -05:00
}
2017-11-25 21:30:56 -05:00
function xmpp_login ()
{
2018-07-24 17:54:00 -04:00
if ( empty ( $_SESSION [ 'allow_api' ])) {
2018-11-08 11:45:19 -05:00
$password = Strings :: getRandomHex ( 16 );
2020-01-18 10:54:49 -05:00
DI :: pConfig () -> set ( local_user (), 'xmpp' , 'password' , $password );
2015-10-31 18:10:57 -04:00
}
}
2018-01-20 08:57:41 -05:00
function xmpp_addon_admin ( App $a , & $o )
2017-11-25 21:30:56 -05:00
{
2018-10-31 10:55:15 -04:00
$t = Renderer :: getMarkupTemplate ( 'admin.tpl' , 'addon/xmpp/' );
2015-10-31 18:10:57 -04:00
2018-10-31 10:55:15 -04:00
$o = Renderer :: replaceMacros ( $t , [
2020-01-18 14:52:33 -05:00
'$submit' => DI :: l10n () -> t ( 'Save Settings' ),
'$bosh_proxy' => [ 'bosh_proxy' , DI :: l10n () -> t ( 'Jabber BOSH host' ), Config :: get ( 'xmpp' , 'bosh_proxy' ), '' ],
'$central_userbase' => [ 'central_userbase' , DI :: l10n () -> t ( 'Use central userbase' ), Config :: get ( 'xmpp' , 'central_userbase' ), DI :: l10n () -> t ( 'If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the "auth_ejabberd.php" script.' )],
2018-01-15 08:15:33 -05:00
]);
2015-10-31 18:10:57 -04:00
}
2018-01-20 08:57:41 -05:00
function xmpp_addon_admin_post ()
2017-11-25 21:30:56 -05:00
{
2018-11-30 09:11:56 -05:00
$bosh_proxy = ( ! empty ( $_POST [ 'bosh_proxy' ]) ? trim ( $_POST [ 'bosh_proxy' ]) : '' );
$central_userbase = ( ! empty ( $_POST [ 'central_userbase' ]) ? intval ( $_POST [ 'central_userbase' ]) : false );
2018-07-24 17:54:00 -04:00
2017-11-25 21:30:56 -05:00
Config :: set ( 'xmpp' , 'bosh_proxy' , $bosh_proxy );
Config :: set ( 'xmpp' , 'central_userbase' , $central_userbase );
2018-07-24 17:54:00 -04:00
2020-01-18 14:52:33 -05:00
info ( DI :: l10n () -> t ( 'Settings updated.' ) . EOL );
2015-10-31 18:10:57 -04:00
}
2017-11-25 21:30:56 -05:00
function xmpp_script ( App $a )
{
xmpp_converse ( $a );
2015-10-31 18:10:57 -04:00
}
2017-11-25 21:30:56 -05:00
function xmpp_converse ( App $a )
{
if ( ! local_user ()) {
2015-10-31 18:10:57 -04:00
return ;
2017-11-25 21:30:56 -05:00
}
2015-10-31 18:10:57 -04:00
2019-10-13 12:07:27 -04:00
if (( $_GET [ 'mode' ] ? ? '' ) == 'minimal' ) {
2015-10-31 18:10:57 -04:00
return ;
2017-11-25 21:30:56 -05:00
}
2015-10-31 18:10:57 -04:00
2019-12-15 19:12:07 -05:00
if ( DI :: mode () -> isMobile () || DI :: mode () -> isMobile ()) {
2015-11-02 01:05:29 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
2015-11-02 01:05:29 -05:00
2020-01-18 10:50:56 -05:00
if ( ! DI :: pConfig () -> get ( local_user (), " xmpp " , " enabled " )) {
2015-11-11 16:27:11 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
2015-11-11 16:27:11 -05:00
2019-12-15 19:30:33 -05:00
if ( in_array ( DI :: args () -> getQueryString (), [ " admin/federation/ " ])) {
2016-01-17 08:54:31 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
2016-01-17 08:54:31 -05:00
2019-12-30 14:02:08 -05:00
DI :: page ()[ 'htmlhead' ] .= '<link type="text/css" rel="stylesheet" media="screen" href="addon/xmpp/converse/css/converse.css" />' . " \n " ;
DI :: page ()[ 'htmlhead' ] .= '<script src="addon/xmpp/converse/builds/converse.min.js"></script>' . " \n " ;
2015-10-31 18:10:57 -04:00
2020-01-18 10:50:56 -05:00
if ( Config :: get ( " xmpp " , " central_userbase " ) && ! DI :: pConfig () -> get ( local_user (), " xmpp " , " individual " )) {
2017-11-06 18:55:24 -05:00
$bosh_proxy = Config :: get ( " xmpp " , " bosh_proxy " );
2015-10-31 18:10:57 -04:00
2020-01-18 10:50:56 -05:00
$password = DI :: pConfig () -> get ( local_user (), " xmpp " , " password " , '' , true );
2015-10-31 18:10:57 -04:00
if ( $password == " " ) {
2018-11-08 11:45:19 -05:00
$password = Strings :: getRandomHex ( 16 );
2020-01-18 10:54:49 -05:00
DI :: pConfig () -> set ( local_user (), " xmpp " , " password " , $password );
2015-10-31 18:10:57 -04:00
}
2019-12-15 18:47:24 -05:00
$jid = $a -> user [ " nickname " ] . " @ " . DI :: baseUrl () -> getHostname () . " /converse- " . Strings :: getRandomHex ( 5 );
2015-10-31 18:10:57 -04:00
$auto_login = " auto_login: true,
authentication : 'login' ,
jid : '$jid' ,
password : '$password' ,
2015-11-11 16:27:11 -05:00
allow_logout : false , " ;
} else {
2020-01-18 10:50:56 -05:00
$bosh_proxy = DI :: pConfig () -> get ( local_user (), " xmpp " , " bosh_proxy " );
2015-11-11 16:27:11 -05:00
2015-10-31 18:10:57 -04:00
$auto_login = " " ;
2015-11-11 16:27:11 -05:00
}
2017-11-25 21:30:56 -05:00
if ( $bosh_proxy == " " ) {
2015-11-11 16:27:11 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
2015-10-31 18:10:57 -04:00
2019-10-13 12:10:04 -04:00
if ( in_array ( $a -> argv [ 0 ], [ " delegation " , " logout " ])) {
2015-10-31 18:10:57 -04:00
$additional_commands = " converse.user.logout(); \n " ;
2017-11-25 21:30:56 -05:00
} else {
2015-10-31 18:10:57 -04:00
$additional_commands = " " ;
2017-11-25 21:30:56 -05:00
}
2015-10-31 18:10:57 -04:00
$on_ready = " " ;
$initialize = " converse.initialize( {
bosh_service_url : '$bosh_proxy' ,
keepalive : true ,
message_carbons : false ,
forward_messages : false ,
play_sounds : true ,
sounds_path : 'addon/xmpp/converse/sounds/' ,
roster_groups : false ,
show_controlbox_by_default : false ,
show_toolbar : true ,
allow_contact_removal : false ,
allow_registration : false ,
hide_offline_users : true ,
allow_chat_pending_contacts : false ,
allow_dragresize : true ,
auto_away : 0 ,
auto_xa : 0 ,
csi_waiting_time : 300 ,
auto_reconnect : true ,
$auto_login
xhr_user_search : false
}); \n " ;
2019-12-30 14:02:08 -05:00
DI :: page ()[ 'htmlhead' ] .= " <script>
2015-10-31 18:10:57 -04:00
require ([ 'converse' ], function ( converse ) {
$initialize
converse . listen . on ( 'ready' , function ( event ) {
$on_ready
});
$additional_commands
});
</ script > " ;
}