config = $config; $this->pconfig = $pconfig; $this->systemMessages = $systemMessages; } protected function post(array $request = []) { if (!$this->session->getLocalUserId()) { throw new HTTPException\ForbiddenException($this->l10n->t('Permission denied.')); } self::checkFormSecurityTokenRedirectOnError($this->args->getQueryString(), 'contactimport'); parent::post(); // Import Contacts from CSV file if (!empty($request['importcontact-submit'])) { $this->pconfig->set($this->session->getLocalUserId(), 'ostatus', 'legacy_contact', $request['legacy_contact']); if (isset($_FILES['importcontact-filename']) && !empty($_FILES['importcontact-filename']['tmp_name'])) { // was there an error if ($_FILES['importcontact-filename']['error'] > 0) { $this->logger->notice('Contact CSV file upload error', ['error' => $_FILES['importcontact-filename']['error']]); $this->systemMessages->addNotice($this->l10n->t('Contact CSV file upload error')); } else { $csvArray = array_map('str_getcsv', file($_FILES['importcontact-filename']['tmp_name'])); $this->logger->notice('Import started', ['lines' => count($csvArray)]); // import contacts foreach ($csvArray as $csvRow) { // The 1st row may, or may not contain the headers of the table // We expect the 1st field of the row to contain either the URL // or the handle of the account, therefore we check for either // "http" or "@" to be present in the string. // All other fields from the row will be ignored if ((strpos($csvRow[0], '@') !== false) || Network::isValidHttpUrl($csvRow[0])) { Worker::add(Worker::PRIORITY_MEDIUM, 'AddContact', $this->session->getLocalUserId(), trim($csvRow[0], '@')); } else { $this->logger->notice('Invalid account', ['url' => $csvRow[0]]); } } $this->logger->notice('Import done'); $this->systemMessages->addInfo($this->l10n->t('Importing Contacts done')); // delete temp file unlink($_FILES['importcontact-filename']['tmp_name']); } } else { $this->logger->notice('Import triggered, but no import file was found.'); } } $this->baseUrl->redirect($this->args->getQueryString()); } protected function content(array $request = []): string { if (!$this->session->getLocalUserId()) { throw new HTTPException\ForbiddenException($this->l10n->t('Permission denied.')); } parent::content(); $legacy_contact = $this->pconfig->get($this->session->getLocalUserId(), 'ostatus', 'legacy_contact'); if (!empty($legacy_contact)) { $this->baseUrl->redirect('ostatus/subscribe?url=' . urlencode($legacy_contact)); } $tpl = Renderer::getMarkupTemplate('settings/contactimport.tpl'); return Renderer::replaceMacros($tpl, [ '$title' => $this->l10n->t('Import Contacts'), '$submit' => $this->l10n->t('Save Settings'), '$form_security_token' => self::getFormSecurityToken('contactimport'), '$importcontact_text' => $this->l10n->t('Upload a CSV file that contains the handle of your followed accounts in the first column you exported from the old account.'), '$importcontact_button' => $this->l10n->t('Upload File'), '$importcontact_maxsize' => $this->config->get('system', 'max_csv_file_size', 30720), '$legacy_contact' => ['legacy_contact', $this->t('Your legacy ActivityPub/GNU Social account'), $legacy_contact, $this->t('If you enter your old account name from an ActivityPub based system or your GNU Social/Statusnet account name here (in the format user@domain.tld), your contacts will be added automatically. The field will be emptied when done.')], ]); } }