aboutsummaryrefslogtreecommitdiffstats
path: root/mod/magic.php
blob: c457c97eae8d9288848baba247a8e3a4d2198a9d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php

function magic_init(&$a) {

	$url = ((x($_REQUEST,'url')) ? $_REQUEST['url'] : '');
	$addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
	$hash = ((x($_REQUEST,'hash')) ? $_REQUEST['hash'] : '');
	$dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');


	if(local_user()) { 

		if($hash) {
			$x = q("select xchan.xchan_url, hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
				where hublock_hash = '%s' and (hubloc_flags & %d) limit 1",
				intval(HUBLOC_FLAGS_PRIMARY)
			);
		}
		elseif($addr) {
			$x = q("select hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash 
				where xchan_addr = '%s' and (hubloc_flags & %d) limit 1",
				dbesc($addr),
				intval(HUBLOC_FLAGS_PRIMARY)
			);
		}

		if(! $x) {
			notice( t('Channel not found.') . EOL);
			return;
		}

		if($x[0]['hubloc_url'] === z_root()) {
			$webbie = substr($x[0]['hubloc_addr'],0,strpos('@',$x[0]['hubloc_addr']));
			switch($dest) {
				case 'channel':
					$desturl = z_root() . '/channel/' . $webbie;
					break;
				case 'photos':
					$desturl = z_root() . '/photos/' . $webbie;
					break;
				case 'profile':
					$desturl = z_root() . '/profile/' . $webbie;
					break;
				default:
					$desturl = $dest;
					break;
			}
			// We are already authenticated on this site and a registered observer.
			// Just redirect.
			goaway($desturl);
		}
		$recip = array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig']));
 		$channel = $a->get_channel();
		$hash = random_string();
		$packet = zot_build_packet($channel,'auth',$recip,$x[0]['hubloc_sitekey'],$hash);
		$result = zot_zot($x[0]['hubloc_callback'],$packet);
		if($result['success']) {
			$j = json_decode($result['body'],true);
			if($j['iv']) {
				$y = aes_unencapsulate($j,$channel['prvkey']);
				$j = json_decode($y,true);
			}
			if($y['token'])
				goaway($x[0]['callback'] . '?f=&token=' . $token . '&dest=' . $dest);
		}
		goaway($dest);
	}

	goaway(z_root());
}