summaryrefslogtreecommitdiff
path: root/actions
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-12-22 15:25:38 -0800
committerBrion Vibber <brion@pobox.com>2010-12-22 15:25:38 -0800
commit26baad63f2e7d5cd0f783aacdb9eb2a65a638656 (patch)
tree35c39658aeb23ced8104177adadbc63560cda62e /actions
parent1513b8eeb921538e4e342c2c6d64b2c0d1aed2dd (diff)
parente0606d3eca761bda5fb804f6522028280d3396e8 (diff)
Merge branch '0.9.x' into 1.0.x
Diffstat (limited to 'actions')
-rw-r--r--actions/backupaccount.php260
-rw-r--r--actions/deleteaccount.php319
-rw-r--r--actions/profilesettings.php29
-rw-r--r--actions/restoreaccount.php376
4 files changed, 984 insertions, 0 deletions
diff --git a/actions/backupaccount.php b/actions/backupaccount.php
new file mode 100644
index 000000000..4f6fb936b
--- /dev/null
+++ b/actions/backupaccount.php
@@ -0,0 +1,260 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Download a backup of your own account to the browser
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ // This check helps protect against security problems;
+ // your code file can't be executed directly from the web.
+ exit(1);
+}
+
+/**
+ * Download a backup of your own account to the browser
+ *
+ * We go through some hoops to make this only respond to POST, since
+ * it's kind of expensive and there's probably some downside to having
+ * your account in all kinds of search engines.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class BackupaccountAction extends Action
+{
+ /**
+ * Returns the title of the page
+ *
+ * @return string page title
+ */
+
+ function title()
+ {
+ return _("Backup account");
+ }
+
+ /**
+ * For initializing members of the class.
+ *
+ * @param array $argarray misc. arguments
+ *
+ * @return boolean true
+ */
+
+ function prepare($argarray)
+ {
+ parent::prepare($argarray);
+
+ $cur = common_current_user();
+
+ if (empty($cur)) {
+ throw new ClientException(_('Only logged-in users can backup their account.'), 403);
+ }
+
+ if (!$cur->hasRight(Right::BACKUPACCOUNT)) {
+ throw new ClientException(_('You may not backup your account.'), 403);
+ }
+
+ return true;
+ }
+
+ /**
+ * Handler method
+ *
+ * @param array $argarray is ignored since it's now passed in in prepare()
+ *
+ * @return void
+ */
+
+ function handle($argarray=null)
+ {
+ parent::handle($argarray);
+
+ if ($this->isPost()) {
+ $this->sendFeed();
+ } else {
+ $this->showPage();
+ }
+ return;
+ }
+
+ /**
+ * Send a feed of the user's activities to the browser
+ *
+ * Uses the UserActivityStream class; may take a long time!
+ *
+ * @return void
+ */
+
+ function sendFeed()
+ {
+ $cur = common_current_user();
+
+ $stream = new UserActivityStream($cur);
+
+ header('Content-Disposition: attachment; filename='.$cur->nickname.'.atom');
+ header('Content-Type: application/atom+xml; charset=utf-8');
+
+ $this->raw($stream->getString());
+ }
+
+ /**
+ * Show a little form so that the person can request a backup.
+ *
+ * @return void
+ */
+
+ function showContent()
+ {
+ $form = new BackupAccountForm($this);
+ $form->show();
+ }
+
+ /**
+ * Return true if read only.
+ *
+ * MAY override
+ *
+ * @param array $args other arguments
+ *
+ * @return boolean is read only action?
+ */
+
+ function isReadOnly($args)
+ {
+ return false;
+ }
+
+ /**
+ * Return last modified, if applicable.
+ *
+ * MAY override
+ *
+ * @return string last modified http header
+ */
+
+ function lastModified()
+ {
+ // For comparison with If-Last-Modified
+ // If not applicable, return null
+ return null;
+ }
+
+ /**
+ * Return etag, if applicable.
+ *
+ * MAY override
+ *
+ * @return string etag http header
+ */
+
+ function etag()
+ {
+ return null;
+ }
+}
+
+/**
+ * A form for backing up the account.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class BackupAccountForm extends Form
+{
+ /**
+ * Class of the form.
+ *
+ * @return string the form's class
+ */
+
+ function formClass()
+ {
+ return 'form_profile_backup';
+ }
+
+ /**
+ * URL the form posts to
+ *
+ * @return string the form's action URL
+ */
+
+ function action()
+ {
+ return common_local_url('backupaccount');
+ }
+
+ /**
+ * Output form data
+ *
+ * Really, just instructions for doing a backup.
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $msg =
+ _('You can backup your account data in '.
+ '<a href="http://activitystrea.ms/">Activity Streams</a> '.
+ 'format. This is an experimental feature and provides an '.
+ 'incomplete backup; private account '.
+ 'information like email and IM addresses is not backed up. '.
+ 'Additionally, uploaded files and direct messages are not '.
+ 'backed up.');
+ $this->out->elementStart('p');
+ $this->out->raw($msg);
+ $this->out->elementEnd('p');
+ }
+
+ /**
+ * Buttons for the form
+ *
+ * In this case, a single submit button
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit',
+ _m('BUTTON', 'Backup'),
+ 'submit',
+ null,
+ _('Backup your account'));
+ }
+}
diff --git a/actions/deleteaccount.php b/actions/deleteaccount.php
new file mode 100644
index 000000000..9abe2fcdb
--- /dev/null
+++ b/actions/deleteaccount.php
@@ -0,0 +1,319 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Delete your own account
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ // This check helps protect against security problems;
+ // your code file can't be executed directly from the web.
+ exit(1);
+}
+
+/**
+ * Action to delete your own account
+ *
+ * Note that this is distinct from DeleteuserAction, which see. I thought
+ * that making that action do both things (delete another user and delete the
+ * current user) would open a lot of holes. I'm open to refactoring, however.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class DeleteaccountAction extends Action
+{
+ private $_complete = false;
+ private $_error = null;
+
+ /**
+ * For initializing members of the class.
+ *
+ * @param array $argarray misc. arguments
+ *
+ * @return boolean true
+ */
+
+ function prepare($argarray)
+ {
+ parent::prepare($argarray);
+
+ $cur = common_current_user();
+
+ if (empty($cur)) {
+ throw new ClientException(_("Only logged-in users ".
+ "can delete their account."), 403);
+ }
+
+ if (!$cur->hasRight(Right::DELETEACCOUNT)) {
+ throw new ClientException(_("You cannot delete your account."), 403);
+ }
+
+ return true;
+ }
+
+ /**
+ * Handler method
+ *
+ * @param array $argarray is ignored since it's now passed in in prepare()
+ *
+ * @return void
+ */
+
+ function handle($argarray=null)
+ {
+ parent::handle($argarray);
+
+ if ($this->isPost()) {
+ $this->deleteAccount();
+ } else {
+ $this->showPage();
+ }
+ return;
+ }
+
+ /**
+ * Return true if read only.
+ *
+ * MAY override
+ *
+ * @param array $args other arguments
+ *
+ * @return boolean is read only action?
+ */
+
+ function isReadOnly($args)
+ {
+ return false;
+ }
+
+ /**
+ * Return last modified, if applicable.
+ *
+ * MAY override
+ *
+ * @return string last modified http header
+ */
+
+ function lastModified()
+ {
+ // For comparison with If-Last-Modified
+ // If not applicable, return null
+ return null;
+ }
+
+ /**
+ * Return etag, if applicable.
+ *
+ * MAY override
+ *
+ * @return string etag http header
+ */
+
+ function etag()
+ {
+ return null;
+ }
+
+ /**
+ * Delete the current user's account
+ *
+ * Checks for the "I am sure." string to make sure the user really
+ * wants to delete their account.
+ *
+ * Then, marks the account as deleted and begins the deletion process
+ * (actually done by a back-end handler).
+ *
+ * If successful it logs the user out, and shows a brief completion message.
+ *
+ * @return void
+ */
+
+ function deleteAccount()
+ {
+ $this->checkSessionToken();
+
+ if ($this->trimmed('iamsure') != _('I am sure.')) {
+ $this->_error = _('You must write "I am sure." exactly in the box.');
+ $this->showPage();
+ return;
+ }
+
+ $cur = common_current_user();
+
+ // Mark the account as deleted and shove low-level deletion tasks
+ // to background queues. Removing a lot of posts can take a while...
+
+ if (!$cur->hasRole(Profile_role::DELETED)) {
+ $cur->grantRole(Profile_role::DELETED);
+ }
+
+ $qm = QueueManager::get();
+ $qm->enqueue($cur, 'deluser');
+
+ // The user is really-truly logged out
+
+ common_set_user(null);
+ common_real_login(false); // not logged in
+ common_forgetme(); // don't log back in!
+
+ $this->_complete = true;
+ $this->showPage();
+ }
+
+ /**
+ * Shows the page content.
+ *
+ * If the deletion is complete, just shows a completion message.
+ *
+ * Otherwise, shows the deletion form.
+ *
+ * @return void
+ *
+ */
+
+ function showContent()
+ {
+ if ($this->_complete) {
+ $this->element('p', 'confirmation',
+ _('Account deleted.'));
+ return;
+ }
+
+ if (!empty($this->_error)) {
+ $this->element('p', 'error', $this->_error);
+ $this->_error = null;
+ }
+
+ $form = new DeleteAccountForm($this);
+ $form->show();
+ }
+
+ /**
+ * Show the title of the page
+ *
+ * @return string title
+ */
+
+ function title()
+ {
+ return _('Delete account');
+ }
+}
+
+/**
+ * Form for deleting your account
+ *
+ * Note that this mostly is here to keep you from accidentally deleting your
+ * account.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class DeleteAccountForm extends Form
+{
+ /**
+ * Class of the form.
+ *
+ * @return string the form's class
+ */
+
+ function formClass()
+ {
+ return 'form_profile_delete';
+ }
+
+ /**
+ * URL the form posts to
+ *
+ * @return string the form's action URL
+ */
+
+ function action()
+ {
+ return common_local_url('deleteaccount');
+ }
+
+ /**
+ * Output form data
+ *
+ * Instructions plus an 'i am sure' entry box.
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $cur = common_current_user();
+
+ $msg = _('<p>This will <strong>permanently delete</strong> '.
+ 'your account data from this server. </p>');
+
+ if ($cur->hasRight(Right::BACKUPACCOUNT)) {
+ $msg .= sprintf(_('<p>You are strongly advised to '.
+ '<a href="%s">back up your data</a>'.
+ ' before deletion.</p>'),
+ common_local_url('backupaccount'));
+ }
+
+ $this->out->elementStart('p');
+ $this->out->raw($msg);
+ $this->out->elementEnd('p');
+
+ $this->out->input('iamsure',
+ _('Confirm'),
+ null,
+ _('Enter "I am sure." to confirm that '.
+ 'you want to delete your account.'));
+ }
+
+ /**
+ * Buttons for the form
+ *
+ * In this case, a single submit button
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit',
+ _m('BUTTON', 'Delete'),
+ 'submit',
+ null,
+ _('Permanently your account'));
+ }
+}
diff --git a/actions/profilesettings.php b/actions/profilesettings.php
index 28b1d20f3..8f55a4718 100644
--- a/actions/profilesettings.php
+++ b/actions/profilesettings.php
@@ -452,4 +452,33 @@ class ProfilesettingsAction extends AccountSettingsAction
return $other->id != $user->id;
}
}
+
+ function showAside() {
+ $user = common_current_user();
+
+ $this->elementStart('div', array('id' => 'aside_primary',
+ 'class' => 'aside'));
+ if ($user->hasRight(Right::BACKUPACCOUNT)) {
+ $this->elementStart('li');
+ $this->element('a',
+ array('href' => common_local_url('backupaccount')),
+ _('Backup account'));
+ $this->elementEnd('li');
+ }
+ if ($user->hasRight(Right::DELETEACCOUNT)) {
+ $this->elementStart('li');
+ $this->element('a',
+ array('href' => common_local_url('deleteaccount')),
+ _('Delete account'));
+ $this->elementEnd('li');
+ }
+ if ($user->hasRight(Right::RESTOREACCOUNT)) {
+ $this->elementStart('li');
+ $this->element('a',
+ array('href' => common_local_url('restoreaccount')),
+ _('Restore account'));
+ $this->elementEnd('li');
+ }
+ $this->elementEnd('div');
+ }
}
diff --git a/actions/restoreaccount.php b/actions/restoreaccount.php
new file mode 100644
index 000000000..8cf220a42
--- /dev/null
+++ b/actions/restoreaccount.php
@@ -0,0 +1,376 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Restore a backup of your own account from the browser
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ // This check helps protect against security problems;
+ // your code file can't be executed directly from the web.
+ exit(1);
+}
+
+/**
+ * Restore a backup of your own account from the browser
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class RestoreaccountAction extends Action
+{
+ private $success = false;
+ private $inprogress = false;
+
+ /**
+ * Returns the title of the page
+ *
+ * @return string page title
+ */
+
+ function title()
+ {
+ return _("Restore account");
+ }
+
+ /**
+ * For initializing members of the class.
+ *
+ * @param array $argarray misc. arguments
+ *
+ * @return boolean true
+ */
+
+ function prepare($argarray)
+ {
+ parent::prepare($argarray);
+
+ $cur = common_current_user();
+
+ if (empty($cur)) {
+ throw new ClientException(_('Only logged-in users can restore their account.'), 403);
+ }
+
+ if (!$cur->hasRight(Right::RESTOREACCOUNT)) {
+ throw new ClientException(_('You may not restore your account.'), 403);
+ }
+
+ return true;
+ }
+
+ /**
+ * Handler method
+ *
+ * @param array $argarray is ignored since it's now passed in in prepare()
+ *
+ * @return void
+ */
+
+ function handle($argarray=null)
+ {
+ parent::handle($argarray);
+
+ if ($this->isPost()) {
+ $this->restoreAccount();
+ } else {
+ $this->showPage();
+ }
+ return;
+ }
+
+ /**
+ * Queue a file for restoration
+ *
+ * Uses the UserActivityStream class; may take a long time!
+ *
+ * @return void
+ */
+
+ function restoreAccount()
+ {
+ $this->checkSessionToken();
+
+ if (!isset($_FILES['restorefile']['error'])) {
+ throw new ClientException(_('No uploaded file.'));
+ }
+
+ switch ($_FILES['restorefile']['error']) {
+ case UPLOAD_ERR_OK: // success, jump out
+ break;
+ case UPLOAD_ERR_INI_SIZE:
+ // TRANS: Client exception thrown when an uploaded file is larger than set in php.ini.
+ throw new ClientException(_('The uploaded file exceeds the ' .
+ 'upload_max_filesize directive in php.ini.'));
+ return;
+ case UPLOAD_ERR_FORM_SIZE:
+ throw new ClientException(
+ // TRANS: Client exception.
+ _('The uploaded file exceeds the MAX_FILE_SIZE directive' .
+ ' that was specified in the HTML form.'));
+ return;
+ case UPLOAD_ERR_PARTIAL:
+ @unlink($_FILES['restorefile']['tmp_name']);
+ // TRANS: Client exception.
+ throw new ClientException(_('The uploaded file was only' .
+ ' partially uploaded.'));
+ return;
+ case UPLOAD_ERR_NO_FILE:
+ // No file; probably just a non-AJAX submission.
+ throw new ClientException(_('No uploaded file.'));
+ return;
+ case UPLOAD_ERR_NO_TMP_DIR:
+ // TRANS: Client exception thrown when a temporary folder is not present to store a file upload.
+ throw new ClientException(_('Missing a temporary folder.'));
+ return;
+ case UPLOAD_ERR_CANT_WRITE:
+ // TRANS: Client exception thrown when writing to disk is not possible during a file upload operation.
+ throw new ClientException(_('Failed to write file to disk.'));
+ return;
+ case UPLOAD_ERR_EXTENSION:
+ // TRANS: Client exception thrown when a file upload operation has been stopped by an extension.
+ throw new ClientException(_('File upload stopped by extension.'));
+ return;
+ default:
+ common_log(LOG_ERR, __METHOD__ . ": Unknown upload error " .
+ $_FILES['restorefile']['error']);
+ // TRANS: Client exception thrown when a file upload operation has failed with an unknown reason.
+ throw new ClientException(_('System error uploading file.'));
+ return;
+ }
+
+ $filename = $_FILES['restorefile']['tmp_name'];
+
+ try {
+ if (!file_exists($filename)) {
+ throw new ServerException("No such file '$filename'.");
+ }
+
+ if (!is_file($filename)) {
+ throw new ServerException("Not a regular file: '$filename'.");
+ }
+
+ if (!is_readable($filename)) {
+ throw new ServerException("File '$filename' not readable.");
+ }
+
+ common_debug(sprintf(_("Getting backup from file '%s'."), $filename));
+
+ $xml = file_get_contents($filename);
+
+ // This check is costly but we should probably give
+ // the user some info ahead of time.
+ $doc = new DOMDocument();
+
+ // Disable PHP warnings so we don't spew low-level XML errors to output...
+ // would be nice if we can just get exceptions instead.
+ $old_err = error_reporting();
+ error_reporting($old_err & ~E_WARNING);
+ $doc->loadXML($xml);
+ error_reporting($old_err);
+
+ $feed = $doc->documentElement;
+
+ if (!$feed ||
+ $feed->namespaceURI != Activity::ATOM ||
+ $feed->localName != 'feed') {
+ throw new ClientException(_("Not an atom feed."));
+ }
+
+ // Enqueue for processing.
+
+ $qm = QueueManager::get();
+ $qm->enqueue(array(common_current_user(), $xml, false), 'feedimp');
+
+ if ($qm instanceof UnQueueManager) {
+ // No active queuing means we've actually just completed the job!
+ $this->success = true;
+ } else {
+ // We've fed data into background queues, and it's probably still running.
+ $this->inprogress = true;
+ }
+ $this->showPage();
+
+ } catch (Exception $e) {
+ // Delete the file and re-throw
+ @unlink($_FILES['restorefile']['tmp_name']);
+ throw $e;
+ }
+ }
+
+ /**
+ * Show a little form so that the person can upload a file to restore
+ *
+ * @return void
+ */
+
+ function showContent()
+ {
+ if ($this->success) {
+ $this->element('p', null,
+ _('Feed has been restored. Your old posts should now appear in search and your profile page.'));
+ } else if ($this->inprogress) {
+ $this->element('p', null,
+ _('Feed will be restored. Please wait a few minutes for results.'));
+ } else {
+ $form = new RestoreAccountForm($this);
+ $form->show();
+ }
+ }
+
+ /**
+ * Return true if read only.
+ *
+ * MAY override
+ *
+ * @param array $args other arguments
+ *
+ * @return boolean is read only action?
+ */
+
+ function isReadOnly($args)
+ {
+ return false;
+ }
+
+ /**
+ * Return last modified, if applicable.
+ *
+ * MAY override
+ *
+ * @return string last modified http header
+ */
+
+ function lastModified()
+ {
+ // For comparison with If-Last-Modified
+ // If not applicable, return null
+ return null;
+ }
+
+ /**
+ * Return etag, if applicable.
+ *
+ * MAY override
+ *
+ * @return string etag http header
+ */
+
+ function etag()
+ {
+ return null;
+ }
+}
+
+/**
+ * A form for backing up the account.
+ *
+ * @category Account
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class RestoreAccountForm extends Form
+{
+ function __construct($out=null) {
+ parent::__construct($out);
+ $this->enctype = 'multipart/form-data';
+ }
+
+ /**
+ * Class of the form.
+ *
+ * @return string the form's class
+ */
+
+ function formClass()
+ {
+ return 'form_profile_restore';
+ }
+
+ /**
+ * URL the form posts to
+ *
+ * @return string the form's action URL
+ */
+
+ function action()
+ {
+ return common_local_url('restoreaccount');
+ }
+
+ /**
+ * Output form data
+ *
+ * Really, just instructions for doing a backup.
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $this->out->elementStart('p', 'instructions');
+
+ $this->out->raw(_('You can upload a backed-up stream in '.
+ '<a href="http://activitystrea.ms/">Activity Streams</a> format.'));
+
+ $this->out->elementEnd('p');
+
+ $this->out->elementStart('ul', 'form_data');
+
+ $this->out->elementStart('li', array ('id' => 'settings_attach'));
+ $this->out->element('input', array('name' => 'restorefile',
+ 'type' => 'file',
+ 'id' => 'restorefile'));
+ $this->out->elementEnd('li');
+
+ $this->out->elementEnd('ul');
+ }
+
+ /**
+ * Buttons for the form
+ *
+ * In this case, a single submit button
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit',
+ _m('BUTTON', 'Upload'),
+ 'submit',
+ null,
+ _('Upload the file'));
+ }
+}