diff --git a/INSTALL.txt b/INSTALL.txt index 705eb8fed2..2f0613fb7d 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -56,6 +56,13 @@ you wish to communicate with the Diaspora network. - For alternative server configurations (such as Nginx server and MariaDB database engine), refer to the wiki at https://github.com/friendica/friendica/wiki +This guide will walk you through the manual installation process of Friendica. +If this is nothing for you, you might be interested in + +* the Friendica Docker image (https://github.com/friendica/docker) or +* how install Friendica with YunoHost (https://github.com/YunoHost-Apps/friendica_ynh). + + 2. Unpack the Friendica files into the root of your web server document area. - If you copy the directory tree to your webserver, make sure diff --git a/boot.php b/boot.php index eda4ed1e8d..f40edaf907 100644 --- a/boot.php +++ b/boot.php @@ -41,7 +41,7 @@ define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily'); define('FRIENDICA_VERSION', '2018.12-dev'); define('DFRN_PROTOCOL_VERSION', '2.23'); -define('DB_UPDATE_VERSION', 1285); +define('DB_UPDATE_VERSION', 1286); define('NEW_UPDATE_ROUTINE_VERSION', 1170); /** diff --git a/config/dbstructure.json b/config/dbstructure.json index 443f9bd755..8ea5aaa4bf 100644 --- a/config/dbstructure.json +++ b/config/dbstructure.json @@ -1298,14 +1298,16 @@ "created": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Creation date"}, "pid": {"type": "int unsigned", "not null": "1", "default": "0", "comment": "Process id of the worker"}, "executed": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Execution date"}, + "next_try": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Next retrial date"}, + "retrial": {"type": "tinyint", "not null": "1", "default": "0", "comment": "Retrial counter"}, "done": {"type": "boolean", "not null": "1", "default": "0", "comment": "Marked 1 when the task was done - will be deleted later"} }, "indexes": { "PRIMARY": ["id"], "pid": ["pid"], "parameter": ["parameter(64)"], - "priority_created": ["priority", "created"], - "done_executed": ["done", "executed"] + "priority_created_next_try": ["priority", "created", "next_try"], + "done_executed_next_try": ["done", "executed", "next_try"] } } } diff --git a/doc/Install.md b/doc/Install.md index 427299c3ea..e6d1d40645 100644 --- a/doc/Install.md +++ b/doc/Install.md @@ -40,6 +40,14 @@ Requirements Installation procedure --- +### Alternative Installation Methods + +This guide will walk you through the manual installation process of Friendica. +If this is nothing for you, you might be interested in + +* the [Friendica Docker image](https://github.com/friendica/docker) or +* how [install Friendica with YunoHost](https://github.com/YunoHost-Apps/friendica_ynh). + ### Get Friendica Unpack the Friendica files into the root of your web server document area. diff --git a/doc/de/Install.md b/doc/de/Install.md index 84d9a0d48e..132fbc1904 100644 --- a/doc/de/Install.md +++ b/doc/de/Install.md @@ -40,6 +40,14 @@ Requirements Installation --- +### Alternative Wege um Friendica zu Installieren + +Diese Anleitung wird dir Schritt-für-Schritt zeigen wie du Friendica auf deinem Server installieren kannst. +Falls du an automatischen Möglichkeiten interesse hast, wirf doch einen Blick auf + +* das [Docker image für Friendica](https://github.com/friendica/docker) oder +* die [Installation von Friendica auf YunoHost](https://github.com/YunoHost-Apps/friendica_ynh). + ### Friendica Entpacke die Friendica-Daten in das Quellverzeichnis (root) des Dokumentenbereichs deines Webservers. diff --git a/include/api.php b/include/api.php index 01cb93a3b8..ff763e9885 100644 --- a/include/api.php +++ b/include/api.php @@ -761,7 +761,7 @@ function api_get_user(App $a, $contact_id = null) 'statusnet_blocking' => false, 'notifications' => false, /// @TODO old way? - //'statusnet_profile_url' => System::baseUrl()."/contacts/".$uinfo[0]['cid'], + //'statusnet_profile_url' => System::baseUrl()."/contact/".$uinfo[0]['cid'], 'statusnet_profile_url' => $uinfo[0]['url'], 'uid' => intval($uinfo[0]['uid']), 'cid' => intval($uinfo[0]['cid']), diff --git a/mod/admin.php b/mod/admin.php index d0e8ab0e38..b02db73bdd 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -1922,7 +1922,7 @@ function admin_page_users(App $a) '$h_users' => L10n::t('Users'), '$h_newuser' => L10n::t('New User'), - '$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Deleted since')], + '$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Delete in')], '$th_users' => $th_users, '$order_users' => $order, '$order_direction_users' => $order_direction, diff --git a/mod/allfriends.php b/mod/allfriends.php index b41d0c891b..cee067e97a 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -8,13 +8,12 @@ use Friendica\Content\ContactSelector; use Friendica\Core\L10n; use Friendica\Core\System; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\GContact; -use Friendica\Model\Profile; +use Friendica\Model; +use Friendica\Module; use Friendica\Util\Proxy as ProxyUtils; + require_once 'include/dba.php'; -require_once 'mod/contacts.php'; function allfriends_content(App $a) { @@ -42,13 +41,13 @@ function allfriends_content(App $a) } $a->page['aside'] = ""; - Profile::load($a, "", 0, Contact::getDetailsByURL($contact["url"])); + Model\Profile::load($a, "", 0, Model\Contact::getDetailsByURL($contact["url"])); - $total = GContact::countAllFriends(local_user(), $cid); + $total = Model\GContact::countAllFriends(local_user(), $cid); $a->setPagerTotal($total); - $r = GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']); + $r = Model\GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']); if (!DBA::isResult($r)) { $o .= L10n::t('No friends to display.'); return $o; @@ -59,7 +58,7 @@ function allfriends_content(App $a) $entries = []; foreach ($r as $rr) { //get further details of the contact - $contact_details = Contact::getDetailsByURL($rr['url'], $uid, $rr); + $contact_details = Model\Contact::getDetailsByURL($rr['url'], $uid, $rr); $photo_menu = ''; @@ -68,11 +67,11 @@ function allfriends_content(App $a) // If the contact is not common to the user, Connect/Follow' will be added to the photo menu if ($rr['cid']) { $rr['id'] = $rr['cid']; - $photo_menu = Contact::photoMenu($rr); + $photo_menu = Model\Contact::photoMenu($rr); } else { $connlnk = System::baseUrl() . '/follow/?url=' . $rr['url']; $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Contact::magicLink($rr['url'])], + 'profile' => [L10n::t("View Profile"), Model\Contact::magicLink($rr['url'])], 'follow' => [L10n::t("Connect/Follow"), $connlnk] ]; } @@ -86,7 +85,7 @@ function allfriends_content(App $a) 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'account_type' => Contact::getAccountType($contact_details), + 'account_type' => Model\Contact::getAccountType($contact_details), 'network' => ContactSelector::networkToName($contact_details['network'], $contact_details['url']), 'photo_menu' => $photo_menu, 'conntxt' => L10n::t('Connect'), @@ -96,7 +95,7 @@ function allfriends_content(App $a) $entries[] = $entry; } - $tab_str = contacts_tab($a, $contact, 4); + $tab_str = Module\Contact::getTabsHTML($a, $contact, 4); $tpl = get_markup_template('viewcontact_template.tpl'); diff --git a/mod/common.php b/mod/common.php index d694527b86..25a6aef17a 100644 --- a/mod/common.php +++ b/mod/common.php @@ -7,13 +7,12 @@ use Friendica\App; use Friendica\Content\ContactSelector; use Friendica\Core\L10n; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\GContact; -use Friendica\Model\Profile; +use Friendica\Model; +use Friendica\Module; use Friendica\Util\Proxy as ProxyUtils; + require_once 'include/dba.php'; -require_once 'mod/contacts.php'; function common_content(App $a) { @@ -42,7 +41,7 @@ function common_content(App $a) if (DBA::isResult($contact)) { $a->page['aside'] = ""; - Profile::load($a, "", 0, Contact::getDetailsByURL($contact["url"])); + Model\Profile::load($a, "", 0, Model\Contact::getDetailsByURL($contact["url"])); } } else { $contact = DBA::selectFirst('contact', ['name', 'url', 'photo', 'uid', 'id'], ['self' => true, 'uid' => $uid]); @@ -65,12 +64,12 @@ function common_content(App $a) return; } - if (!$cid && Profile::getMyURL()) { - $contact = DBA::selectFirst('contact', ['id'], ['nurl' => normalise_link(Profile::getMyURL()), 'uid' => $uid]); + if (!$cid && Model\Profile::getMyURL()) { + $contact = DBA::selectFirst('contact', ['id'], ['nurl' => normalise_link(Model\Profile::getMyURL()), 'uid' => $uid]); if (DBA::isResult($contact)) { $cid = $contact['id']; } else { - $gcontact = DBA::selectFirst('gcontact', ['id'], ['nurl' => normalise_link(Profile::getMyURL())]); + $gcontact = DBA::selectFirst('gcontact', ['id'], ['nurl' => normalise_link(Model\Profile::getMyURL())]); if (DBA::isResult($gcontact)) { $zcid = $gcontact['id']; } @@ -82,9 +81,9 @@ function common_content(App $a) } if ($cid) { - $t = GContact::countCommonFriends($uid, $cid); + $t = Model\GContact::countCommonFriends($uid, $cid); } else { - $t = GContact::countCommonFriendsZcid($uid, $zcid); + $t = Model\GContact::countCommonFriendsZcid($uid, $zcid); } if ($t > 0) { @@ -95,9 +94,9 @@ function common_content(App $a) } if ($cid) { - $r = GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']); + $r = Model\GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']); } else { - $r = GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']); + $r = Model\GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']); } if (!DBA::isResult($r)) { @@ -109,13 +108,13 @@ function common_content(App $a) $entries = []; foreach ($r as $rr) { //get further details of the contact - $contact_details = Contact::getDetailsByURL($rr['url'], $uid); + $contact_details = Model\Contact::getDetailsByURL($rr['url'], $uid); // $rr['id'] is needed to use contact_photo_menu() /// @TODO Adding '/" here avoids E_NOTICE on missing constants $rr['id'] = $rr['cid']; - $photo_menu = Contact::photoMenu($rr); + $photo_menu = Model\Contact::photoMenu($rr); $entry = [ 'url' => $rr['url'], @@ -126,7 +125,7 @@ function common_content(App $a) 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'account_type' => Contact::getAccountType($contact_details), + 'account_type' => Model\Contact::getAccountType($contact_details), 'network' => ContactSelector::networkToName($contact_details['network'], $contact_details['url']), 'photo_menu' => $photo_menu, 'id' => ++$id, @@ -137,7 +136,7 @@ function common_content(App $a) $title = ''; $tab_str = ''; if ($cmd === 'loc' && $cid && local_user() == $uid) { - $tab_str = contacts_tab($a, $contact, 4); + $tab_str = Module\Contact::getTabsHTML($a, $contact, 4); } else { $title = L10n::t('Common Friends'); } diff --git a/mod/contacts.php b/mod/contacts.php deleted file mode 100644 index 4e149ab74f..0000000000 --- a/mod/contacts.php +++ /dev/null @@ -1,1123 +0,0 @@ -page, 'aside')) { - $a->page['aside'] = ''; - } - - $contact_id = null; - $contact = null; - if ((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']))) { - $contact_id = intval($a->argv[1]); - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - - if (!DBA::isResult($contact)) { - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0]); - } - - // Don't display contacts that are about to be deleted - if ($contact['network'] == Protocol::PHANTOM) { - $contact = false; - } - } - - if (DBA::isResult($contact)) { - if ($contact['self']) { - if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { - goaway('profile/' . $contact['nick']); - } else { - goaway('profile/' . $contact['nick'] . '?tab=profile'); - } - } - - $a->data['contact'] = $contact; - - if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != Protocol::DFRN)) { - $networkname = format_network_name($a->data['contact']['network'], $a->data['contact']['url']); - } else { - $networkname = ''; - } - - /// @TODO Add nice spaces - $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ - '$name' => htmlentities($a->data['contact']['name']), - '$photo' => $a->data['contact']['photo'], - '$url' => Contact::MagicLink($a->data['contact']['url']), - '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), - '$network_name' => $networkname, - '$network' => L10n::t('Network:'), - '$account_type' => Contact::getAccountType($a->data['contact']) - ]); - - $findpeople_widget = ''; - $follow_widget = ''; - $networks_widget = ''; - } else { - $vcard_widget = ''; - $networks_widget = Widget::networks('contacts', $nets); - if (isset($_GET['add'])) { - $follow_widget = Widget::follow($_GET['add']); - } else { - $follow_widget = Widget::follow(); - } - - $findpeople_widget = Widget::findPeople(); - } - - if ($contact['uid'] != 0) { - $groups_widget = Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); - } else { - $groups_widget = null; - } - - $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"), [ - '$vcard_widget' => $vcard_widget, - '$findpeople_widget' => $findpeople_widget, - '$follow_widget' => $follow_widget, - '$groups_widget' => $groups_widget, - '$networks_widget' => $networks_widget - ]); - - $base = System::baseUrl(); - $tpl = get_markup_template("contacts-head.tpl"); - $a->page['htmlhead'] .= replace_macros($tpl, [ - '$baseurl' => System::baseUrl(true), - '$base' => $base - ]); -} - -function contacts_batch_actions(App $a) -{ - if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { - return; - } - - $contacts_id = $_POST['contact_batch']; - - $orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0", - implode(",", $contacts_id), - intval(local_user()) - ); - - $count_actions = 0; - foreach ($orig_records as $orig_record) { - $contact_id = $orig_record['id']; - if (x($_POST, 'contacts_batch_update')) { - _contact_update($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_block')) { - _contact_block($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_ignore')) { - _contact_ignore($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_archive')) { - $r = _contact_archive($contact_id, $orig_record); - if ($r) { - $count_actions++; - } - } - if (x($_POST, 'contacts_batch_drop')) { - _contact_drop($orig_record); - $count_actions++; - } - } - if ($count_actions > 0) { - info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); - } - - goaway('contacts'); -} - -function contacts_post(App $a) -{ - if (!local_user()) { - return; - } - - if ($a->argv[1] === "batch") { - contacts_batch_actions($a); - return; - } - - $contact_id = intval($a->argv[1]); - if (!$contact_id) { - return; - } - - if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { - notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); - return; // NOTREACHED - } - - Addon::callHooks('contact_edit_post', $_POST); - - $profile_id = intval(defaults($_POST, 'profile-assign', 0)); - if ($profile_id) { - if (!DBA::exists('profile', ['id' => $profile_id, 'uid' => local_user()])) { - notice(L10n::t('Could not locate selected profile.') . EOL); - return; - } - } - - $hidden = intval($_POST['hidden']); - - $notify = intval($_POST['notify']); - - $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); - - $ffi_keyword_blacklist = escape_tags(trim(defaults($_POST, 'ffi_keyword_blacklist', ''))); - - $priority = intval(defaults($_POST, 'poll', 0)); - if ($priority > 5 || $priority < 0) { - $priority = 0; - } - - $info = escape_tags(trim($_POST['info'])); - - $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', - `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d, - `ffi_keyword_blacklist` = '%s' WHERE `id` = %d AND `uid` = %d", - intval($profile_id), - intval($priority), - DBA::escape($info), - intval($hidden), - intval($notify), - intval($fetch_further_information), - DBA::escape($ffi_keyword_blacklist), - intval($contact_id), - intval(local_user()) - ); - if (DBA::isResult($r)) { - info(L10n::t('Contact updated.') . EOL); - } else { - notice(L10n::t('Failed to update contact record.') . EOL); - } - - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - if (DBA::isResult($contact)) { - $a->data['contact'] = $contact; - } - - return; -} - -/* contact actions */ - -function _contact_update($contact_id) -{ - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); - if (!DBA::isResult($contact)) { - return; - } - - $uid = $contact["uid"]; - - if ($contact["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); - - if ($result['success']) { - q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", intval($contact_id)); - } - } else { - // pull feed and consume it, which should subscribe to the hub. - Worker::add(PRIORITY_HIGH, "OnePoll", $contact_id, "force"); - } -} - -function _contact_update_profile($contact_id) -{ - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); - if (!DBA::isResult($contact)) { - return; - } - - $uid = $contact["uid"]; - - $data = Probe::uri($contact["url"], "", 0, false); - - // "Feed" or "Unknown" is mostly a sign of communication problems - if ((in_array($data["network"], [Protocol::FEED, Protocol::PHANTOM])) && ($data["network"] != $contact["network"])) { - return; - } - - $updatefields = ["name", "nick", "url", "addr", "batch", "notify", "poll", "request", "confirm", - "poco", "network", "alias"]; - $update = []; - - if ($data["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $data["url"], false); - - if ($result['success']) { - $update["subhub"] = true; - } - } - - foreach ($updatefields AS $field) { - if (isset($data[$field]) && ($data[$field] != "")) { - $update[$field] = $data[$field]; - } - } - - $update["nurl"] = normalise_link($data["url"]); - - $query = ""; - - if (isset($data["priority"]) && ($data["priority"] != 0)) { - $query = "`priority` = " . intval($data["priority"]); - } - - foreach ($update AS $key => $value) { - if ($query != "") { - $query .= ", "; - } - - $query .= "`" . $key . "` = '" . DBA::escape($value) . "'"; - } - - if ($query == "") { - return; - } - - $r = q("UPDATE `contact` SET $query WHERE `id` = %d AND `uid` = %d", - intval($contact_id), - intval(local_user()) - ); - - // Update the entry in the contact table - Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); - - // Update the entry in the gcontact table - GContact::updateFromProbe($data["url"]); -} - -function _contact_block($contact_id) -{ - $blocked = !Contact::isBlockedByUser($contact_id, local_user()); - Contact::setBlockedForUser($contact_id, local_user(), $blocked); -} - -function _contact_ignore($contact_id) -{ - $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); - Contact::setIgnoredForUser($contact_id, local_user(), $ignored); -} - -function _contact_archive($contact_id, $orig_record) -{ - $archived = (($orig_record['archive']) ? 0 : 1); - $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", - intval($archived), - intval($contact_id), - intval(local_user()) - ); - return DBA::isResult($r); -} - -function _contact_drop($orig_record) -{ - $a = get_app(); - - $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` - WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", - intval($a->user['uid']) - ); - if (!DBA::isResult($r)) { - return; - } - - Contact::terminateFriendship($r[0], $orig_record, true); - Contact::remove($orig_record['id']); -} - -function contacts_content(App $a, $update = 0) -{ - $sort_type = 0; - $o = ''; - Nav::setSelected('contacts'); - - if (!local_user()) { - notice(L10n::t('Permission denied.') . EOL); - return Login::form(); - } - - if ($a->argc == 3) { - $contact_id = intval($a->argv[1]); - if (!$contact_id) { - return; - } - - $cmd = $a->argv[2]; - - $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); - if (!DBA::isResult($orig_record)) { - notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); - return; // NOTREACHED - } - - if ($cmd === 'update' && ($orig_record['uid'] != 0)) { - _contact_update($contact_id); - goaway('contacts/' . $contact_id); - // NOTREACHED - } - - if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { - _contact_update_profile($contact_id); - goaway('crepair/' . $contact_id); - // NOTREACHED - } - - if ($cmd === 'block') { - _contact_block($contact_id); - - $blocked = Contact::isBlockedByUser($contact_id, local_user()); - info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'ignore') { - _contact_ignore($contact_id); - - $ignored = Contact::isIgnoredByUser($contact_id, local_user()); - info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { - $r = _contact_archive($contact_id, $orig_record); - if ($r) { - $archived = (($orig_record['archive']) ? 0 : 1); - info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); - } - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { - // Check if we should do HTML-based delete confirmation - if (x($_REQUEST, 'confirm')) { - //