connections.php 18.2 KB
Newer Older
friendica's avatar
friendica committed
1
<?php /** @file */
Zot's avatar
Zot committed
2

friendica's avatar
friendica committed
3

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
function abook_store_lowlevel($arr) {

	$store = [
		'abook_account'     => ((array_key_exists('abook_account',$arr))     ? $arr['abook_account']     : 0),
		'abook_channel'     => ((array_key_exists('abook_channel',$arr))     ? $arr['abook_channel']     : 0),
		'abook_xchan'       => ((array_key_exists('abook_xchan',$arr))       ? $arr['abook_xchan']       : ''),
		'abook_my_perms'    => ((array_key_exists('abook_my_perms',$arr))    ? $arr['abook_my_perms']    : 0),
		'abook_their_perms' => ((array_key_exists('abook_their_perms',$arr)) ? $arr['abook_their_perms'] : 0),
		'abook_closeness'   => ((array_key_exists('abook_closeness',$arr))   ? $arr['abook_closeness']   : 99),
		'abook_created'     => ((array_key_exists('abook_created',$arr))     ? $arr['abook_created']     : NULL_DATE),
		'abook_updated'     => ((array_key_exists('abook_updated',$arr))     ? $arr['abook_updated']     : NULL_DATE),
		'abook_connected'   => ((array_key_exists('abook_connected',$arr))   ? $arr['abook_connected']   : NULL_DATE),
		'abook_dob'         => ((array_key_exists('abook_dob',$arr))         ? $arr['abook_dob']         : NULL_DATE),
		'abook_flags'       => ((array_key_exists('abook_flags',$arr))       ? $arr['abook_flags']       : 0),
		'abook_blocked'     => ((array_key_exists('abook_blocked',$arr))     ? $arr['abook_blocked']     : 0),
		'abook_ignored'     => ((array_key_exists('abook_ignored',$arr))     ? $arr['abook_ignored']     : 0),
		'abook_hidden'      => ((array_key_exists('abook_hidden',$arr))      ? $arr['abook_hidden']      : 0),
		'abook_archived'    => ((array_key_exists('abook_archived',$arr))    ? $arr['abook_archived']    : 0),
		'abook_pending'     => ((array_key_exists('abook_pending',$arr))     ? $arr['abook_pending']     : 0),
		'abook_unconnected' => ((array_key_exists('abook_unconnected',$arr)) ? $arr['abook_unconnected'] : 0),
		'abook_self'        => ((array_key_exists('abook_self',$arr))        ? $arr['abook_self']        : 0),
		'abook_feed'        => ((array_key_exists('abook_feed',$arr))        ? $arr['abook_feed']        : 0),
26
		'abook_not_here'    => ((array_key_exists('abook_not_here',$arr))    ? $arr['abook_not_here']    : 0),
27 28 29 30 31 32 33 34 35 36
		'abook_profile'     => ((array_key_exists('abook_profile',$arr))     ? $arr['abook_profile']     : ''),
		'abook_incl'        => ((array_key_exists('abook_incl',$arr))        ? $arr['abook_incl']        : ''),
		'abook_excl'        => ((array_key_exists('abook_excl',$arr))        ? $arr['abook_excl']        : ''),
		'abook_instance'    => ((array_key_exists('abook_instance',$arr))    ? $arr['abook_instance']    : '')
	];

	return create_table_from_array('abook',$store);

}

37 38

function rconnect_url($channel_id,$xchan) {
39

40 41
	if(! $xchan)
		return '';
42 43

	$r = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
44 45 46
		intval($channel_id),
		dbesc($xchan)
	);
47

48 49
	if($r)
		return '';
50

51 52 53 54 55 56 57
	$r = q("select * from xchan where xchan_hash = '%s' limit 1",
		dbesc($xchan)
	);

	if(($r) && ($r[0]['xchan_follow']))
		return $r[0]['xchan_follow'];

58 59
	$r = q("select hubloc_url from hubloc where hubloc_hash = '%s' and hubloc_primary = 1 limit 1",
		dbesc($xchan)
60
	);
61

62
	if($r)
63
		return $r[0]['hubloc_url'] . '/follow?f=&url=%s';
64
	return '';
65

66 67
}

friendica's avatar
friendica committed
68
function abook_connections($channel_id, $sql_conditions = '') {
69
	$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
redmatrix's avatar
redmatrix committed
70 71
		and abook_self = 0 $sql_conditions",
		intval($channel_id)
72 73 74 75 76 77
	);
	return(($r) ? $r : array());
}	

