2011-03-22 06:07:46 -04:00
< ? php
2018-01-22 09:16:25 -05:00
/**
* @ file mod / uexport . php
*/
2019-05-26 09:49:44 -04:00
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2018-12-26 01:06:24 -05:00
use Friendica\Core\Hook ;
2018-01-22 09:16:25 -05:00
use Friendica\Core\L10n ;
2018-10-31 10:35:50 -04:00
use Friendica\Core\Renderer ;
2017-08-26 02:04:21 -04:00
use Friendica\Core\System ;
2018-07-21 08:40:21 -04:00
use Friendica\Database\DBA ;
2019-05-26 09:49:44 -04:00
use Friendica\Database\DBStructure ;
2017-04-30 00:07:00 -04:00
2017-01-09 07:14:55 -05:00
function uexport_init ( App $a ) {
2019-05-26 09:49:44 -04:00
global $dbStructure ;
2017-04-30 00:01:26 -04:00
if ( ! local_user ()) {
2018-12-26 00:40:12 -05:00
exit ();
2016-12-20 05:56:34 -05:00
}
2014-04-24 05:58:04 -04:00
require_once ( " mod/settings.php " );
2016-12-20 05:56:34 -05:00
settings_init ( $a );
2019-05-26 09:49:44 -04:00
$dbStructure = DBStructure :: definition ( $a -> getBasePath ());
2012-10-17 11:13:01 -04:00
}
2017-01-09 07:14:55 -05:00
function uexport_content ( App $a ) {
2014-04-24 05:58:04 -04:00
2017-01-09 18:10:32 -05:00
if ( $a -> argc > 1 ) {
header ( " Content-type: application/json " );
2017-04-30 00:01:26 -04:00
header ( 'Content-Disposition: attachment; filename="' . $a -> user [ 'nickname' ] . '.' . $a -> argv [ 1 ] . '"' );
switch ( $a -> argv [ 1 ]) {
2017-01-09 18:10:32 -05:00
case " backup " :
uexport_all ( $a );
2018-12-26 00:40:12 -05:00
exit ();
2017-01-09 18:10:32 -05:00
break ;
case " account " :
uexport_account ( $a );
2018-12-26 00:40:12 -05:00
exit ();
2017-01-09 18:10:32 -05:00
break ;
default :
2018-12-26 00:40:12 -05:00
exit ();
2017-01-09 18:10:32 -05:00
}
}
2016-02-07 09:11:34 -05:00
2017-01-09 18:10:32 -05:00
/**
* options shown on " Export personal data " page
* list of array ( 'link url' , 'link text' , 'help text' )
*/
2018-01-15 08:05:12 -05:00
$options = [
2018-01-22 09:16:25 -05:00
[ 'uexport/account' , L10n :: t ( 'Export account' ), L10n :: t ( 'Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.' )],
2018-01-24 16:51:32 -05:00
[ 'uexport/backup' , L10n :: t ( 'Export all' ), L10n :: t ( " Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account \x28 photos are not exported \x29 " )],
2018-01-15 08:05:12 -05:00
];
2018-12-26 01:06:24 -05:00
Hook :: callAll ( 'uexport_options' , $options );
2017-01-09 18:10:32 -05:00
2018-10-31 10:44:06 -04:00
$tpl = Renderer :: getMarkupTemplate ( " uexport.tpl " );
2018-10-31 10:35:50 -04:00
return Renderer :: replaceMacros ( $tpl , [
2018-01-22 09:16:25 -05:00
'$title' => L10n :: t ( 'Export personal data' ),
2017-01-09 18:10:32 -05:00
'$options' => $options
2018-01-15 08:05:12 -05:00
]);
2012-10-17 11:13:01 -04:00
}
function _uexport_multirow ( $query ) {
2019-05-26 09:49:44 -04:00
global $dbStructure ;
preg_match ( " / \ s+from \ s+`?([a-z \ d_]+)`?/i " , $query , $match );
$table = $match [ 1 ];
2018-01-15 08:05:12 -05:00
$result = [];
2012-10-17 11:13:01 -04:00
$r = q ( $query );
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2017-04-30 00:01:26 -04:00
foreach ( $r as $rr ) {
2018-01-15 08:05:12 -05:00
$p = [];
2017-04-30 00:01:26 -04:00
foreach ( $rr as $k => $v ) {
2019-05-26 09:49:44 -04:00
switch ( $dbStructure [ $table ][ 'fields' ][ $k ][ 'type' ]) {
case 'datetime' :
$p [ $k ] = ! empty ( $v ) ? $v : DBA :: NULL_DATETIME ;
break ;
default :
$p [ $k ] = $v ;
break ;
}
2017-01-09 18:10:32 -05:00
}
$result [] = $p ;
}
2011-03-22 06:07:46 -04:00
}
2017-01-09 18:10:32 -05:00
return $result ;
2012-10-17 11:13:01 -04:00
}
function _uexport_row ( $query ) {
2019-05-26 09:49:44 -04:00
global $dbStructure ;
preg_match ( " / \ s+from \ s+`?([a-z \ d_]+)`?/i " , $query , $match );
$table = $match [ 1 ];
2018-01-15 08:05:12 -05:00
$result = [];
2012-10-17 11:13:01 -04:00
$r = q ( $query );
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2019-05-26 09:49:44 -04:00
2017-04-30 00:01:26 -04:00
foreach ( $r as $rr ) {
foreach ( $rr as $k => $v ) {
2019-05-26 09:49:44 -04:00
switch ( $dbStructure [ $table ][ 'fields' ][ $k ][ 'type' ]) {
case 'datetime' :
$result [ $k ] = ! empty ( $v ) ? $v : DBA :: NULL_DATETIME ;
break ;
default :
$result [ $k ] = $v ;
break ;
}
2017-01-09 18:10:32 -05:00
}
}
2011-03-22 06:07:46 -04:00
}
2017-01-09 18:10:32 -05:00
return $result ;
2012-10-17 11:13:01 -04:00
}
2011-03-22 06:07:46 -04:00
2017-04-30 00:01:26 -04:00
function uexport_account ( $a ) {
2012-10-17 11:13:01 -04:00
$user = _uexport_row (
2017-04-30 00:01:26 -04:00
sprintf ( " SELECT * FROM `user` WHERE `uid` = %d LIMIT 1 " , intval ( local_user ()))
2011-03-22 06:07:46 -04:00
);
2014-04-24 05:58:04 -04:00
2012-10-17 11:13:01 -04:00
$contact = _uexport_multirow (
2017-04-30 00:01:26 -04:00
sprintf ( " SELECT * FROM `contact` WHERE `uid` = %d " , intval ( local_user ()))
2012-10-17 11:13:01 -04:00
);
2017-04-30 00:01:26 -04:00
$profile = _uexport_multirow (
sprintf ( " SELECT * FROM `profile` WHERE `uid` = %d " , intval ( local_user ()))
2012-10-17 11:13:01 -04:00
);
2017-01-09 18:10:32 -05:00
$photo = _uexport_multirow (
2017-04-30 00:01:26 -04:00
sprintf ( " SELECT * FROM `photo` WHERE uid = %d AND profile = 1 " , intval ( local_user ()))
2017-01-09 18:10:32 -05:00
);
foreach ( $photo as & $p ) {
$p [ 'data' ] = bin2hex ( $p [ 'data' ]);
}
2011-03-22 06:07:46 -04:00
2017-01-09 18:10:32 -05:00
$pconfig = _uexport_multirow (
2017-04-30 00:01:26 -04:00
sprintf ( " SELECT * FROM `pconfig` WHERE uid = %d " , intval ( local_user ()))
2017-01-09 18:10:32 -05:00
);
2011-03-22 06:07:46 -04:00
2017-01-09 18:10:32 -05:00
$group = _uexport_multirow (
2017-04-30 00:01:26 -04:00
sprintf ( " SELECT * FROM `group` WHERE uid = %d " , intval ( local_user ()))
2017-01-09 18:10:32 -05:00
);
2014-04-24 05:58:04 -04:00
2017-01-09 18:10:32 -05:00
$group_member = _uexport_multirow (
2017-12-14 22:47:58 -05:00
sprintf ( " SELECT `group_member`.`gid`, `group_member`.`contact-id` FROM `group_member` INNER JOIN `group` ON `group`.`id` = `group_member`.`gid` WHERE `group`.`uid` = %d " , intval ( local_user ()))
2017-01-09 18:10:32 -05:00
);
2012-10-17 11:13:01 -04:00
2018-01-15 08:05:12 -05:00
$output = [
2017-01-09 18:10:32 -05:00
'version' => FRIENDICA_VERSION ,
'schema' => DB_UPDATE_VERSION ,
2017-08-26 03:32:10 -04:00
'baseurl' => System :: baseUrl (),
2017-01-09 18:10:32 -05:00
'user' => $user ,
'contact' => $contact ,
'profile' => $profile ,
'photo' => $photo ,
'pconfig' => $pconfig ,
'group' => $group ,
'group_member' => $group_member ,
2018-01-15 08:05:12 -05:00
];
2016-02-07 09:11:34 -05:00
2017-11-26 08:58:24 -05:00
echo json_encode ( $output , JSON_PARTIAL_OUTPUT_ON_ERROR );
2012-10-17 11:13:01 -04:00
}
/**
* echoes account data and items as separated json , one per line
2019-01-07 10:24:06 -05:00
*
* @ param App $a
* @ throws Exception
2012-10-17 11:13:01 -04:00
*/
2017-01-09 07:14:55 -05:00
function uexport_all ( App $a ) {
2016-02-17 17:47:32 -05:00
uexport_account ( $a );
2013-06-28 03:16:25 -04:00
echo " \n " ;
2012-10-17 11:13:01 -04:00
2018-02-14 00:07:26 -05:00
$total = 0 ;
2011-03-22 19:19:00 -04:00
$r = q ( " SELECT count(*) as `total` FROM `item` WHERE `uid` = %d " ,
intval ( local_user ())
);
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2011-03-22 19:19:00 -04:00
$total = $r [ 0 ][ 'total' ];
2017-01-09 18:10:32 -05:00
}
2011-03-22 19:19:00 -04:00
// chunk the output to avoid exhausting memory
2017-01-09 18:10:32 -05:00
for ( $x = 0 ; $x < $total ; $x += 500 ) {
2011-03-22 19:19:00 -04:00
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d LIMIT %d, %d " ,
intval ( local_user ()),
intval ( $x ),
intval ( 500 )
);
2018-01-15 08:05:12 -05:00
$output = [ 'item' => $r ];
2017-11-26 08:58:24 -05:00
echo json_encode ( $output , JSON_PARTIAL_OUTPUT_ON_ERROR ) . " \n " ;
2011-03-22 19:19:00 -04:00
}
2014-04-24 05:58:04 -04:00
}