2015-10-31 22:10:57 +00:00
< ? php
/**
* Name : XMPP ( Jabber )
* Description : Embedded XMPP ( Jabber ) client
* Version : 0.1
* Author : Michael Vogel < https :// pirati . ca / profile / heluecht >
*/
2018-07-24 21:54:00 +00:00
2017-11-26 02:30:56 +00:00
use Friendica\App ;
2018-01-17 00:51:12 +00:00
use Friendica\Core\Addon ;
2017-11-06 23:55:24 +00:00
use Friendica\Core\Config ;
2018-01-22 19:03:11 +00:00
use Friendica\Core\L10n ;
2017-11-06 23:55:24 +00:00
use Friendica\Core\PConfig ;
2018-10-31 14:55:15 +00:00
use Friendica\Core\Renderer ;
2018-11-08 16:45:19 +00:00
use Friendica\Util\Strings ;
2017-11-06 23:55:24 +00:00
2017-11-26 02:30:56 +00:00
function xmpp_install ()
{
2018-01-20 13:57:41 +00:00
Addon :: registerHook ( 'addon_settings' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings' );
Addon :: registerHook ( 'addon_settings_post' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings_post' );
2018-01-17 00:51:12 +00:00
Addon :: registerHook ( 'page_end' , 'addon/xmpp/xmpp.php' , 'xmpp_script' );
Addon :: registerHook ( 'logged_in' , 'addon/xmpp/xmpp.php' , 'xmpp_login' );
2015-10-31 22:10:57 +00:00
}
2017-11-26 02:30:56 +00:00
function xmpp_uninstall ()
{
2018-01-20 13:57:41 +00:00
Addon :: unregisterHook ( 'addon_settings' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings' );
Addon :: unregisterHook ( 'addon_settings_post' , 'addon/xmpp/xmpp.php' , 'xmpp_addon_settings_post' );
2018-01-17 00:51:12 +00:00
Addon :: unregisterHook ( 'page_end' , 'addon/xmpp/xmpp.php' , 'xmpp_script' );
Addon :: unregisterHook ( 'logged_in' , 'addon/xmpp/xmpp.php' , 'xmpp_login' );
2015-10-31 22:10:57 +00:00
}
2018-01-20 13:57:41 +00:00
function xmpp_addon_settings_post ()
2017-11-26 02:30:56 +00:00
{
2018-07-24 21:54:00 +00:00
if ( ! local_user () || empty ( $_POST [ 'xmpp-settings-submit' ])) {
2015-11-11 21:27:11 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2018-07-24 21:54:00 +00:00
2018-08-29 18:04:03 +00:00
PConfig :: set ( local_user (), 'xmpp' , 'enabled' , defaults ( $_POST , 'xmpp_enabled' , false ));
PConfig :: set ( local_user (), 'xmpp' , 'individual' , defaults ( $_POST , 'xmpp_individual' , false ));
PConfig :: set ( local_user (), 'xmpp' , 'bosh_proxy' , defaults ( $_POST , 'xmpp_bosh_proxy' , '' ));
2015-11-11 21:27:11 +00:00
2018-01-22 19:03:11 +00:00
info ( L10n :: t ( 'XMPP settings updated.' ) . EOL );
2015-11-11 21:27:11 +00:00
}
2018-01-20 13:57:41 +00:00
function xmpp_addon_settings ( App $a , & $s )
2017-11-26 02:30:56 +00:00
{
if ( ! local_user ()) {
2015-11-11 21:27:11 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2015-11-11 21:27:11 +00:00
/* Add our stylesheet to the xmpp so we can make our settings look nice */
2018-10-09 18:13:22 +00:00
$a -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $a -> getBaseURL () . '/addon/xmpp/xmpp.css' . '" media="all" />' . " \r \n " ;
2015-11-11 21:27:11 +00:00
/* Get the current state of our config variable */
2017-11-26 02:30:56 +00:00
$enabled = intval ( PConfig :: get ( local_user (), 'xmpp' , 'enabled' ));
2015-11-11 21:27:11 +00:00
$enabled_checked = (( $enabled ) ? ' checked="checked" ' : '' );
2017-11-26 02:30:56 +00:00
$individual = intval ( PConfig :: get ( local_user (), 'xmpp' , 'individual' ));
2015-11-11 21:27:11 +00:00
$individual_checked = (( $individual ) ? ' checked="checked" ' : '' );
2017-11-26 02:30:56 +00:00
$bosh_proxy = PConfig :: get ( local_user (), " xmpp " , " bosh_proxy " );
2015-11-11 21:27:11 +00: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\');">' ;
2018-01-22 19:03:11 +00:00
$s .= '<h3>' . L10n :: t ( 'XMPP-Chat (Jabber)' ) . '</h3>' ;
2015-11-11 21:27:11 +00: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\');">' ;
2018-01-22 19:03:11 +00:00
$s .= '<h3>' . L10n :: t ( 'XMPP-Chat (Jabber)' ) . '</h3>' ;
2015-11-11 21:27:11 +00:00
$s .= '</span>' ;
$s .= '<div id="xmpp-settings-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . L10n :: t ( 'Enable Webchat' ) . '</label>' ;
2015-11-11 21:27:11 +00:00
$s .= '<input id="xmpp-enabled" type="checkbox" name="xmpp_enabled" value="1" ' . $enabled_checked . '/>' ;
$s .= '<div class="clear"></div>' ;
2017-11-06 23:55:24 +00:00
if ( Config :: get ( " xmpp " , " central_userbase " )) {
2018-01-22 19:03:11 +00:00
$s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . L10n :: t ( 'Individual Credentials' ) . '</label>' ;
2015-11-11 21:27:11 +00:00
$s .= '<input id="xmpp-individual" type="checkbox" name="xmpp_individual" value="1" ' . $individual_checked . '/>' ;
$s .= '<div class="clear"></div>' ;
}
2017-11-26 02:30:56 +00:00
if ( ! Config :: get ( " xmpp " , " central_userbase " ) || PConfig :: get ( local_user (), " xmpp " , " individual " )) {
2018-01-22 19:03:11 +00:00
$s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">' . L10n :: t ( 'Jabber BOSH host' ) . '</label>' ;
2017-11-26 02:30:56 +00:00
$s .= ' <input id="xmpp-bosh-proxy" type="text" name="xmpp_bosh_proxy" value="' . $bosh_proxy . '" />' ;
2015-11-11 21:27:11 +00:00
$s .= '<div class="clear"></div>' ;
}
$s .= '</div>' ;
/* provide a submit button */
2018-01-22 19:03:11 +00:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . L10n :: t ( 'Save Settings' ) . '" /></div></div>' ;
2015-11-11 21:27:11 +00:00
}
2017-11-26 02:30:56 +00:00
function xmpp_login ()
{
2018-07-24 21:54:00 +00:00
if ( empty ( $_SESSION [ 'allow_api' ])) {
2018-11-08 16:45:19 +00:00
$password = Strings :: getRandomHex ( 16 );
2018-07-24 21:54:00 +00:00
PConfig :: set ( local_user (), 'xmpp' , 'password' , $password );
2015-10-31 22:10:57 +00:00
}
}
2018-01-20 13:57:41 +00:00
function xmpp_addon_admin ( App $a , & $o )
2017-11-26 02:30:56 +00:00
{
2018-10-31 14:55:15 +00:00
$t = Renderer :: getMarkupTemplate ( 'admin.tpl' , 'addon/xmpp/' );
2015-10-31 22:10:57 +00:00
2018-10-31 14:55:15 +00:00
$o = Renderer :: replaceMacros ( $t , [
2018-01-22 19:03:11 +00:00
'$submit' => L10n :: t ( 'Save Settings' ),
'$bosh_proxy' => [ 'bosh_proxy' , L10n :: t ( 'Jabber BOSH host' ), Config :: get ( 'xmpp' , 'bosh_proxy' ), '' ],
'$central_userbase' => [ 'central_userbase' , L10n :: t ( 'Use central userbase' ), Config :: get ( 'xmpp' , 'central_userbase' ), 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 13:15:33 +00:00
]);
2015-10-31 22:10:57 +00:00
}
2018-01-20 13:57:41 +00:00
function xmpp_addon_admin_post ()
2017-11-26 02:30:56 +00:00
{
2018-07-24 21:54:00 +00:00
$bosh_proxy = (( ! empty ( $_POST [ 'bosh_proxy' ])) ? trim ( $_POST [ 'bosh_proxy' ]) : '' );
$central_userbase = (( ! empty ( $_POST [ 'central_userbase' ])) ? intval ( $_POST [ 'central_userbase' ]) : false );
2017-11-26 02:30:56 +00:00
Config :: set ( 'xmpp' , 'bosh_proxy' , $bosh_proxy );
Config :: set ( 'xmpp' , 'central_userbase' , $central_userbase );
2018-07-24 21:54:00 +00:00
2018-01-22 19:03:11 +00:00
info ( L10n :: t ( 'Settings updated.' ) . EOL );
2015-10-31 22:10:57 +00:00
}
2017-11-26 02:30:56 +00:00
function xmpp_script ( App $a )
{
xmpp_converse ( $a );
2015-10-31 22:10:57 +00:00
}
2017-11-26 02:30:56 +00:00
function xmpp_converse ( App $a )
{
if ( ! local_user ()) {
2015-10-31 22:10:57 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2015-10-31 22:10:57 +00:00
2018-07-10 12:30:23 +00:00
if ( defaults ( $_GET , " mode " , '' ) == " minimal " ) {
2015-10-31 22:10:57 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2015-10-31 22:10:57 +00:00
2017-11-26 02:30:56 +00:00
if ( $a -> is_mobile || $a -> is_tablet ) {
2015-11-02 06:05:29 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2015-11-02 06:05:29 +00:00
2017-11-26 02:30:56 +00:00
if ( ! PConfig :: get ( local_user (), " xmpp " , " enabled " )) {
2015-11-11 21:27:11 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2015-11-11 21:27:11 +00:00
2018-01-15 13:15:33 +00:00
if ( in_array ( $a -> query_string , [ " admin/federation/ " ])) {
2016-01-17 13:54:31 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2016-01-17 13:54:31 +00:00
2017-11-26 02:30:56 +00: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 22:10:57 +00:00
2017-11-26 02:30:56 +00:00
if ( Config :: get ( " xmpp " , " central_userbase " ) && ! PConfig :: get ( local_user (), " xmpp " , " individual " )) {
2017-11-06 23:55:24 +00:00
$bosh_proxy = Config :: get ( " xmpp " , " bosh_proxy " );
2015-10-31 22:10:57 +00:00
2018-01-07 00:56:32 +00:00
$password = PConfig :: get ( local_user (), " xmpp " , " password " , '' , true );
2015-10-31 22:10:57 +00:00
if ( $password == " " ) {
2018-11-08 16:45:19 +00:00
$password = Strings :: getRandomHex ( 16 );
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), " xmpp " , " password " , $password );
2015-10-31 22:10:57 +00:00
}
2018-11-08 16:45:19 +00:00
$jid = $a -> user [ " nickname " ] . " @ " . $a -> getHostName () . " /converse- " . Strings :: getRandomHex ( 5 );
2015-10-31 22:10:57 +00:00
$auto_login = " auto_login: true,
authentication : 'login' ,
jid : '$jid' ,
password : '$password' ,
2015-11-11 21:27:11 +00:00
allow_logout : false , " ;
} else {
2017-11-06 23:55:24 +00:00
$bosh_proxy = PConfig :: get ( local_user (), " xmpp " , " bosh_proxy " );
2015-11-11 21:27:11 +00:00
2015-10-31 22:10:57 +00:00
$auto_login = " " ;
2015-11-11 21:27:11 +00:00
}
2017-11-26 02:30:56 +00:00
if ( $bosh_proxy == " " ) {
2015-11-11 21:27:11 +00:00
return ;
2017-11-26 02:30:56 +00:00
}
2015-10-31 22:10:57 +00:00
2018-01-15 13:15:33 +00:00
if ( in_array ( $a -> argv [ 0 ], [ " manage " , " logout " ])) {
2015-10-31 22:10:57 +00:00
$additional_commands = " converse.user.logout(); \n " ;
2017-11-26 02:30:56 +00:00
} else {
2015-10-31 22:10:57 +00:00
$additional_commands = " " ;
2017-11-26 02:30:56 +00:00
}
2015-10-31 22:10:57 +00: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 > " ;
}