function abook_self($channel_id) {
	$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
redmatrix's avatar
redmatrix committed
78 79
		and abook_self = 1 limit 1",
		intval($channel_id)
80 81 82 83
	);
	return(($r) ? $r[0] : array());
}	

friendica's avatar
friendica committed
84

85
function vcard_from_xchan($xchan, $observer = null, $mode = '') {
86

87
	if(! $xchan) {
redmatrix's avatar
redmatrix committed
88 89
		if(App::$poi) {
			$xchan = App::$poi;
friendica's avatar
friendica committed
90
		}
redmatrix's avatar
redmatrix committed
91
		elseif(is_array(App::$profile) && App::$profile['channel_hash']) {
92
			$r = q("select * from xchan where xchan_hash = '%s' limit 1",
redmatrix's avatar
redmatrix committed
93
				dbesc(App::$profile['channel_hash'])
94 95 96
			);
			if($r)
				$xchan = $r[0];
friendica's avatar
friendica committed
97
		}
98 99 100 101 102
	}

	if(! $xchan)
		return;

103
	$connect = false;
friendica's avatar
friendica committed
104
	if(local_channel()) {
105 106
		$r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
			dbesc($xchan['xchan_hash']),
friendica's avatar
friendica committed
107
			intval(local_channel())
108 109 110 111
		);
		if(! $r)
			$connect = t('Connect');
	}
112

113 114 115 116 117 118
	// don't provide a connect button for transient or one-way identities

	if(in_array($xchan['xchan_network'],['rss','anon','unknown']) || strpos($xchan['xchan_addr'],'guest:') === 0) {
		$connect = false;
	}

119
	if(array_key_exists('channel_id',$xchan))
redmatrix's avatar
redmatrix committed
120
		App::$profile_uid = $xchan['channel_id'];
121

122
	$url = (($observer) 
Zot's avatar
Zot committed
123
		? z_root() . '/magic?f=&owa=1&bdest=' . bin2hex($xchan['xchan_url']) . '&addr=' . $xchan['xchan_addr'] 
124 125 126
		: $xchan['xchan_url']
	);
					
127
	return replace_macros(get_markup_template('xchan_vcard.tpl'),array(
128
		'$name'    => $xchan['xchan_name'],
redmatrix's avatar
redmatrix committed
129
		'$photo'   => ((is_array(App::$profile) && array_key_exists('photo',App::$profile)) ? App::$profile['photo'] : $xchan['xchan_photo_l']),
130
		'$follow'  => (($xchan['xchan_addr']) ? $xchan['xchan_addr'] : $xchan['xchan_url']),
131
		'$link'    => zid($xchan['xchan_url']),
132 133 134 135
		'$connect' => $connect,
		'$newwin'  => (($mode === 'chanview') ? t('New window') : ''),
		'$newtit'  => t('Open the selected location in a different window or browser tab'),
		'$url'     => $url,
136 137 138 139 140
	));
}

function abook_toggle_flag($abook,$flag) {

redmatrix's avatar
redmatrix committed
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
	$field = '';

	switch($flag) {
		case ABOOK_FLAG_BLOCKED:
			$field = 'abook_blocked';
			break;
		case ABOOK_FLAG_IGNORED:
			$field = 'abook_ignored';
			break;
		case ABOOK_FLAG_HIDDEN:
			$field = 'abook_hidden';
			break;
		case ABOOK_FLAG_ARCHIVED:
			$field = 'abook_archived';
			break;
		case ABOOK_FLAG_PENDING:
			$field = 'abook_pending';
			break;
		case ABOOK_FLAG_UNCONNECTED:
			$field = 'abook_unconnected';
			break;
		case ABOOK_FLAG_SELF:
			$field = 'abook_self';
			break;
		case ABOOK_FLAG_FEED:
			$field = 'abook_feed';
			break;
		default:
			break;
	}
	if(! $field)
		return;

    $r = q("UPDATE abook set $field = (1 - $field) where abook_id = %d and abook_channel = %d",
175 176 177
			intval($abook['abook_id']),
			intval($abook['abook_channel'])
	);
178

179 180 181

	// if unsetting the archive bit, update the timestamps so we'll try to connect for an additional 30 days. 

redmatrix's avatar
redmatrix committed
182
	if(($flag === ABOOK_FLAG_ARCHIVED) && (intval($abook['abook_archived']))) {
183
		$r = q("update abook set abook_connected = '%s', abook_updated = '%s' 
184
			where abook_id = %d and abook_channel = %d",
185 186 187 188 189 190 191
			dbesc(datetime_convert()),
			dbesc(datetime_convert()),
			intval($abook['abook_id']),
			intval($abook['abook_channel'])
		);
	}

192 193 194 195
	return $r;

}

