2016-04-19 03:38:38 +00:00
< ? php
namespace Zotlabs\Module ;
2020-06-24 00:45:27 +00:00
use App ;
use Zotlabs\Web\Controller ;
2018-10-16 02:29:32 +00:00
use Zotlabs\Lib\Libzot ;
2020-06-24 00:45:27 +00:00
use Zotlabs\Lib\Webfinger ;
2018-10-16 02:29:32 +00:00
2020-06-24 00:45:27 +00:00
class Chanview extends Controller {
2016-04-19 03:38:38 +00:00
function get () {
2020-06-24 00:45:27 +00:00
$observer = App :: get_observer ();
2016-04-19 03:38:38 +00:00
$xchan = null ;
$r = null ;
2020-06-24 00:45:27 +00:00
if ( $_REQUEST [ 'hash' ]) {
2016-04-19 03:38:38 +00:00
$r = q ( " select * from xchan where xchan_hash = '%s' limit 1 " ,
dbesc ( $_REQUEST [ 'hash' ])
);
}
2020-06-24 00:45:27 +00:00
if ( $_REQUEST [ 'address' ]) {
2016-04-19 03:38:38 +00:00
$r = q ( " select * from xchan where xchan_addr = '%s' limit 1 " ,
2018-03-14 07:50:12 +00:00
dbesc ( punify ( $_REQUEST [ 'address' ]))
2016-04-19 03:38:38 +00:00
);
}
2020-06-24 00:45:27 +00:00
elseif ( local_channel () && intval ( $_REQUEST [ 'cid' ])) {
2016-04-19 03:38:38 +00:00
$r = q ( " SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = % d and abook_id = % d LIMIT 1 " ,
intval ( local_channel ()),
intval ( $_REQUEST [ 'cid' ])
);
}
2020-06-24 00:45:27 +00:00
elseif ( $_REQUEST [ 'url' ]) {
2016-04-19 03:38:38 +00:00
// if somebody re-installed they will have more than one xchan, use the most recent name date as this is
// the most useful consistently ascending table item we have.
2021-03-14 23:41:45 +00:00
$r = q ( " select * from hubloc left join xchan on hubloc_hash = xchan_hash where hubloc_url = '%s' or hubloc_id_url = '%s' order by xchan_name_date desc limit 1 " ,
dbesc ( $_REQUEST [ 'url' ]),
2016-04-19 03:38:38 +00:00
dbesc ( $_REQUEST [ 'url' ])
);
}
2020-06-24 00:45:27 +00:00
if ( $r ) {
App :: $poi = array_shift ( $r );
2016-04-19 03:38:38 +00:00
}
2020-06-24 00:45:27 +00:00
2016-04-19 03:38:38 +00:00
// Here, let's see if we have an xchan. If we don't, how we proceed is determined by what
// info we do have. If it's a URL, we can offer to visit it directly. If it's a webbie or
// address, we can and should try to import it. If it's just a hash, we can't continue, but we
// probably wouldn't have a hash if we don't already have an xchan for this channel.
2020-06-24 00:45:27 +00:00
if ( ! App :: $poi ) {
2016-04-19 03:38:38 +00:00
logger ( 'mod_chanview: fallback' );
// This is hackish - construct a zot address from the url
2020-06-24 00:45:27 +00:00
if ( $_REQUEST [ 'url' ]) {
if ( preg_match ( '/https?\:\/\/(.*?)(\/channel\/|\/profile\/)(.*?)$/ism' , $_REQUEST [ 'url' ], $matches )) {
2016-04-19 03:38:38 +00:00
$_REQUEST [ 'address' ] = $matches [ 3 ] . '@' . $matches [ 1 ];
}
logger ( 'mod_chanview: constructed address ' . print_r ( $matches , true ));
}
2016-10-27 01:35:10 +00:00
$r = null ;
2020-06-24 00:45:27 +00:00
if ( $_REQUEST [ 'address' ]) {
$href = Webfinger :: zot_url ( punify ( $url ));
if ( $href ) {
$zf = Zotfinger :: exec ( $href , $channel );
2018-06-01 02:42:13 +00:00
}
2020-06-24 00:45:27 +00:00
if ( is_array ( $zf ) && array_path_exists ( 'signature/signer' , $zf ) && $zf [ 'signature' ][ 'signer' ] === $href && intval ( $zf [ 'signature' ][ 'header_valid' ])) {
2018-10-16 02:29:32 +00:00
$xc = Libzot :: import_xchan ( $zf [ 'data' ]);
2016-04-19 03:38:38 +00:00
$r = q ( " select * from xchan where xchan_addr = '%s' limit 1 " ,
dbesc ( $_REQUEST [ 'address' ])
);
2020-06-24 00:45:27 +00:00
if ( $r ) {
App :: $poi = $r [ 0 ];
2016-10-27 01:35:10 +00:00
}
}
2020-06-24 00:45:27 +00:00
if ( ! $r ) {
if ( discover_by_webbie ( $_REQUEST [ 'address' ])) {
2016-10-27 01:35:10 +00:00
$r = q ( " select * from xchan where xchan_addr = '%s' limit 1 " ,
dbesc ( $_REQUEST [ 'address' ])
);
2020-06-24 00:45:27 +00:00
if ( $r ) {
App :: $poi = $r [ 0 ];
2016-10-27 01:35:10 +00:00
}
}
2016-04-19 03:38:38 +00:00
}
}
}
2020-06-24 00:45:27 +00:00
if ( ! App :: $poi ) {
notice ( t ( 'Channel not found.' ) . EOL );
return ;
2016-04-19 03:38:38 +00:00
}
2016-10-27 04:50:30 +00:00
$is_zot = false ;
2017-06-26 01:49:50 +00:00
$connected = false ;
2016-04-19 03:38:38 +00:00
2020-06-24 00:45:27 +00:00
$url = App :: $poi [ 'xchan_url' ];
if ( App :: $poi [ 'xchan_network' ] === 'zot6' ) {
$is_zot = true ;
}
if ( local_channel ()) {
$c = q ( " select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1 " ,
intval ( local_channel ()),
dbesc ( App :: $poi [ 'xchan_hash' ])
);
if ( $c ) {
$connected = true ;
2017-06-26 02:17:05 +00:00
}
2017-06-26 01:49:50 +00:00
}
2016-10-27 04:50:30 +00:00
// We will load the chanview template if it's a foreign network,
// just so that we can provide a connect button along with a profile
// photo. Chances are we can't load the remote profile into an iframe
// because of cross-domain security headers. So provide a link to
// the remote profile.
2017-06-26 01:49:50 +00:00
// If we are already connected, just go to the profile.
2016-10-27 04:50:30 +00:00
// Zot channels will usually have a connect link.
2016-04-19 03:38:38 +00:00
2020-06-24 00:45:27 +00:00
if ( $is_zot || $connected ) {
if ( $is_zot && $observer ) {
2016-10-27 04:50:30 +00:00
$url = zid ( $url );
}
goaway ( $url );
}
else {
2020-06-24 00:45:27 +00:00
$o = replace_macros ( get_markup_template ( 'chanview.tpl' ), [
2016-10-27 04:50:30 +00:00
'$url' => $url ,
'$full' => t ( 'toggle full screen mode' )
2020-06-24 00:45:27 +00:00
]);
2016-04-19 03:38:38 +00:00
2016-10-27 04:50:30 +00:00
return $o ;
}
2016-04-19 03:38:38 +00:00
}
}