2015-10-31 18:10:57 -04:00
< ? php
2017-11-25 21:30:56 -05:00
2015-10-31 18:10:57 -04:00
/**
* Name : XMPP ( Jabber )
* Description : Embedded XMPP ( Jabber ) client
* Version : 0.1
* Author : Michael Vogel < https :// pirati . ca / profile / heluecht >
*/
2017-11-25 21:30:56 -05:00
use Friendica\App ;
2018-01-16 19:51:12 -05:00
use Friendica\Core\Addon ;
2017-11-06 18:55:24 -05:00
use Friendica\Core\Config ;
use Friendica\Core\PConfig ;
2017-11-25 21:30:56 -05:00
function xmpp_install ()
{
2018-01-16 19:51:12 -05:00
Addon :: registerHook ( 'plugin_settings' , 'addon/xmpp/xmpp.php' , 'xmpp_plugin_settings' );
Addon :: registerHook ( 'plugin_settings_post' , 'addon/xmpp/xmpp.php' , 'xmpp_plugin_settings_post' );
Addon :: registerHook ( 'page_end' , 'addon/xmpp/xmpp.php' , 'xmpp_script' );
Addon :: registerHook ( '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-01-16 19:51:12 -05:00
Addon :: unregisterHook ( 'plugin_settings' , 'addon/xmpp/xmpp.php' , 'xmpp_plugin_settings' );
Addon :: unregisterHook ( 'plugin_settings_post' , 'addon/xmpp/xmpp.php' , 'xmpp_plugin_settings_post' );
Addon :: unregisterHook ( 'page_end' , 'addon/xmpp/xmpp.php' , 'xmpp_script' );
Addon :: unregisterHook ( '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_plugin_settings_post ()
{
if ( ! local_user () || ( ! x ( $_POST , 'xmpp-settings-submit' ))) {
2015-11-11 16:27:11 -05:00
return ;
2017-11-25 21:30:56 -05:00
}
PConfig :: set ( local_user (), 'xmpp' , 'enabled' , intval ( $_POST [ 'xmpp_enabled' ]));
PConfig :: set ( local_user (), 'xmpp' , 'individual' , intval ( $_POST [ 'xmpp_individual' ]));
PConfig :: set ( local_user (), 'xmpp' , 'bosh_proxy' , $_POST [ 'xmpp_bosh_proxy' ]);
2015-11-11 16:27:11 -05:00
2017-11-25 21:30:56 -05:00
info ( t ( 'XMPP settings updated.' ) . EOL );
2015-11-11 16:27:11 -05:00
}
2017-11-25 21:30:56 -05:00
function xmpp_plugin_settings ( App $a , & $s )
{
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 */
$a -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $a -> get_baseurl () . '/addon/xmpp/xmpp.css' . '" media="all" />' . " \r \n " ;
/* Get the current state of our config variable */
2017-11-25 21:30:56 -05:00
$enabled = intval ( PConfig :: get ( local_user (), 'xmpp' , 'enabled' ));
2015-11-11 16:27:11 -05:00
$enabled_checked = (( $enabled ) ? ' checked="checked" ' : '' );
2017-11-25 21:30:56 -05:00
$individual = intval ( PConfig :: get ( local_user (), 'xmpp' , 'individual' ));
2015-11-11 16:27:11 -05:00
$individual_checked = (( $individual ) ? ' checked="checked" ' : '' );
2017-11-25 21:30:56 -05:00
$bosh_proxy = 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\');">' ;
$s .= '<h3>' . t ( 'XMPP-Chat (Jabber)' ) . '</h3>' ;
$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\');">' ;
$s .= '<h3>' . t ( 'XMPP-Chat (Jabber)' ) . '</h3>' ;
$s .= '</span>' ;
$s .= '<div id="xmpp-settings-wrapper">' ;
$s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . t ( 'Enable Webchat' ) . '</label>' ;
$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 " )) {
2015-11-11 16:27:11 -05:00
$s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . t ( 'Individual Credentials' ) . '</label>' ;
$s .= '<input id="xmpp-individual" type="checkbox" name="xmpp_individual" value="1" ' . $individual_checked . '/>' ;
$s .= '<div class="clear"></div>' ;
}
2017-11-25 21:30:56 -05:00
if ( ! Config :: get ( " xmpp " , " central_userbase " ) || PConfig :: get ( local_user (), " xmpp " , " individual " )) {
$s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">' . t ( 'Jabber BOSH host' ) . '</label>' ;
$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 */
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . t ( 'Save Settings' ) . '" /></div></div>' ;
}
2017-11-25 21:30:56 -05:00
function xmpp_login ()
{
2015-10-31 18:10:57 -04:00
if ( ! $_SESSION [ " allow_api " ]) {
2017-11-25 21:31:10 -05:00
$password = random_string ( 16 );
2017-11-06 18:55:24 -05:00
PConfig :: set ( local_user (), " xmpp " , " password " , $password );
2015-10-31 18:10:57 -04:00
}
}
2017-11-25 21:30:56 -05:00
function xmpp_plugin_admin ( App $a , & $o )
{
2015-11-11 16:27:11 -05:00
$t = get_markup_template ( " admin.tpl " , " addon/xmpp/ " );
2015-10-31 18:10:57 -04:00
2018-01-15 08:15:33 -05:00
$o = replace_macros ( $t , [
2015-11-11 16:27:11 -05:00
'$submit' => t ( 'Save Settings' ),
2018-01-15 08:15:33 -05:00
'$bosh_proxy' => [ 'bosh_proxy' , t ( 'Jabber BOSH host' ), Config :: get ( 'xmpp' , 'bosh_proxy' ), '' ],
'$central_userbase' => [ 'central_userbase' , t ( 'Use central userbase' ), Config :: get ( 'xmpp' , 'central_userbase' ), 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.' )],
]);
2015-10-31 18:10:57 -04:00
}
2017-11-25 21:30:56 -05:00
function xmpp_plugin_admin_post ()
{
$bosh_proxy = (( x ( $_POST , 'bosh_proxy' )) ? trim ( $_POST [ 'bosh_proxy' ]) : '' );
$central_userbase = (( x ( $_POST , 'central_userbase' )) ? intval ( $_POST [ 'central_userbase' ]) : false );
Config :: set ( 'xmpp' , 'bosh_proxy' , $bosh_proxy );
Config :: set ( 'xmpp' , 'central_userbase' , $central_userbase );
info ( 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
2017-11-25 21:30:56 -05: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
2017-11-25 21:30:56 -05:00
if ( $a -> is_mobile || $a -> is_tablet ) {
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
2017-11-25 21:30:56 -05:00
if ( ! 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
2018-01-15 08:15:33 -05:00
if ( in_array ( $a -> query_string , [ " 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
2017-11-25 21:30:56 -05:00
$a -> page [ 'htmlhead' ] .= '<link type="text/css" rel="stylesheet" media="screen" href="addon/xmpp/converse/css/converse.css" />' . " \n " ;
$a -> page [ 'htmlhead' ] .= '<script src="addon/xmpp/converse/builds/converse.min.js"></script>' . " \n " ;
2015-10-31 18:10:57 -04:00
2017-11-25 21:30:56 -05:00
if ( Config :: get ( " xmpp " , " central_userbase " ) && ! 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
2018-01-06 19:56:32 -05:00
$password = PConfig :: get ( local_user (), " xmpp " , " password " , '' , true );
2015-10-31 18:10:57 -04:00
if ( $password == " " ) {
2017-11-25 21:30:56 -05:00
$password = random_string ( 16 );
2017-11-06 18:55:24 -05:00
PConfig :: set ( local_user (), " xmpp " , " password " , $password );
2015-10-31 18:10:57 -04:00
}
2017-11-25 21:30:56 -05:00
$jid = $a -> user [ " nickname " ] . " @ " . $a -> get_hostname () . " /converse- " . random_string ( 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 {
2017-11-06 18:55:24 -05:00
$bosh_proxy = 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
2018-01-15 08:15:33 -05:00
if ( in_array ( $a -> argv [ 0 ], [ " manage " , " 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 " ;
$a -> page [ 'htmlhead' ] .= " <script>
require ([ 'converse' ], function ( converse ) {
$initialize
converse . listen . on ( 'ready' , function ( event ) {
$on_ready
});
$additional_commands
});
</ script > " ;
}