friendica's avatar
friendica committed
196

Zot's avatar
Zot committed
197

198 199 200 201 202 203 204 205 206 207 208
/**
 * mark any hubs "offline" that haven't been heard from in more than 30 days
 * Allow them to redeem themselves if they come back later.
 * Then go through all those that are newly marked and see if any other hubs
 * are attached to the controlling xchan that are still alive.
 * If not, they're dead (although they could come back some day).
 */


function mark_orphan_hubsxchans() {

209 210 211 212
	$dirmode = intval(get_config('system','directory_mode'));
	if($dirmode == DIRECTORY_MODE_NORMAL)
		return;

213
	$r = q("update hubloc set hubloc_error = 1 where hubloc_error = 0 
214
		and hubloc_network = 'zot' and hubloc_connected < %s - interval %s",
215 216
		db_utcnow(), db_quoteinterval('36 day')
	);
217

218 219 220 221 222 223 224 225 226 227 228 229 230
//	$realm = get_directory_realm();
//	if($realm == DIRECTORY_REALM) {
//		$r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') order by rand()",
//			dbesc($realm)
//		);
//	}
//	else {
//		$r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' order by rand()",
//			dbesc($realm)
//		);
//	}


231
	$r = q("select hubloc_id, hubloc_hash from hubloc where hubloc_error = 0 and hubloc_orphancheck = 0");
232 233 234 235 236 237

	if($r) {
		foreach($r as $rr) {

			// see if any other hublocs are still alive for this channel

238
			$x = q("select * from hubloc where hubloc_hash = '%s' and hubloc_error = 0",
239
				dbesc($rr['hubloc_hash'])
240 241 242 243 244
			);
			if($x) {

				// yes - if the xchan was marked as an orphan, undo it

245
				$y = q("update xchan set xchan_orphan = 0 where xchan_orphan = 1 and xchan_hash = '%s'",
246 247 248 249 250 251 252 253
					dbesc($rr['hubloc_hash'])
				);

			}
			else {

				// nope - mark the xchan as an orphan

254
				$y = q("update xchan set xchan_orphan = 1 where xchan_hash = '%s'",
255 256 257 258 259 260
					dbesc($rr['hubloc_hash'])
				);
			}

			// mark that we've checked this entry so we don't need to do it again

261
			$y = q("update hubloc set hubloc_orphancheck = 1 where hubloc_id = %d",
262 263 264 265 266 267 268 269 270 271
				dbesc($rr['hubloc_id'])
			);
		}
	}

}




friendica's avatar
friendica committed
272 273 274 275 276 277 278 279 280
function remove_all_xchan_resources($xchan, $channel_id = 0) {

	if(intval($channel_id)) {



	}
	else {

281 282
		$dirmode = intval(get_config('system','directory_mode'));

friendica's avatar
friendica committed
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298

		$r = q("delete from photo where xchan = '%s'",
			dbesc($xchan)
		);
		$r = q("select resource_id, resource_type, uid, id from item where ( author_xchan = '%s' or owner_xchan = '%s' ) ",
			dbesc($xchan),
			dbesc($xchan)
		);
		if($r) {
			foreach($r as $rr) {
				drop_item($rr,false);
			}
		}
		$r = q("delete from event where event_xchan = '%s'",
			dbesc($xchan)
		);
Max Kostikov's avatar
Max Kostikov committed
299
		$r = q("delete from pgrp_member where xchan = '%s'",
friendica's avatar
friendica committed
300 301 302 303 304 305 306 307 308 309 310
			dbesc($xchan)
		);
		$r = q("delete from mail where ( from_xchan = '%s' or to_xchan = '%s' )",
			dbesc($xchan),
			dbesc($xchan)
		);
		$r = q("delete from xlink where ( xlink_xchan = '%s' or xlink_link = '%s' )",
			dbesc($xchan),
			dbesc($xchan)
		);

311 312 313 314 315 316
		$r = q("delete from abook where abook_xchan = '%s'",
			dbesc($xchan)
		);


		if($dirmode === false || $dirmode == DIRECTORY_MODE_NORMAL) {
friendica's avatar
friendica committed
317

318
			$r = q("delete from xchan where xchan_hash = '%s'",
319 320 321 322 323
				dbesc($xchan)
			);
			$r = q("delete from hubloc where hubloc_hash = '%s'",
				dbesc($xchan)
			);
324

325 326 327 328
		}
		else {

			// directory servers need to keep the record around for sync purposes - mark it deleted
friendica's avatar
friendica committed
329

330 331 332
			$r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
				dbesc($xchan)
			);
333

334 335 336
			$r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
				dbesc($xchan)
			);
337
		}
