2014-10-17 13:32:34 +02:00
< ? php
2017-12-02 04:55:48 +01:00
2014-10-17 13:32:34 +02:00
/**
* Name : WindowsPhonePush
* Description : Enable push notification to send information to Friendica Mobile app on Windows phone ( count of unread timeline entries , text of last posting - if wished by user )
2015-01-17 21:58:18 +01:00
* Version : 2.0
2014-10-17 13:32:34 +02:00
* Author : Gerhard Seeber < http :// friendica . seeber . at / profile / admin >
2022-06-11 13:56:52 +02:00
* Status : Unsupported
2017-12-02 04:55:48 +01:00
*
*
2014-10-17 13:32:34 +02:00
* Pre - requisite : Windows Phone mobile device ( at least WP 7.0 )
* Friendica mobile app on Windows Phone
*
2018-01-20 14:57:41 +01:00
* When addon is installed , the system calls the addon
2014-10-17 13:32:34 +02:00
* name_install () function , located in 'addon/name/name.php' ,
* where 'name' is the name of the addon .
2017-12-02 04:55:48 +01:00
* If the addon is removed from the configuration list , the
2014-10-17 13:32:34 +02:00
* system will call the name_uninstall () function .
*
2014-12-14 22:46:07 +01:00
* Version history :
2017-12-02 04:55:48 +01:00
* 1.1 : addon crashed on php versions >= 5.4 as of removed deprecated call - time
2014-12-14 22:46:07 +01:00
* pass - by - reference used in function calls within function windowsphonepush_content
2015-01-17 21:58:18 +01:00
* 2.0 : adaption for supporting emphasizing new entries in app ( count on tile cannot be read out ,
2017-12-02 04:55:48 +01:00
* so we need to retrieve counter through show_settings secondly ) . Provide new function for
2015-01-17 21:58:18 +01:00
* calling from app to set the counter back after start ( if user starts again before cronjob
* sets the counter back
* count only unseen elements which are not type = activity ( likes and dislikes not seen as new elements )
2014-10-17 13:32:34 +02:00
*/
2018-02-15 03:43:40 +01:00
2017-12-02 04:55:48 +01:00
use Friendica\App ;
2018-02-15 03:43:40 +01:00
use Friendica\Content\Text\BBCode ;
2018-03-07 22:48:34 +01:00
use Friendica\Content\Text\HTML ;
2018-12-26 07:08:41 +01:00
use Friendica\Core\Hook ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2021-11-20 10:56:55 +01:00
use Friendica\Core\Renderer ;
2022-10-18 22:42:46 +02:00
use Friendica\Core\Session ;
2018-07-20 14:20:48 +02:00
use Friendica\Database\DBA ;
2019-12-28 15:18:18 +01:00
use Friendica\DI ;
2018-06-17 08:20:47 +02:00
use Friendica\Model\Item ;
2021-01-17 01:00:32 +01:00
use Friendica\Model\Post ;
2018-07-20 04:18:02 +02:00
use Friendica\Model\User ;
2021-11-04 21:32:16 +01:00
use Friendica\Network\HTTPException\UnauthorizedException ;
2014-10-17 13:32:34 +02:00
2017-12-02 04:55:48 +01:00
function windowsphonepush_install ()
{
2018-01-20 14:57:41 +01:00
/* Our addon will attach in three places .
2017-12-02 04:55:48 +01:00
* The first is within cron - so the push notifications will be
2014-10-17 13:32:34 +02:00
* sent every 10 minutes ( or whatever is set in crontab ) .
*/
2018-12-26 08:28:16 +01:00
Hook :: register ( 'cron' , 'addon/windowsphonepush/windowsphonepush.php' , 'windowsphonepush_cron' );
2014-10-17 13:32:34 +02:00
2018-01-20 14:57:41 +01:00
/* Then we ' ll attach into the addon settings page , and also the
2014-10-17 13:32:34 +02:00
* settings post hook so that we can create and update
2018-01-20 14:57:41 +01:00
* user preferences . User shall be able to activate the addon and
2014-10-17 13:32:34 +02:00
* define whether he allows pushing first characters of item text
*/
2018-12-26 08:28:16 +01:00
Hook :: register ( 'addon_settings' , 'addon/windowsphonepush/windowsphonepush.php' , 'windowsphonepush_settings' );
Hook :: register ( 'addon_settings_post' , 'addon/windowsphonepush/windowsphonepush.php' , 'windowsphonepush_settings_post' );
2014-10-17 13:32:34 +02:00
2021-10-03 19:35:20 +02:00
Logger :: notice ( " installed windowsphonepush " );
2014-10-17 13:32:34 +02:00
}
/* declare the windowsphonepush function so that /windowsphonepush url requests will land here */
2022-06-24 23:27:58 +02:00
/**
* This is a statement rather than an actual function definition . The simple
* existence of this method is checked to figure out if the addon offers a
* module .
*/
function windowsphonepush_module () {}
2014-10-17 13:32:34 +02:00
2017-12-02 04:55:48 +01:00
/* Callback from the settings post function .
2014-10-17 13:32:34 +02:00
* $post contains the $_POST array .
* We will make sure we ' ve got a valid user account
* and if so set our configuration setting for this person .
*/
2022-10-19 15:47:48 +02:00
function windowsphonepush_settings_post ( App $a , array $post )
2017-12-02 04:55:48 +01:00
{
2022-10-19 15:47:48 +02:00
if ( ! Session :: getLocalUser () || empty ( $post [ 'windowsphonepush-submit' ])) {
2014-10-17 13:32:34 +02:00
return ;
2017-12-02 04:55:48 +01:00
}
2022-10-19 15:47:48 +02:00
$enable = intval ( $post [ 'windowsphonepush' ]);
2022-10-18 22:42:46 +02:00
DI :: pConfig () -> set ( Session :: getLocalUser (), 'windowsphonepush' , 'enable' , $enable );
2015-01-17 21:58:18 +01:00
2017-12-02 04:55:48 +01:00
if ( $enable ) {
2022-10-18 22:42:46 +02:00
DI :: pConfig () -> set ( Session :: getLocalUser (), 'windowsphonepush' , 'counterunseen' , 0 );
2015-01-17 21:58:18 +01:00
}
2014-10-17 13:32:34 +02:00
2022-10-19 15:47:48 +02:00
DI :: pConfig () -> set ( Session :: getLocalUser (), 'windowsphonepush' , 'senditemtext' , intval ( $post [ 'windowsphonepush-senditemtext' ]));
2014-10-17 13:32:34 +02:00
}
2018-01-20 14:57:41 +01:00
/* Called from the Addon Setting form .
2014-10-17 13:32:34 +02:00
* Add our own settings info to the page .
*/
2021-11-20 10:56:55 +01:00
function windowsphonepush_settings ( App & $a , array & $data )
2017-12-02 04:55:48 +01:00
{
2022-10-18 22:42:46 +02:00
if ( ! Session :: getLocalUser ()) {
2014-10-17 13:32:34 +02:00
return ;
2017-12-02 04:55:48 +01:00
}
2014-10-17 13:32:34 +02:00
2022-10-19 15:47:48 +02:00
$enabled = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'enable' );
2022-10-18 22:42:46 +02:00
$senditemtext = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'senditemtext' );
2022-10-19 15:47:48 +02:00
$device_url = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'device_url' );
2014-10-17 13:32:34 +02:00
2021-11-20 10:56:55 +01:00
$t = Renderer :: getMarkupTemplate ( 'settings.tpl' , 'addon/windowsphonepush/' );
$html = Renderer :: replaceMacros ( $t , [
'$enabled' => [ 'windowsphonepush' , DI :: l10n () -> t ( 'Enable WindowsPhonePush Addon' ), $enabled ],
'$senditemtext' => [ 'windowsphonepush-senditemtext' , DI :: l10n () -> t ( 'Push text of new item' ), $senditemtext ],
'$device_url' => [ '' , DI :: l10n () -> t ( 'Device URL' ), $device_url , '' , false , ' readonly' ],
]);
$data = [
'addon' => 'windowsphonepush' ,
'title' => DI :: l10n () -> t ( 'WindowsPhonePush Settings' ),
'html' => $html ,
];
2014-10-17 13:32:34 +02:00
}
2018-01-20 14:57:41 +01:00
/* Cron function used to regularly check all users on the server with active windowsphonepushaddon and send
2014-10-17 13:32:34 +02:00
* notifications to the Microsoft servers and consequently to the Windows Phone device
*/
2017-12-02 04:55:48 +01:00
function windowsphonepush_cron ()
{
2018-01-20 14:57:41 +01:00
// retrieve all UID's for which the addon windowsphonepush is enabled and loop through every user
2021-10-03 20:58:52 +02:00
$pconfigs = DBA :: selectToArray ( 'pconfig' , [ 'uid' ], [ 'cat' => 'windowsphonepush' , 'k' => 'enable' , 'v' => true ]);
2021-10-03 19:35:20 +02:00
foreach ( $pconfigs as $rr ) {
// load stored information for the user-id of the current loop
$device_url = DI :: pConfig () -> get ( $rr [ 'uid' ], 'windowsphonepush' , 'device_url' );
$lastpushid = DI :: pConfig () -> get ( $rr [ 'uid' ], 'windowsphonepush' , 'lastpushid' );
// pushing only possible if device_url (the URI on Microsoft server) is available or not "NA" (which will be sent
// by app if user has switched the server setting in app - sending blank not possible as this would return an update error)
if (( $device_url == " " ) || ( $device_url == " NA " )) {
// no Device-URL for the user availabe, but addon is enabled --> write info to Logger
Logger :: notice ( " WARN: windowsphonepush is enable for user " . $rr [ 'uid' ] . " , but no Device-URL is specified for the user. " );
} else {
// retrieve the number of unseen items and the id of the latest one (if there are more than
// one new entries since last poller run, only the latest one will be pushed)
2021-10-07 21:30:10 +02:00
$count = DBA :: fetchFirst ( " SELECT count(`id`) AS count, max(`id`) AS max FROM `post-view` WHERE `unseen` AND `type` != ? AND `uid` = ? " , 'activity' , $rr [ 'uid' ]);
2021-10-03 19:35:20 +02:00
// send number of unseen items to the device (the number will be displayed on Start screen until
// App will be started by user) - this update will be sent every 10 minutes to update the number to 0 if
// user has loaded the timeline through app or website
2021-10-07 21:30:10 +02:00
$res_tile = send_tile_update ( $device_url , " " , $count [ 'count' ], " " );
2021-10-03 19:35:20 +02:00
switch ( trim ( $res_tile )) {
case " Received " :
// ok, count has been pushed, let's save it in personal settings
2021-10-07 21:30:10 +02:00
DI :: pConfig () -> set ( $rr [ 'uid' ], 'windowsphonepush' , 'counterunseen' , $count [ 'count' ]);
2021-10-03 19:35:20 +02:00
break ;
case " QueueFull " :
// maximum of 30 messages reached, server rejects any further push notification until device reconnects
Logger :: notice ( " INFO: Device-URL ' " . $device_url . " ' returns a QueueFull. " );
break ;
case " Suppressed " :
// notification received and dropped as something in app was not enabled
Logger :: notice ( " WARN. Device-URL ' " . $device_url . " ' returns a Suppressed. Unexpected error in Mobile App? " );
break ;
case " Dropped " :
// mostly combines with Expired, in that case Device-URL will be deleted from pconfig (function send_push)
break ;
default :
// error, mostly called by "" which means that the url (not "" which has been checked)
// didn't not received Microsoft Notification Server -> wrong url
Logger :: notice ( " ERROR: specified Device-URL ' " . $device_url . " ' didn't produced any response. " );
}
2014-10-17 13:32:34 +02:00
2021-10-03 19:35:20 +02:00
// additionally user receives the text of the newest item (function checks against last successfully pushed item)
2021-10-07 21:30:10 +02:00
if ( intval ( $count [ 'max' ]) > intval ( $lastpushid )) {
2021-10-03 19:35:20 +02:00
// user can define if he wants to see the text of the item in the push notification
// this has been implemented as the device_url is not a https uri (not so secure)
$senditemtext = DI :: pConfig () -> get ( $rr [ 'uid' ], 'windowsphonepush' , 'senditemtext' );
if ( $senditemtext == 1 ) {
// load item with the max id
2021-10-07 21:30:10 +02:00
$item = Post :: selectFirst ([ 'author-name' , 'body' , 'uri-id' ], [ 'id' => $count [ 'max' ]]);
2021-10-03 19:35:20 +02:00
// as user allows to send the item, we want to show the sender of the item in the toast
// toasts are limited to one line, therefore place is limited - author shall be in
// max. 15 chars (incl. dots); author is displayed in bold font
$author = $item [ 'author-name' ];
$author = (( strlen ( $author ) > 12 ) ? substr ( $author , 0 , 12 ) . " ... " : $author );
// normally we show the body of the item, however if it is an url or an image we cannot
// show this in the toast (only test), therefore changing to an alternate text
// Otherwise BBcode-Tags will be eliminated and plain text cutted to 140 chars (incl. dots)
// BTW: information only possible in English
$body = $item [ 'body' ];
if ( substr ( $body , 0 , 4 ) == " [url " ) {
$body = " URL/Image ... " ;
2014-10-17 13:32:34 +02:00
} else {
2021-10-03 19:35:20 +02:00
$body = BBCode :: convertForUriId ( $item [ 'uri-id' ], $body , BBCode :: API );
$body = HTML :: toPlaintext ( $body , 0 );
$body = (( strlen ( $body ) > 137 ) ? substr ( $body , 0 , 137 ) . " ... " : $body );
2017-12-02 04:55:48 +01:00
}
2021-10-03 19:35:20 +02:00
} else {
// if user wishes higher privacy, we only display "Friendica - New timeline entry arrived"
$author = " Friendica " ;
$body = " New timeline entry arrived ... " ;
}
// only if toast push notification returns the Notification status "Received" we will update th settings with the
// new indicator max-id is checked against (QueueFull, Suppressed, N/A, Dropped shall qualify to resend
// the push notification some minutes later (BTW: if resulting in Expired for subscription status the
// device_url will be deleted (no further try on this url, see send_push)
// further log information done on count pushing with send_tile (see above)
$res_toast = send_toast ( $device_url , $author , $body );
if ( trim ( $res_toast ) === 'Received' ) {
2021-10-07 21:30:10 +02:00
DI :: pConfig () -> set ( $rr [ 'uid' ], 'windowsphonepush' , 'lastpushid' , $count [ 'max' ]);
2014-10-17 13:32:34 +02:00
}
}
}
}
}
2017-12-02 04:55:48 +01:00
/* Tile push notification change the number in the icon of the App in Start Screen of
2014-10-17 13:32:34 +02:00
* a Windows Phone Device , Image could be changed , not used for App " Friendica Mobile "
*/
2017-12-02 04:55:48 +01:00
function send_tile_update ( $device_url , $image_url , $count , $title , $priority = 1 )
{
2014-10-17 13:32:34 +02:00
$msg = " <?xml version= \" 1.0 \" encoding= \" utf-8 \" ?> " .
" <wp:Notification xmlns:wp= \" WPNotification \" > " .
2017-12-02 04:55:48 +01:00
" <wp:Tile> " .
" <wp:BackgroundImage> " . $image_url . " </wp:BackgroundImage> " .
" <wp:Count> " . $count . " </wp:Count> " .
" <wp:Title> " . $title . " </wp:Title> " .
" </wp:Tile> " .
2014-10-17 13:32:34 +02:00
" </wp:Notification> " ;
2018-01-15 14:15:33 +01:00
$result = send_push ( $device_url , [
2014-10-17 13:32:34 +02:00
'X-WindowsPhone-Target: token' ,
'X-NotificationClass: ' . $priority ,
2018-01-15 14:15:33 +01:00
], $msg );
2014-10-17 13:32:34 +02:00
return $result ;
}
2017-12-02 04:55:48 +01:00
/* Toast push notification send information to the top of the display
2014-10-17 13:32:34 +02:00
* if the user is not currently using the Friendica Mobile App , however
* there is only one line for displaying the information
*/
2017-12-02 04:55:48 +01:00
function send_toast ( $device_url , $title , $message , $priority = 2 )
{
$msg = " <?xml version= \" 1.0 \" encoding= \" utf-8 \" ?> " .
2014-10-17 13:32:34 +02:00
" <wp:Notification xmlns:wp= \" WPNotification \" > " .
2017-12-02 04:55:48 +01:00
" <wp:Toast> " .
" <wp:Text1> " . $title . " </wp:Text1> " .
" <wp:Text2> " . $message . " </wp:Text2> " .
" <wp:Param></wp:Param> " .
" </wp:Toast> " .
2014-10-17 13:32:34 +02:00
" </wp:Notification> " ;
2018-01-15 14:15:33 +01:00
$result = send_push ( $device_url , [
2014-10-17 13:32:34 +02:00
'X-WindowsPhone-Target: toast' ,
2017-12-02 04:55:48 +01:00
'X-NotificationClass: ' . $priority ,
2018-01-15 14:15:33 +01:00
], $msg );
2014-10-17 13:32:34 +02:00
return $result ;
}
2017-12-02 04:55:48 +01:00
// General function to send the push notification via cURL
function send_push ( $device_url , $headers , $msg )
{
2014-10-17 13:32:34 +02:00
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $device_url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $ch , CURLOPT_POST , true );
2017-12-02 04:55:48 +01:00
curl_setopt ( $ch , CURLOPT_HEADER , true );
2018-01-15 14:15:33 +01:00
curl_setopt ( $ch , CURLOPT_HTTPHEADER , $headers + [
2017-12-02 04:55:48 +01:00
'Content-Type: text/xml' ,
'charset=utf-8' ,
'Accept: application/*' ,
2018-01-15 14:15:33 +01:00
]
2017-12-02 04:55:48 +01:00
);
2014-10-17 13:32:34 +02:00
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $msg );
$output = curl_exec ( $ch );
curl_close ( $ch );
2014-12-14 22:46:07 +01:00
// if we received "Expired" from Microsoft server we will delete the obsolete device-URL
2014-10-17 13:32:34 +02:00
// and log this fact
$subscriptionStatus = get_header_value ( $output , 'X-SubscriptionStatus' );
if ( $subscriptionStatus == " Expired " ) {
2022-10-18 22:42:46 +02:00
DI :: pConfig () -> set ( Session :: getLocalUser (), 'windowsphonepush' , 'device_url' , " " );
2021-10-03 19:35:20 +02:00
Logger :: notice ( " ERROR: the stored Device-URL " . $device_url . " returned an 'Expired' error, it has been deleted now. " );
2014-10-17 13:32:34 +02:00
}
2017-12-02 04:55:48 +01:00
// the notification status shall be returned to windowsphonepush_cron (will
2014-10-17 13:32:34 +02:00
// update settings if 'Received' otherwise keep old value in settings (on QueuedFull. Suppressed, N/A, Dropped)
$notificationStatus = get_header_value ( $output , 'X-NotificationStatus' );
return $notificationStatus ;
2017-12-02 04:55:48 +01:00
}
2014-10-17 13:32:34 +02:00
2017-12-02 04:55:48 +01:00
// helper function to receive statuses from webresponse of Microsoft server
function get_header_value ( $content , $header )
{
2014-10-17 13:32:34 +02:00
return preg_match_all ( " / $header : (.*)/i " , $content , $match ) ? $match [ 1 ][ 0 ] : " " ;
}
2017-12-02 04:55:48 +01:00
/* reading information from url and deciding which function to start
2014-10-17 13:32:34 +02:00
* show_settings = delivering settings to check
* update_settings = set the device_url
2015-01-17 21:58:18 +01:00
* update_counterunseen = set counter for unseen elements to zero
2014-10-17 13:32:34 +02:00
*/
2017-12-02 04:55:48 +01:00
function windowsphonepush_content ( App $a )
{
2014-10-17 13:32:34 +02:00
// Login with the specified Network credentials (like in api.php)
2017-12-02 04:55:48 +01:00
windowsphonepush_login ( $a );
2014-10-17 13:32:34 +02:00
2021-07-25 14:29:43 +02:00
$path = DI :: args () -> getArgv ()[ 0 ];
$path2 = DI :: args () -> getArgv ()[ 1 ];
2014-10-17 13:32:34 +02:00
if ( $path == " windowsphonepush " ) {
switch ( $path2 ) {
case " show_settings " :
2014-12-14 22:46:07 +01:00
windowsphonepush_showsettings ( $a );
2018-12-26 06:39:53 +01:00
exit ();
2014-10-17 13:32:34 +02:00
break ;
case " update_settings " :
2014-12-14 22:46:07 +01:00
$ret = windowsphonepush_updatesettings ( $a );
2017-12-02 04:55:48 +01:00
header ( " Content-Type: application/json; charset=utf-8 " );
2018-01-15 14:15:33 +01:00
echo json_encode ([ 'status' => $ret ]);
2018-12-26 06:39:53 +01:00
exit ();
2014-10-17 13:32:34 +02:00
break ;
2015-01-17 21:58:18 +01:00
case " update_counterunseen " :
$ret = windowsphonepush_updatecounterunseen ();
header ( " Content-Type: application/json; charset=utf-8 " );
2018-01-15 14:15:33 +01:00
echo json_encode ([ 'status' => $ret ]);
2018-12-26 06:39:53 +01:00
exit ();
2015-01-17 21:58:18 +01:00
break ;
2014-10-17 13:32:34 +02:00
default :
echo " Fehler " ;
}
}
}
2017-12-02 04:55:48 +01:00
// return settings for windowsphonepush addon to be able to check them in WP app
function windowsphonepush_showsettings ()
{
2022-10-18 22:42:46 +02:00
if ( ! Session :: getLocalUser ()) {
2014-10-17 13:32:34 +02:00
return ;
2017-12-02 04:55:48 +01:00
}
2014-10-17 13:32:34 +02:00
2022-10-19 15:47:48 +02:00
$enable = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'enable' );
$device_url = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'device_url' );
$senditemtext = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'senditemtext' );
$lastpushid = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'lastpushid' );
2022-10-18 22:42:46 +02:00
$counterunseen = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'counterunseen' );
2022-10-19 15:47:48 +02:00
$addonversion = " 2.0 " ;
2014-10-17 13:32:34 +02:00
2017-12-02 04:55:48 +01:00
if ( ! $device_url ) {
2014-10-17 13:32:34 +02:00
$device_url = " " ;
2017-12-02 04:55:48 +01:00
}
2014-10-17 13:32:34 +02:00
2017-12-02 04:55:48 +01:00
if ( ! $lastpushid ) {
2014-10-17 13:32:34 +02:00
$lastpushid = 0 ;
2017-12-02 04:55:48 +01:00
}
2014-10-17 13:32:34 +02:00
2017-12-02 04:55:48 +01:00
header ( " Content-Type: application/json " );
2022-10-18 22:42:46 +02:00
echo json_encode ([ 'uid' => Session :: getLocalUser (),
2017-12-02 04:55:48 +01:00
'enable' => $enable ,
'device_url' => $device_url ,
'senditemtext' => $senditemtext ,
'lastpushid' => $lastpushid ,
'counterunseen' => $counterunseen ,
2018-01-15 14:15:33 +01:00
'addonversion' => $addonversion ]);
2014-10-17 13:32:34 +02:00
}
2017-12-02 04:55:48 +01:00
/* update_settings is used to transfer the device_url from WP device to the Friendica server
2014-10-17 13:32:34 +02:00
* return the status of the operation to the server
*/
2017-12-02 04:55:48 +01:00
function windowsphonepush_updatesettings ()
{
2022-10-18 22:42:46 +02:00
if ( ! Session :: getLocalUser ()) {
2014-10-17 13:32:34 +02:00
return " Not Authenticated " ;
}
2018-01-20 14:57:41 +01:00
// no updating if user hasn't enabled the addon
2022-10-18 22:42:46 +02:00
$enable = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'enable' );
2017-12-02 04:55:48 +01:00
if ( ! $enable ) {
2014-10-17 13:32:34 +02:00
return " Plug-in not enabled " ;
}
// check if sent url is empty - don't save and send return code to app
$device_url = $_POST [ 'deviceurl' ];
if ( $device_url == " " ) {
2021-10-03 19:35:20 +02:00
Logger :: notice ( " ERROR: no valid Device-URL specified - client transferred ' " . $device_url . " ' " );
2014-10-17 13:32:34 +02:00
return " No valid Device-URL specified " ;
}
2017-12-02 04:55:48 +01:00
// check if sent url is already stored in database for another user, we assume that there was a change of
2014-10-17 13:32:34 +02:00
// the user on the Windows Phone device and that device url is no longer true for the other user, so we
2017-12-02 04:55:48 +01:00
// et the device_url for the OTHER user blank (should normally not occur as App should include User/server
2014-10-17 13:32:34 +02:00
// in url request to Microsoft Push Notification server)
2022-10-18 22:42:46 +02:00
$pconfigs = DBA :: selectToArray ( 'pconfig' , [ 'uid' ], [ " `uid` != ? AND `cat` = ? AND `k` = ? AND `v` = ? " , Session :: getLocalUser (), 'windowsphonepush' , 'device_url' , $device_url ]);
2021-10-03 19:35:20 +02:00
foreach ( $pconfigs as $rr ) {
DI :: pConfig () -> set ( $rr [ 'uid' ], 'windowsphonepush' , 'device_url' , '' );
2022-10-18 22:42:46 +02:00
Logger :: notice ( " WARN: the sent URL was already registered with user ' " . $rr [ 'uid' ] . " '. Deleted for this user as we expect to be correct now for user ' " . Session :: getLocalUser () . " '. " );
2014-10-17 13:32:34 +02:00
}
2022-10-18 22:42:46 +02:00
DI :: pConfig () -> set ( Session :: getLocalUser (), 'windowsphonepush' , 'device_url' , $device_url );
2014-10-17 13:32:34 +02:00
// output the successfull update of the device URL to the logger for error analysis if necessary
2022-10-18 22:42:46 +02:00
Logger :: notice ( " INFO: Device-URL for user ' " . Session :: getLocalUser () . " ' has been updated with ' " . $device_url . " ' " );
2014-10-17 13:32:34 +02:00
return " Device-URL updated successfully! " ;
}
2017-12-02 04:55:48 +01:00
// update_counterunseen is used to reset the counter to zero from Windows Phone app
function windowsphonepush_updatecounterunseen ()
{
2022-10-18 22:42:46 +02:00
if ( ! Session :: getLocalUser ()) {
2015-01-17 21:58:18 +01:00
return " Not Authenticated " ;
}
2018-01-20 14:57:41 +01:00
// no updating if user hasn't enabled the addon
2022-10-18 22:42:46 +02:00
$enable = DI :: pConfig () -> get ( Session :: getLocalUser (), 'windowsphonepush' , 'enable' );
2017-12-02 04:55:48 +01:00
if ( ! $enable ) {
2015-01-17 21:58:18 +01:00
return " Plug-in not enabled " ;
}
2022-10-18 22:42:46 +02:00
DI :: pConfig () -> set ( Session :: getLocalUser (), 'windowsphonepush' , 'counterunseen' , 0 );
2015-01-17 21:58:18 +01:00
return " Counter set to zero " ;
}
2017-12-02 04:55:48 +01:00
/* helper function to login to the server with the specified Network credentials
2014-10-17 13:32:34 +02:00
* ( mainly copied from api . php )
*/
2017-12-02 04:55:48 +01:00
function windowsphonepush_login ( App $a )
{
2014-10-17 13:32:34 +02:00
if ( ! isset ( $_SERVER [ 'PHP_AUTH_USER' ])) {
2021-10-03 19:35:20 +02:00
Logger :: info ( 'API_login: ' . print_r ( $_SERVER , true ));
2017-12-02 04:55:48 +01:00
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2021-11-04 21:32:16 +01:00
throw new UnauthorizedException ( 'This api requires login' );
2014-10-17 13:32:34 +02:00
}
2021-11-07 15:01:30 +01:00
try {
$user_id = User :: getIdFromPasswordAuthentication ( $_SERVER [ 'PHP_AUTH_USER' ], trim ( $_SERVER [ 'PHP_AUTH_PW' ]));
2021-11-07 16:45:27 +01:00
$record = DBA :: selectFirst ( 'user' , [], [ 'uid' => $user_id ]);
DI :: auth () -> setForUser ( $a , $record );
DI :: session () -> set ( 'allow_api' , true );
Hook :: callAll ( 'logged_in' , $record );
2021-11-07 15:01:30 +01:00
} catch ( Exception $ex ) {
2021-10-03 19:35:20 +02:00
Logger :: info ( 'API_login failure: ' . print_r ( $_SERVER , true ));
2017-12-02 04:55:48 +01:00
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2021-11-04 21:32:16 +01:00
throw new UnauthorizedException ( 'This api requires login' );
2014-10-17 13:32:34 +02:00
}
}