friendica's avatar
friendica committed
338 339 340 341
	}
}


342
function contact_remove($channel_id, $abook_id) {
343

344 345
	if((! $channel_id) || (! $abook_id))
		return false;
346

347 348
	logger('removing contact ' . $abook_id . ' for channel ' . $channel_id,LOGGER_DEBUG);

349 350 351 352 353

	$x = [ 'channel_id' => $channel_id, 'abook_id' => $abook_id ];
	call_hooks('connection_remove',$x);


354
	$archive = get_pconfig($channel_id, 'system','archive_removed_contacts');
355
	if($archive) {
redmatrix's avatar
redmatrix committed
356
		q("update abook set abook_archived = 1 where abook_id = %d and abook_channel = %d",
357 358
			intval($abook_id),
			intval($channel_id)
359
		);
360
		return true;
361 362
	}

363 364 365
	$r = q("select * from abook where abook_id = %d and abook_channel = %d limit 1",
		intval($abook_id),
		intval($channel_id)
Zot's avatar
Zot committed
366
	);
367 368 369 370 371 372

	if(! $r)
		return false;

	$abook = $r[0];

redmatrix's avatar
redmatrix committed
373
	if(intval($abook['abook_self']))
374 375
		return false;

376
	$r = q("select id from item where (owner_xchan = '%s' or author_xchan = '%s') and uid = %d and item_retained = 0 and item_starred = 0",
377
		dbesc($abook['abook_xchan']),
378 379
		dbesc($abook['abook_xchan']),
		intval($channel_id)
Zot's avatar
Zot committed
380
	);
friendica's avatar
friendica committed
381 382
	if($r) {
		foreach($r as $rr) {
Mario's avatar
Mario committed
383
			$x = q("select uid from term where otype = %d and oid = %d and ttype = %d limit 1",
384 385 386 387 388 389
				intval(TERM_OBJ_POST),
				intval($rr['id']),
				intval(TERM_FILE)
			);
			if($x) {
				continue;
390
			}
391
			drop_item($rr['id'],false);
friendica's avatar
friendica committed
392 393
		}
	}
394
	
395
	q("delete from abook where abook_id = %d and abook_channel = %d",
396 397 398 399
		intval($abook['abook_id']),
		intval($channel_id)
	);

friendica's avatar
friendica committed
400 401 402
	$r = q("delete from event where event_xchan = '%s' and uid = %d",
		dbesc($abook['abook_xchan']),
		intval($channel_id)
Friendika's avatar
Friendika committed
403
	);
friendica's avatar
friendica committed
404

Max Kostikov's avatar
Max Kostikov committed
405
	$r = q("delete from pgrp_member where xchan = '%s' and uid = %d",
friendica's avatar
friendica committed
406 407
		dbesc($abook['abook_xchan']),
		intval($channel_id)
408
	);
friendica's avatar
friendica committed
409

410
	$r = q("delete from mail where ( from_xchan = '%s' or to_xchan = '%s' ) and channel_id = %d ",
friendica's avatar
friendica committed
411 412 413
		dbesc($abook['abook_xchan']),
		dbesc($abook['abook_xchan']),
		intval($channel_id)
414 415
	);

416 417 418 419 420
	$r = q("delete from abconfig where chan = %d and xchan = '%s'",
			intval($channel_id),
			dbesc($abook['abook_xchan'])
	);

421
	return true;
Zot's avatar
Zot committed
422 423 424 425
}



426
function random_profile() {
427
	$randfunc = db_getfunc('rand');
friendica's avatar
friendica committed
428

429 430
	$checkrandom = get_config('randprofile','check'); // False by default
	$retryrandom = intval(get_config('randprofile','retry'));
friendica's avatar
friendica committed
431
	if($retryrandom == 0) $retryrandom = 5;
432 433

	for($i = 0; $i < $retryrandom; $i++) {
friendica's avatar
friendica committed
434

435 436 437 438
		$r = q("select xchan_url, xchan_hash from xchan left join hubloc on hubloc_hash = xchan_hash where
			xchan_hidden = 0 and xchan_system = 0 and
			xchan_network = 'zot' and xchan_deleted = 0 and
			hubloc_connected > %s - interval %s order by $randfunc limit 1",
439 440
			db_utcnow(),
			db_quoteinterval('30 day')
441 442 443 444 445
		);

		if(!$r) return ''; // Couldn't get a random channel

		if($checkrandom) {
446 447
			$x = z_fetch_url($r[0]['xchan_url']);
			if($x['success'])
448
				return $r[0]['xchan_hash'];
449 450 451 452
			else
				logger('Random channel turned out to be bad.');
		}
		else {
453
			return $r[0]['xchan_hash'];
454 455 456
		}

	}
457
	return '';
458 459
}

Zot's avatar
Zot committed
460 461
function update_vcard($arr,$vcard = null) {

462 463 464

	//	logger('update_vcard: ' . print_r($arr,true));

Zot's avatar
Zot committed
465 466
	$fn = $arr['fn'];

467 468 469 470 471 472 473 474 475 476 477 478
	
	// This isn't strictly correct and could be a cause for concern.
	// 'N' => array_reverse(explode(' ', $fn))


	// What we really want is 
	// 'N' => Adams;John;Quincy;Reverend,Dr.;III
	// which is a very difficult parsing problem especially if you allow
	// the surname to contain spaces. The only way to be sure to get it
	// right is to provide a form to input all the various fields and not 
	// try to extract it from the FN. 

Zot's avatar
Zot committed
479 480 481 482 483 484
	if(! $vcard) {
		$vcard = new \Sabre\VObject\Component\VCard([
			'FN' => $fn,
			'N' => array_reverse(explode(' ', $fn))
		]);
	}
485 486 487 488 489
	else {
		$vcard->FN = $fn;
		$vcard->N = array_reverse(explode(' ', $fn));
	}

Zot's avatar
Zot committed
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
	$org = $arr['org'];
	if($org) {
		$vcard->ORG = $org;
	}

	$title = $arr['title'];
	if($title) {
		$vcard->TITLE = $title;
	}

	$tel = $arr['tel'];
	$tel_type = $arr['tel_type'];
	if($tel) {
		$i = 0;
		foreach($tel as $item) {
			if($item) {
				$vcard->add('TEL', $item, ['type' => $tel_type[$i]]);
			}
			$i++;
		}
	}

	$email = $arr['email'];
	$email_type = $arr['email_type'];
	if($email) {
		$i = 0;
		foreach($email as $item) {
			if($item) {
				$vcard->add('EMAIL', $item, ['type' => $email_type[$i]]);
			}
			$i++;
		}
	}

	$impp = $arr['impp'];
	$impp_type = $arr['impp_type'];
	if($impp) {
		$i = 0;
		foreach($impp as $item) {
			if($item) {
				$vcard->add('IMPP', $item, ['type' => $impp_type[$i]]);
			}
			$i++;
		}
	}

	$url = $arr['url'];
	$url_type = $arr['url_type'];
	if($url) {
		$i = 0;
		foreach($url as $item) {
			if($item) {
				$vcard->add('URL', $item, ['type' => $url_type[$i]]);
			}
			$i++;
		}
	}

	$adr = $arr['adr'];
	$adr_type = $arr['adr_type'];

	if($adr) {
		$i = 0;
		foreach($adr as $item) {
			if($item) {
				$vcard->add('ADR', $item, ['type' => $adr_type[$i]]);
			}
			$i++;
		}
	}

	$note = $arr['note'];
	if($note) {
		$vcard->NOTE = $note;
	}

	return $vcard->serialize();

}

Zot's avatar
Zot committed
570
function get_vcard_array($vc,$id) {
Zot's avatar
Zot committed
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646

	$photo = '';
	if($vc->PHOTO) {
		$photo_value = strtolower($vc->PHOTO->getValueType()); // binary or uri
		if($photo_value === 'binary') {
			$photo_type = strtolower($vc->PHOTO['TYPE']); // mime jpeg, png or gif
			$photo = 'data:image/' . $photo_type . ';base64,' . base64_encode((string)$vc->PHOTO);
		}
		else {
			$url = parse_url((string)$vc->PHOTO);
			$photo = 'data:' . $url['path'];
		}
	}

	$fn = '';
	if($vc->FN) {
		$fn = (string) escape_tags($vc->FN);
	}

	$org = '';
	if($vc->ORG) {
		$org = (string) escape_tags($vc->ORG);
	}

	$title = '';
	if($vc->TITLE) {
		$title = (string) escape_tags($vc->TITLE);
	}

	$tels = [];
	if($vc->TEL) {
		foreach($vc->TEL as $tel) {
			$type = (($tel['TYPE']) ? vcard_translate_type((string)$tel['TYPE']) : '');
			$tels[] = [
				'type' => $type,
				'nr' => (string) escape_tags($tel)
			];
		}
	}
	$emails = [];
	if($vc->EMAIL) {
		foreach($vc->EMAIL as $email) {
			$type = (($email['TYPE']) ? vcard_translate_type((string)$email['TYPE']) : '');
			$emails[] = [
				'type' => $type,
				'address' => (string) escape_tags($email)
			];
		}
	}

	$impps = [];
	if($vc->IMPP) {
		foreach($vc->IMPP as $impp) {
			$type = (($impp['TYPE']) ? vcard_translate_type((string)$impp['TYPE']) : '');
			$impps[] = [
				'type' => $type,
				'address' => (string) escape_tags($impp)
			];
		}
	}

	$urls = [];
	if($vc->URL) {
		foreach($vc->URL as $url) {
			$type = (($url['TYPE']) ? vcard_translate_type((string)$url['TYPE']) : '');
			$urls[] = [
				'type' => $type,
				'address' => (string) escape_tags($url)
			];
		}
	}

	$adrs = [];
	if($vc->ADR) {
		foreach($vc->ADR as $adr) {
			$type = (($adr['TYPE']) ? vcard_translate_type((string)$adr['TYPE']) : '');
Zot's avatar
Zot committed
647
			$entry = [
Zot's avatar
Zot committed
648
				'type' => $type,
649
				'address' => $adr->getParts()
Zot's avatar
Zot committed
650
			];
Zot's avatar
Zot committed
651 652 653 654 655 656 657 658 659 660

			if(is_array($entry['address'])) {
				array_walk($entry['address'],'array_escape_tags');
			}
			else { 
				$entry['address'] = (string) escape_tags($entry['address']);
			}

			$adrs[] = $entry;
				
Zot's avatar
Zot committed
661 662 663 664 665 666 667 668 669
		}
	}

	$note = '';
	if($vc->NOTE) {
		$note = (string) escape_tags($vc->NOTE);
	}

	$card = [
Zot's avatar
Zot committed
670
		'id'     => $id,
Zot's avatar
Zot committed
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712
		'photo'  => $photo,
		'fn'     => $fn,
		'org'    => $org,
		'title'  => $title,
		'tels'   => $tels,
		'emails' => $emails,
		'impps'  => $impps,
		'urls'   => $urls,
		'adrs'   => $adrs,
		'note'   => $note
	];

	return $card;

}


function vcard_translate_type($type) {

	if(!$type)
		return;

	$type = strtoupper($type);

	$map = [
		'CELL' => t('Mobile'),
		'HOME' => t('Home'),
		'HOME,VOICE' => t('Home, Voice'),
		'HOME,FAX' => t('Home, Fax'),
		'WORK' => t('Work'),
		'WORK,VOICE' => t('Work, Voice'),
		'WORK,FAX' => t('Work, Fax'),
		'OTHER' => t('Other')
	];

	if (array_key_exists($type, $map)) {
		return [$type, $map[$type]];
	}
	else {
		return [$type, t('Other') . ' (' . $type . ')'];
	}
}
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741


function vcard_query(&$r) {

	$arr = [];

	if($r && is_array($r) && count($r)) {
		$uid = $r[0]['abook_channel'];
		foreach($r as $rv) {
			if($rv['abook_xchan'] && (! in_array("'" . dbesc($rv['abook_xchan']) . "'",$arr)))
				$arr[] = "'" . dbesc($rv['abook_xchan']) . "'";
		}
	}

	if($arr) {
		$a = q("select * from abconfig where chan = %d and xchan in (" . protect_sprintf(implode(',', $arr)) . ") and cat = 'system' and k = 'vcard'",
			intval($uid)
		);
		if($a) {
			foreach($a as $av) {
				for($x = 0; $x < count($r); $x ++) {
					if($r[$x]['abook_xchan'] == $av['xchan']) {		
						$vctmp = \Sabre\VObject\Reader::read($av['v']);
						$r[$x]['vcard'] = (($vctmp) ? get_vcard_array($vctmp,$r[$x]['abook_id']) : [] );
					}
				}
			}
		}
	}
742
}