1
1
Fork 0

The legacy OAuth server is removed

This commit is contained in:
Michael 2021-07-20 17:41:04 +00:00
commit 6668066099
16 changed files with 347 additions and 1314 deletions

View file

@ -231,21 +231,6 @@ CREATE TABLE IF NOT EXISTS `tag` (
INDEX `url` (`url`) INDEX `url` (`url`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='tags and mentions'; ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='tags and mentions';
--
-- TABLE clients
--
CREATE TABLE IF NOT EXISTS `clients` (
`client_id` varchar(20) NOT NULL COMMENT '',
`pw` varchar(20) NOT NULL DEFAULT '' COMMENT '',
`redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
`name` text COMMENT '',
`icon` text COMMENT '',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
PRIMARY KEY(`client_id`),
INDEX `uid` (`uid`),
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
-- --
-- TABLE permissionset -- TABLE permissionset
-- --
@ -434,20 +419,6 @@ CREATE TABLE IF NOT EXISTS `attach` (
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='file attachments'; ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='file attachments';
--
-- TABLE auth_codes
--
CREATE TABLE IF NOT EXISTS `auth_codes` (
`id` varchar(40) NOT NULL COMMENT '',
`client_id` varchar(20) NOT NULL DEFAULT '' COMMENT '',
`redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
`expires` int NOT NULL DEFAULT 0 COMMENT '',
`scope` varchar(250) NOT NULL DEFAULT '' COMMENT '',
PRIMARY KEY(`id`),
INDEX `client_id` (`client_id`),
FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
-- --
-- TABLE cache -- TABLE cache
-- --
@ -1486,23 +1457,6 @@ CREATE TABLE IF NOT EXISTS `storage` (
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Data stored by Database storage backend'; ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Data stored by Database storage backend';
--
-- TABLE tokens
--
CREATE TABLE IF NOT EXISTS `tokens` (
`id` varchar(40) NOT NULL COMMENT '',
`secret` text COMMENT '',
`client_id` varchar(20) NOT NULL DEFAULT '',
`expires` int NOT NULL DEFAULT 0 COMMENT '',
`scope` varchar(200) NOT NULL DEFAULT '' COMMENT '',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
PRIMARY KEY(`id`),
INDEX `client_id` (`client_id`),
INDEX `uid` (`uid`),
FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
-- --
-- TABLE userd -- TABLE userd
-- --

View file

@ -13,9 +13,7 @@ Database Tables
| [application](help/database/db_application) | OAuth application | | [application](help/database/db_application) | OAuth application |
| [application-token](help/database/db_application-token) | OAuth user token | | [application-token](help/database/db_application-token) | OAuth user token |
| [attach](help/database/db_attach) | file attachments | | [attach](help/database/db_attach) | file attachments |
| [auth_codes](help/database/db_auth_codes) | OAuth usage |
| [cache](help/database/db_cache) | Stores temporary data | | [cache](help/database/db_cache) | Stores temporary data |
| [clients](help/database/db_clients) | OAuth usage |
| [config](help/database/db_config) | main configuration storage | | [config](help/database/db_config) | main configuration storage |
| [contact](help/database/db_contact) | contact table | | [contact](help/database/db_contact) | contact table |
| [contact-relation](help/database/db_contact-relation) | Contact relations | | [contact-relation](help/database/db_contact-relation) | Contact relations |
@ -69,7 +67,6 @@ Database Tables
| [session](help/database/db_session) | web session storage | | [session](help/database/db_session) | web session storage |
| [storage](help/database/db_storage) | Data stored by Database storage backend | | [storage](help/database/db_storage) | Data stored by Database storage backend |
| [tag](help/database/db_tag) | tags and mentions | | [tag](help/database/db_tag) | tags and mentions |
| [tokens](help/database/db_tokens) | OAuth usage |
| [user](help/database/db_user) | The local users | | [user](help/database/db_user) | The local users |
| [user-contact](help/database/db_user-contact) | User specific public contact data | | [user-contact](help/database/db_user-contact) | User specific public contact data |
| [userd](help/database/db_userd) | Deleted usernames | | [userd](help/database/db_userd) | Deleted usernames |

View file

@ -1,32 +0,0 @@
Table auth_codes
===========
OAuth usage
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| ------------ | ----------- | ------------ | ---- | --- | ------- | ----- |
| id | | varchar(40) | NO | PRI | NULL | |
| client_id | | varchar(20) | NO | | | |
| redirect_uri | | varchar(200) | NO | | | |
| expires | | int | NO | | 0 | |
| scope | | varchar(250) | NO | | | |
Indexes
------------
| Name | Fields |
| --------- | --------- |
| PRIMARY | id |
| client_id | client_id |
Foreign Keys
------------
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| client_id | [clients](help/database/db_clients) | client_id |
Return to [database documentation](help/database)

View file

@ -1,33 +0,0 @@
Table clients
===========
OAuth usage
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| ------------ | ----------- | ------------------ | ---- | --- | ------- | ----- |
| client_id | | varchar(20) | NO | PRI | NULL | |
| pw | | varchar(20) | NO | | | |
| redirect_uri | | varchar(200) | NO | | | |
| name | | text | YES | | NULL | |
| icon | | text | YES | | NULL | |
| uid | User id | mediumint unsigned | NO | | 0 | |
Indexes
------------
| Name | Fields |
| ------- | --------- |
| PRIMARY | client_id |
| uid | uid |
Foreign Keys
------------
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| uid | [user](help/database/db_user) | uid |
Return to [database documentation](help/database)

View file

@ -1,35 +0,0 @@
Table tokens
===========
OAuth usage
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| --------- | ----------- | ------------------ | ---- | --- | ------- | ----- |
| id | | varchar(40) | NO | PRI | NULL | |
| secret | | text | YES | | NULL | |
| client_id | | varchar(20) | NO | | | |
| expires | | int | NO | | 0 | |
| scope | | varchar(200) | NO | | | |
| uid | User id | mediumint unsigned | NO | | 0 | |
Indexes
------------
| Name | Fields |
| --------- | --------- |
| PRIMARY | id |
| client_id | client_id |
| uid | uid |
Foreign Keys
------------
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| client_id | [clients](help/database/db_clients) | client_id |
| uid | [user](help/database/db_user) | uid |
Return to [database documentation](help/database)

View file

@ -57,10 +57,7 @@ use Friendica\Network\HTTPException\UnauthorizedException;
use Friendica\Object\Image; use Friendica\Object\Image;
use Friendica\Protocol\Activity; use Friendica\Protocol\Activity;
use Friendica\Protocol\Diaspora; use Friendica\Protocol\Diaspora;
use Friendica\Security\FKOAuth1;
use Friendica\Security\OAuth; use Friendica\Security\OAuth;
use Friendica\Security\OAuth1\OAuthRequest;
use Friendica\Security\OAuth1\OAuthUtil;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Images; use Friendica\Util\Images;
use Friendica\Util\Network; use Friendica\Util\Network;
@ -206,24 +203,6 @@ function api_login(App $a)
} }
if (empty($_SERVER['PHP_AUTH_USER'])) { if (empty($_SERVER['PHP_AUTH_USER'])) {
// Try OAuth when no user is provided
$oauth1 = new FKOAuth1();
// login with oauth
try {
$request = OAuthRequest::from_request();
list($consumer, $token) = $oauth1->verify_request($request);
if (!is_null($token)) {
$oauth1->loginUser($token->uid);
Session::set('allow_api', true);
return;
}
echo __FILE__.__LINE__.__FUNCTION__ . "<pre>";
var_dump($consumer, $token);
die();
} catch (Exception $e) {
Logger::warning(API_LOG_PREFIX . 'OAuth error', ['module' => 'api', 'action' => 'login', 'exception' => $e->getMessage()]);
}
Logger::debug(API_LOG_PREFIX . 'failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]); Logger::debug(API_LOG_PREFIX . 'failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]);
header('WWW-Authenticate: Basic realm="Friendica"'); header('WWW-Authenticate: Basic realm="Friendica"');
throw new UnauthorizedException("This API requires login"); throw new UnauthorizedException("This API requires login");
@ -4057,48 +4036,6 @@ api_register_func('api/direct_messages/all', 'api_direct_messages_all', true);
api_register_func('api/direct_messages/sent', 'api_direct_messages_sentbox', true); api_register_func('api/direct_messages/sent', 'api_direct_messages_sentbox', true);
api_register_func('api/direct_messages', 'api_direct_messages_inbox', true); api_register_func('api/direct_messages', 'api_direct_messages_inbox', true);
/**
* Returns an OAuth Request Token.
*
* @see https://oauth.net/core/1.0/#auth_step1
*/
function api_oauth_request_token()
{
$oauth1 = new FKOAuth1();
try {
$r = $oauth1->fetch_request_token(OAuthRequest::from_request());
} catch (Exception $e) {
echo "error=" . OAuthUtil::urlencode_rfc3986($e->getMessage());
exit();
}
echo $r;
exit();
}
/**
* Returns an OAuth Access Token.
*
* @return array|string
* @see https://oauth.net/core/1.0/#auth_step3
*/
function api_oauth_access_token()
{
$oauth1 = new FKOAuth1();
try {
$r = $oauth1->fetch_access_token(OAuthRequest::from_request());
} catch (Exception $e) {
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage());
exit();
}
echo $r;
exit();
}
/// @TODO move to top of file or somewhere better
api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
/** /**
* delete a complete photoalbum with all containing photos from database through api * delete a complete photoalbum with all containing photos from database through api
* *

View file

@ -20,32 +20,10 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Renderer;
use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\Security\Login;
use Friendica\Security\OAuth1\OAuthRequest;
use Friendica\Security\OAuth1\OAuthUtil;
require_once __DIR__ . '/../include/api.php'; require_once __DIR__ . '/../include/api.php';
function oauth_get_client(OAuthRequest $request)
{
$params = $request->get_parameters();
$token = $params['oauth_token'];
$r = q("SELECT `clients`.*
FROM `clients`, `tokens`
WHERE `clients`.`client_id`=`tokens`.`client_id`
AND `tokens`.`id`='%s' AND `tokens`.`scope`='request'", DBA::escape($token));
if (!DBA::isResult($r)) {
return null;
}
return $r[0];
}
function api_post(App $a) function api_post(App $a)
{ {
if (!local_user()) { if (!local_user()) {
@ -61,76 +39,6 @@ function api_post(App $a)
function api_content(App $a) function api_content(App $a)
{ {
if (DI::args()->getCommand() == 'api/oauth/authorize') {
/*
* api/oauth/authorize interact with the user. return a standard page
*/
DI::page()['template'] = "minimal";
// get consumer/client from request token
try {
$request = OAuthRequest::from_request();
} catch (Exception $e) {
echo "<pre>";
var_dump($e);
exit();
}
if (!empty($_POST['oauth_yes'])) {
$app = oauth_get_client($request);
if (is_null($app)) {
return "Invalid request. Unknown token.";
}
$consumer = new OAuthConsumer($app['client_id'], $app['pw'], $app['redirect_uri']);
$verifier = md5($app['secret'] . local_user());
DI::config()->set("oauth", $verifier, local_user());
if ($consumer->callback_url != null) {
$params = $request->get_parameters();
$glue = "?";
if (strstr($consumer->callback_url, $glue)) {
$glue = "?";
}
DI::baseUrl()->redirect($consumer->callback_url . $glue . 'oauth_token=' . OAuthUtil::urlencode_rfc3986($params['oauth_token']) . '&oauth_verifier=' . OAuthUtil::urlencode_rfc3986($verifier));
exit();
}
$tpl = Renderer::getMarkupTemplate("oauth_authorize_done.tpl");
$o = Renderer::replaceMacros($tpl, [
'$title' => DI::l10n()->t('Authorize application connection'),
'$info' => DI::l10n()->t('Return to your app and insert this Securty Code:'),
'$code' => $verifier,
]);
return $o;
}
if (!local_user()) {
/// @TODO We need login form to redirect to this page
notice(DI::l10n()->t('Please login to continue.'));
return Login::form(DI::args()->getQueryString(), false, $request->get_parameters());
}
//FKOAuth1::loginUser(4);
$app = oauth_get_client($request);
if (is_null($app)) {
return "Invalid request. Unknown token.";
}
$tpl = Renderer::getMarkupTemplate('oauth_authorize.tpl');
$o = Renderer::replaceMacros($tpl, [
'$title' => DI::l10n()->t('Authorize application connection'),
'$app' => $app,
'$authorize' => DI::l10n()->t('Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?'),
'$yes' => DI::l10n()->t('Yes'),
'$no' => DI::l10n()->t('No'),
]);
return $o;
}
echo api_call($a); echo api_call($a);
exit(); exit();
} }

View file

@ -66,63 +66,6 @@ function settings_post(App $a)
return; return;
} }
$old_page_flags = $a->user['page-flags'];
if (($a->argc > 1) && ($a->argv[1] === 'oauth') && !empty($_POST['remove'])) {
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/oauth', 'settings_oauth');
$key = $_POST['remove'];
DBA::delete('tokens', ['id' => $key, 'uid' => local_user()]);
DI::baseUrl()->redirect('settings/oauth/', true);
return;
}
if (($a->argc > 2) && ($a->argv[1] === 'oauth') && ($a->argv[2] === 'edit'||($a->argv[2] === 'add')) && !empty($_POST['submit'])) {
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/oauth', 'settings_oauth');
$name = $_POST['name'] ?? '';
$key = $_POST['key'] ?? '';
$secret = $_POST['secret'] ?? '';
$redirect = $_POST['redirect'] ?? '';
$icon = $_POST['icon'] ?? '';
if ($name == "" || $key == "" || $secret == "") {
notice(DI::l10n()->t("Missing some important data!"));
} else {
if ($_POST['submit'] == DI::l10n()->t("Update")) {
q("UPDATE clients SET
client_id='%s',
pw='%s',
name='%s',
redirect_uri='%s',
icon='%s',
uid=%d
WHERE client_id='%s'",
DBA::escape($key),
DBA::escape($secret),
DBA::escape($name),
DBA::escape($redirect),
DBA::escape($icon),
local_user(),
DBA::escape($key)
);
} else {
q("INSERT INTO clients
(client_id, pw, name, redirect_uri, icon, uid)
VALUES ('%s', '%s', '%s', '%s', '%s',%d)",
DBA::escape($key),
DBA::escape($secret),
DBA::escape($name),
DBA::escape($redirect),
DBA::escape($icon),
local_user()
);
}
}
DI::baseUrl()->redirect('settings/oauth/', true);
return;
}
if (($a->argc > 1) && ($a->argv[1] == 'addon')) { if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
BaseModule::checkFormSecurityTokenRedirectOnError('/settings/addon', 'settings_addon'); BaseModule::checkFormSecurityTokenRedirectOnError('/settings/addon', 'settings_addon');

View file

@ -81,7 +81,8 @@ class DBStructure
$old_tables = ['fserver', 'gcign', 'gcontact', 'gcontact-relation', 'gfollower' ,'glink', 'item-delivery-data', $old_tables = ['fserver', 'gcign', 'gcontact', 'gcontact-relation', 'gfollower' ,'glink', 'item-delivery-data',
'item-activity', 'item-content', 'item_id', 'participation', 'poll', 'poll_result', 'queue', 'retriever_rule', 'item-activity', 'item-content', 'item_id', 'participation', 'poll', 'poll_result', 'queue', 'retriever_rule',
'deliverq', 'dsprphotoq', 'ffinder', 'sign', 'spam', 'term', 'user-item', 'thread', 'item', 'challenge']; 'deliverq', 'dsprphotoq', 'ffinder', 'sign', 'spam', 'term', 'user-item', 'thread', 'item', 'challenge',
'auth_codes', 'clients', 'tokens'];
$tables = DBA::selectToArray(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_NAME'], $tables = DBA::selectToArray(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_NAME'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_TYPE' => 'BASE TABLE']); ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_TYPE' => 'BASE TABLE']);
@ -1369,7 +1370,7 @@ class DBStructure
echo "permissionset: Table not found\n"; echo "permissionset: Table not found\n";
} }
if (!self::existsForeignKeyForField('tokens', 'client_id')) { if (self::existsTable('tokens') && self::existsTable('clients') && !self::existsForeignKeyForField('tokens', 'client_id')) {
$tokens = DBA::p("SELECT `tokens`.`id` FROM `tokens` $tokens = DBA::p("SELECT `tokens`.`id` FROM `tokens`
LEFT JOIN `clients` ON `clients`.`client_id` = `tokens`.`client_id` LEFT JOIN `clients` ON `clients`.`client_id` = `tokens`.`client_id`
WHERE `clients`.`client_id` IS NULL"); WHERE `clients`.`client_id` IS NULL");

View file

@ -1,66 +0,0 @@
<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* 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 <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Security;
use Friendica\Core\Logger;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Security\OAuth1\OAuthServer;
use Friendica\Security\OAuth1\Signature\OAuthSignatureMethod_HMAC_SHA1;
use Friendica\Security\OAuth1\Signature\OAuthSignatureMethod_PLAINTEXT;
/**
* OAuth protocol
*/
class FKOAuth1 extends OAuthServer
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(new FKOAuthDataStore());
$this->add_signature_method(new OAuthSignatureMethod_PLAINTEXT());
$this->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());
}
/**
* @param string $uid user id
* @return void
* @throws HTTPException\ForbiddenException
* @throws HTTPException\InternalServerErrorException
*/
public function loginUser($uid)
{
Logger::notice("FKOAuth1::loginUser $uid");
$a = DI::app();
$record = DBA::selectFirst('user', [], ['uid' => $uid, 'blocked' => 0, 'account_expired' => 0, 'account_removed' => 0, 'verified' => 1]);
if (!DBA::isResult($record) || empty($uid)) {
Logger::info('FKOAuth1::loginUser failure', ['server' => $_SERVER]);
header('HTTP/1.0 401 Unauthorized');
die('This api requires login');
}
DI::auth()->setForUser($a, $record, true);
}
}

View file

@ -1,197 +0,0 @@
<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* 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 <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Security;
use Friendica\Core\Logger;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Util\Strings;
use Friendica\Security\OAuth1\OAuthConsumer;
use Friendica\Security\OAuth1\OAuthDataStore;
use Friendica\Security\OAuth1\OAuthToken;
define('REQUEST_TOKEN_DURATION', 300);
define('ACCESS_TOKEN_DURATION', 31536000);
/**
* Friendica\Security\OAuth1\OAuthDataStore class
*/
class FKOAuthDataStore extends OAuthDataStore
{
/**
* @return string
* @throws \Exception
*/
private static function genToken()
{
return Strings::getRandomHex(32);
}
/**
* @param string $consumer_key key
* @return OAuthConsumer|null
* @throws \Exception
*/
public function lookup_consumer($consumer_key)
{
Logger::log(__function__ . ":" . $consumer_key);
$s = DBA::select('clients', ['client_id', 'pw', 'redirect_uri'], ['client_id' => $consumer_key]);
$r = DBA::toArray($s);
if (DBA::isResult($r)) {
return new OAuthConsumer($r[0]['client_id'], $r[0]['pw'], $r[0]['redirect_uri']);
}
return null;
}
/**
* @param OAuthConsumer $consumer
* @param string $token_type
* @param string $token_id
* @return OAuthToken|null
* @throws \Exception
*/
public function lookup_token(OAuthConsumer $consumer, $token_type, $token_id)
{
Logger::log(__function__ . ":" . $consumer . ", " . $token_type . ", " . $token_id);
$s = DBA::select('tokens', ['id', 'secret', 'scope', 'expires', 'uid'], ['client_id' => $consumer->key, 'scope' => $token_type, 'id' => $token_id]);
$r = DBA::toArray($s);
if (DBA::isResult($r)) {
$ot = new OAuthToken($r[0]['id'], $r[0]['secret']);
$ot->scope = $r[0]['scope'];
$ot->expires = $r[0]['expires'];
$ot->uid = $r[0]['uid'];
return $ot;
}
return null;
}
/**
* @param OAuthConsumer $consumer
* @param OAuthToken $token
* @param string $nonce
* @param int $timestamp
* @return mixed
* @throws \Exception
*/
public function lookup_nonce(OAuthConsumer $consumer, OAuthToken $token, $nonce, int $timestamp)
{
$token = DBA::selectFirst('tokens', ['id', 'secret'], ['client_id' => $consumer->key, 'id' => $nonce, 'expires' => $timestamp]);
if (DBA::isResult($token)) {
return new OAuthToken($token['id'], $token['secret']);
}
return null;
}
/**
* @param OAuthConsumer $consumer
* @param string $callback
* @return OAuthToken|null
* @throws \Exception
*/
public function new_request_token(OAuthConsumer $consumer, $callback = null)
{
Logger::log(__function__ . ":" . $consumer . ", " . $callback);
$key = self::genToken();
$sec = self::genToken();
if ($consumer->key) {
$k = $consumer->key;
} else {
$k = $consumer;
}
$r = DBA::insert(
'tokens',
[
'id' => $key,
'secret' => $sec,
'client_id' => $k,
'scope' => 'request',
'expires' => time() + REQUEST_TOKEN_DURATION
]
);
if (!$r) {
return null;
}
return new OAuthToken($key, $sec);
}
/**
* @param OAuthToken $token token
* @param OAuthConsumer $consumer consumer
* @param string $verifier optional, defult null
* @return OAuthToken
* @throws \Exception
*/
public function new_access_token(OAuthToken $token, OAuthConsumer $consumer, $verifier = null)
{
Logger::log(__function__ . ":" . $token . ", " . $consumer . ", " . $verifier);
// return a new access token attached to this consumer
// for the user associated with this token if the request token
// is authorized
// should also invalidate the request token
$ret = null;
// get user for this verifier
$uverifier = DI::config()->get("oauth", $verifier);
Logger::log(__function__ . ":" . $verifier . "," . $uverifier);
if (is_null($verifier) || ($uverifier !== false)) {
$key = self::genToken();
$sec = self::genToken();
$r = DBA::insert(
'tokens',
[
'id' => $key,
'secret' => $sec,
'client_id' => $consumer->key,
'scope' => 'access',
'expires' => time() + ACCESS_TOKEN_DURATION,
'uid' => $uverifier
]
);
if ($r) {
$ret = new OAuthToken($key, $sec);
}
}
DBA::delete('tokens', ['id' => $token->key]);
if (!is_null($ret) && !is_null($uverifier)) {
DI::config()->delete("oauth", $verifier);
}
return $ret;
}
}

View file

@ -1,290 +0,0 @@
<?php
namespace Friendica\Security\OAuth1;
use Friendica\Security\FKOAuthDataStore;
use Friendica\Security\OAuth1\Signature;
class OAuthServer
{
protected $timestamp_threshold = 300; // in seconds, five minutes
protected $version = '1.0'; // hi blaine
/** @var Signature\OAuthSignatureMethod[] */
protected $signature_methods = [];
/** @var FKOAuthDataStore */
protected $data_store;
function __construct(FKOAuthDataStore $data_store)
{
$this->data_store = $data_store;
}
public function add_signature_method(Signature\OAuthSignatureMethod $signature_method)
{
$this->signature_methods[$signature_method->get_name()] =
$signature_method;
}
// high level functions
/**
* process a request_token request
* returns the request token on success
*
* @param OAuthRequest $request
*
* @return OAuthToken|null
* @throws OAuthException
*/
public function fetch_request_token(OAuthRequest $request)
{
$this->get_version($request);
$consumer = $this->get_consumer($request);
// no token required for the initial token request
$token = null;
$this->check_signature($request, $consumer, $token);
// Rev A change
$callback = $request->get_parameter('oauth_callback');
$new_token = $this->data_store->new_request_token($consumer, $callback);
return $new_token;
}
/**
* process an access_token request
* returns the access token on success
*
* @param OAuthRequest $request
*
* @return object
* @throws OAuthException
*/
public function fetch_access_token(OAuthRequest $request)
{
$this->get_version($request);
$consumer = $this->get_consumer($request);
// requires authorized request token
$token = $this->get_token($request, $consumer, "request");
$this->check_signature($request, $consumer, $token);
// Rev A change
$verifier = $request->get_parameter('oauth_verifier');
$new_token = $this->data_store->new_access_token($token, $consumer, $verifier);
return $new_token;
}
/**
* verify an api call, checks all the parameters
*
* @param OAuthRequest $request
*
* @return array
* @throws OAuthException
*/
public function verify_request(OAuthRequest $request)
{
$this->get_version($request);
$consumer = $this->get_consumer($request);
$token = $this->get_token($request, $consumer, "access");
$this->check_signature($request, $consumer, $token);
return [$consumer, $token];
}
// Internals from here
/**
* version 1
*
* @param OAuthRequest $request
*
* @return string
* @throws OAuthException
*/
private function get_version(OAuthRequest $request)
{
$version = $request->get_parameter("oauth_version");
if (!$version) {
// Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.
// Chapter 7.0 ("Accessing Protected Ressources")
$version = '1.0';
}
if ($version !== $this->version) {
throw new OAuthException("OAuth version '$version' not supported");
}
return $version;
}
/**
* figure out the signature with some defaults
*
* @param OAuthRequest $request
*
* @return Signature\OAuthSignatureMethod
* @throws OAuthException
*/
private function get_signature_method(OAuthRequest $request)
{
$signature_method =
@$request->get_parameter("oauth_signature_method");
if (!$signature_method) {
// According to chapter 7 ("Accessing Protected Ressources") the signature-method
// parameter is required, and we can't just fallback to PLAINTEXT
throw new OAuthException('No signature method parameter. This parameter is required');
}
if (!in_array(
$signature_method,
array_keys($this->signature_methods)
)) {
throw new OAuthException(
"Signature method '$signature_method' not supported " .
"try one of the following: " .
implode(", ", array_keys($this->signature_methods))
);
}
return $this->signature_methods[$signature_method];
}
/**
* try to find the consumer for the provided request's consumer key
*
* @param OAuthRequest $request
*
* @return OAuthConsumer
* @throws OAuthException
*/
private function get_consumer(OAuthRequest $request)
{
$consumer_key = @$request->get_parameter("oauth_consumer_key");
if (!$consumer_key) {
throw new OAuthException("Invalid consumer key");
}
$consumer = $this->data_store->lookup_consumer($consumer_key);
if (!$consumer) {
throw new OAuthException("Invalid consumer");
}
return $consumer;
}
/**
* try to find the token for the provided request's token key
*
* @param OAuthRequest $request
* @param $consumer
* @param string $token_type
*
* @return OAuthToken|null
* @throws OAuthException
*/
private function get_token(OAuthRequest &$request, $consumer, $token_type = "access")
{
$token_field = @$request->get_parameter('oauth_token');
$token = $this->data_store->lookup_token(
$consumer,
$token_type,
$token_field
);
if (!$token) {
throw new OAuthException("Invalid $token_type token: $token_field");
}
return $token;
}
/**
* all-in-one function to check the signature on a request
* should guess the signature method appropriately
*
* @param OAuthRequest $request
* @param OAuthConsumer $consumer
* @param OAuthToken|null $token
*
* @throws OAuthException
*/
private function check_signature(OAuthRequest $request, OAuthConsumer $consumer, OAuthToken $token = null)
{
// this should probably be in a different method
$timestamp = @$request->get_parameter('oauth_timestamp');
$nonce = @$request->get_parameter('oauth_nonce');
$this->check_timestamp($timestamp);
$this->check_nonce($consumer, $token, $nonce, $timestamp);
$signature_method = $this->get_signature_method($request);
$signature = $request->get_parameter('oauth_signature');
$valid_sig = $signature_method->check_signature(
$request,
$consumer,
$signature,
$token
);
if (!$valid_sig) {
throw new OAuthException("Invalid signature");
}
}
/**
* check that the timestamp is new enough
*
* @param int $timestamp
*
* @throws OAuthException
*/
private function check_timestamp($timestamp)
{
if (!$timestamp)
throw new OAuthException(
'Missing timestamp parameter. The parameter is required'
);
// verify that timestamp is recentish
$now = time();
if (abs($now - $timestamp) > $this->timestamp_threshold) {
throw new OAuthException(
"Expired timestamp, yours $timestamp, ours $now"
);
}
}
/**
* check that the nonce is not repeated
*
* @param OAuthConsumer $consumer
* @param OAuthToken $token
* @param string $nonce
* @param int $timestamp
*
* @throws OAuthException
*/
private function check_nonce(OAuthConsumer $consumer, OAuthToken $token, $nonce, int $timestamp)
{
if (!$nonce)
throw new OAuthException(
'Missing nonce parameter. The parameter is required'
);
// verify that the nonce is uniqueish
$found = $this->data_store->lookup_nonce(
$consumer,
$token,
$nonce,
$timestamp
);
if ($found) {
throw new OAuthException("Nonce already used: $nonce");
}
}
}

View file

@ -40,14 +40,12 @@ class OptimizeTables
Logger::info('Optimize start'); Logger::info('Optimize start');
DBA::e("OPTIMIZE TABLE `auth_codes`");
DBA::e("OPTIMIZE TABLE `cache`"); DBA::e("OPTIMIZE TABLE `cache`");
DBA::e("OPTIMIZE TABLE `locks`"); DBA::e("OPTIMIZE TABLE `locks`");
DBA::e("OPTIMIZE TABLE `oembed`"); DBA::e("OPTIMIZE TABLE `oembed`");
DBA::e("OPTIMIZE TABLE `parsed_url`"); DBA::e("OPTIMIZE TABLE `parsed_url`");
DBA::e("OPTIMIZE TABLE `profile_check`"); DBA::e("OPTIMIZE TABLE `profile_check`");
DBA::e("OPTIMIZE TABLE `session`"); DBA::e("OPTIMIZE TABLE `session`");
DBA::e("OPTIMIZE TABLE `tokens`");
Logger::info('Optimize end'); Logger::info('Optimize end');

View file

@ -289,21 +289,6 @@ return [
"url" => ["url"] "url" => ["url"]
] ]
], ],
"clients" => [
"comment" => "OAuth usage",
"fields" => [
"client_id" => ["type" => "varchar(20)", "not null" => "1", "primary" => "1", "comment" => ""],
"pw" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => ""],
"redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
"name" => ["type" => "text", "comment" => ""],
"icon" => ["type" => "text", "comment" => ""],
"uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "User id"],
],
"indexes" => [
"PRIMARY" => ["client_id"],
"uid" => ["uid"],
]
],
"permissionset" => [ "permissionset" => [
"comment" => "", "comment" => "",
"fields" => [ "fields" => [
@ -494,21 +479,6 @@ return [
"uid" => ["uid"], "uid" => ["uid"],
] ]
], ],
"auth_codes" => [
"comment" => "OAuth usage",
"fields" => [
"id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
"client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "foreign" => ["clients" => "client_id"],
"comment" => ""],
"redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
"expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
"scope" => ["type" => "varchar(250)", "not null" => "1", "default" => "", "comment" => ""],
],
"indexes" => [
"PRIMARY" => ["id"],
"client_id" => ["client_id"]
]
],
"cache" => [ "cache" => [
"comment" => "Stores temporary data", "comment" => "Stores temporary data",
"fields" => [ "fields" => [
@ -1506,22 +1476,6 @@ return [
"PRIMARY" => ["id"] "PRIMARY" => ["id"]
] ]
], ],
"tokens" => [
"comment" => "OAuth usage",
"fields" => [
"id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
"secret" => ["type" => "text", "comment" => ""],
"client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "foreign" => ["clients" => "client_id"]],
"expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
"scope" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
"uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "User id"],
],
"indexes" => [
"PRIMARY" => ["id"],
"client_id" => ["client_id"],
"uid" => ["uid"]
]
],
"userd" => [ "userd" => [
"comment" => "Deleted usernames", "comment" => "Deleted usernames",
"fields" => [ "fields" => [

View file

@ -240,9 +240,12 @@ function pre_update_1348()
update_1348(); update_1348();
if (DBStructure::existsTable('auth_codes') && DBStructure::existsTable('clients')) {
DBA::e("DELETE FROM `auth_codes` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`)"); DBA::e("DELETE FROM `auth_codes` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`)");
}
if (DBStructure::existsTable('tokens') && DBStructure::existsTable('clients')) {
DBA::e("DELETE FROM `tokens` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`)"); DBA::e("DELETE FROM `tokens` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`)");
}
return Update::SUCCESS; return Update::SUCCESS;
} }
@ -391,7 +394,7 @@ function pre_update_1364()
return Update::FAILED; return Update::FAILED;
} }
if (!DBA::e("DELETE FROM `clients` WHERE NOT `uid` IN (SELECT `uid` FROM `user`)")) { if (DBStructure::existsTable('clients') && !DBA::e("DELETE FROM `clients` WHERE NOT `uid` IN (SELECT `uid` FROM `user`)")) {
return Update::FAILED; return Update::FAILED;
} }
@ -463,7 +466,7 @@ function pre_update_1364()
return Update::FAILED; return Update::FAILED;
} }
if (!DBA::e("DELETE FROM `tokens` WHERE NOT `uid` IN (SELECT `uid` FROM `user`)")) { if (DBStructure::existsTable('tokens') && !DBA::e("DELETE FROM `tokens` WHERE NOT `uid` IN (SELECT `uid` FROM `user`)")) {
return Update::FAILED; return Update::FAILED;
} }

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2021.09-dev\n" "Project-Id-Version: 2021.09-dev\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-07-15 08:57+0000\n" "POT-Creation-Date: 2021-07-20 17:39+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,26 +18,26 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: include/api.php:1135 src/Module/BaseApi.php:302 #: include/api.php:1114 src/Module/BaseApi.php:302
#, php-format #, php-format
msgid "Daily posting limit of %d post reached. The post was rejected." msgid "Daily posting limit of %d post reached. The post was rejected."
msgid_plural "Daily posting limit of %d posts reached. The post was rejected." msgid_plural "Daily posting limit of %d posts reached. The post was rejected."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: include/api.php:1149 src/Module/BaseApi.php:318 #: include/api.php:1128 src/Module/BaseApi.php:318
#, php-format #, php-format
msgid "Weekly posting limit of %d post reached. The post was rejected." msgid "Weekly posting limit of %d post reached. The post was rejected."
msgid_plural "Weekly posting limit of %d posts reached. The post was rejected." msgid_plural "Weekly posting limit of %d posts reached. The post was rejected."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: include/api.php:1163 src/Module/BaseApi.php:334 #: include/api.php:1142 src/Module/BaseApi.php:334
#, php-format #, php-format
msgid "Monthly posting limit of %d post reached. The post was rejected." msgid "Monthly posting limit of %d post reached. The post was rejected."
msgstr "" msgstr ""
#: include/api.php:4500 mod/photos.php:106 mod/photos.php:210 #: include/api.php:4437 mod/photos.php:106 mod/photos.php:210
#: mod/photos.php:638 mod/photos.php:1042 mod/photos.php:1059 #: mod/photos.php:638 mod/photos.php:1042 mod/photos.php:1059
#: mod/photos.php:1608 src/Model/User.php:1105 src/Model/User.php:1113 #: mod/photos.php:1608 src/Model/User.php:1105 src/Model/User.php:1113
#: src/Model/User.php:1121 src/Module/Settings/Profile/Photo/Crop.php:98 #: src/Model/User.php:1121 src/Module/Settings/Profile/Photo/Crop.php:98
@ -54,7 +54,7 @@ msgstr ""
msgid "%1$s poked %2$s" msgid "%1$s poked %2$s"
msgstr "" msgstr ""
#: include/conversation.php:138 src/Model/Item.php:2606 #: include/conversation.php:138 src/Model/Item.php:2614
msgid "event" msgid "event"
msgstr "" msgstr ""
@ -62,7 +62,7 @@ msgstr ""
msgid "status" msgid "status"
msgstr "" msgstr ""
#: include/conversation.php:146 mod/tagger.php:90 src/Model/Item.php:2608 #: include/conversation.php:146 mod/tagger.php:90 src/Model/Item.php:2616
msgid "photo" msgid "photo"
msgstr "" msgstr ""
@ -75,7 +75,7 @@ msgstr ""
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: include/conversation.php:469 mod/photos.php:1470 mod/settings.php:633 #: include/conversation.php:469 mod/photos.php:1470 mod/settings.php:576
#: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140 #: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140
#: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:894 #: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:894
#: src/Module/Contact.php:1198 #: src/Module/Contact.php:1198
@ -184,32 +184,32 @@ msgstr ""
msgid "Follow Thread" msgid "Follow Thread"
msgstr "" msgstr ""
#: include/conversation.php:852 src/Model/Contact.php:1043 #: include/conversation.php:852 src/Model/Contact.php:1047
msgid "View Status" msgid "View Status"
msgstr "" msgstr ""
#: include/conversation.php:853 include/conversation.php:875 #: include/conversation.php:853 include/conversation.php:875
#: src/Model/Contact.php:969 src/Model/Contact.php:1035 #: src/Model/Contact.php:973 src/Model/Contact.php:1039
#: src/Model/Contact.php:1044 src/Module/Directory.php:166 #: src/Model/Contact.php:1048 src/Module/Directory.php:166
#: src/Module/Settings/Profile/Index.php:224 #: src/Module/Settings/Profile/Index.php:224
msgid "View Profile" msgid "View Profile"
msgstr "" msgstr ""
#: include/conversation.php:854 src/Model/Contact.php:1045 #: include/conversation.php:854 src/Model/Contact.php:1049
msgid "View Photos" msgid "View Photos"
msgstr "" msgstr ""
#: include/conversation.php:855 src/Model/Contact.php:1036 #: include/conversation.php:855 src/Model/Contact.php:1040
#: src/Model/Contact.php:1046 #: src/Model/Contact.php:1050
msgid "Network Posts" msgid "Network Posts"
msgstr "" msgstr ""
#: include/conversation.php:856 src/Model/Contact.php:1037 #: include/conversation.php:856 src/Model/Contact.php:1041
#: src/Model/Contact.php:1047 #: src/Model/Contact.php:1051
msgid "View Contact" msgid "View Contact"
msgstr "" msgstr ""
#: include/conversation.php:857 src/Model/Contact.php:1049 #: include/conversation.php:857 src/Model/Contact.php:1053
msgid "Send PM" msgid "Send PM"
msgstr "" msgstr ""
@ -232,12 +232,12 @@ msgstr ""
msgid "Languages" msgid "Languages"
msgstr "" msgstr ""
#: include/conversation.php:867 src/Model/Contact.php:1050 #: include/conversation.php:867 src/Model/Contact.php:1054
msgid "Poke" msgid "Poke"
msgstr "" msgstr ""
#: include/conversation.php:872 mod/follow.php:138 src/Content/Widget.php:76 #: include/conversation.php:872 mod/follow.php:138 src/Content/Widget.php:76
#: src/Model/Contact.php:1038 src/Model/Contact.php:1051 #: src/Model/Contact.php:1042 src/Model/Contact.php:1055
#: view/theme/vier/theme.php:172 #: view/theme/vier/theme.php:172
msgid "Connect/Follow" msgid "Connect/Follow"
msgstr "" msgstr ""
@ -461,7 +461,7 @@ msgstr ""
msgid "Permission settings" msgid "Permission settings"
msgstr "" msgstr ""
#: include/conversation.php:1128 mod/editpost.php:134 mod/events.php:578 #: include/conversation.php:1128 mod/editpost.php:134 mod/events.php:583
#: mod/photos.php:968 mod/photos.php:1334 #: mod/photos.php:968 mod/photos.php:1334
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
@ -470,7 +470,7 @@ msgstr ""
msgid "Public post" msgid "Public post"
msgstr "" msgstr ""
#: include/conversation.php:1141 mod/editpost.php:125 mod/events.php:573 #: include/conversation.php:1141 mod/editpost.php:125 mod/events.php:578
#: mod/photos.php:1380 mod/photos.php:1437 mod/photos.php:1512 #: mod/photos.php:1380 mod/photos.php:1437 mod/photos.php:1512
#: src/Module/Item/Compose.php:154 src/Object/Post.php:971 #: src/Module/Item/Compose.php:154 src/Object/Post.php:971
msgid "Preview" msgid "Preview"
@ -822,12 +822,12 @@ msgstr ""
msgid "Please visit %s to approve or reject the request." msgid "Please visit %s to approve or reject the request."
msgstr "" msgstr ""
#: mod/api.php:52 mod/api.php:57 mod/editpost.php:37 mod/events.php:231 #: mod/api.php:30 mod/api.php:35 mod/editpost.php:37 mod/events.php:236
#: mod/follow.php:55 mod/follow.php:130 mod/item.php:185 mod/item.php:190 #: mod/follow.php:55 mod/follow.php:130 mod/item.php:185 mod/item.php:190
#: mod/item.php:917 mod/message.php:69 mod/message.php:112 mod/notes.php:44 #: mod/item.php:917 mod/message.php:69 mod/message.php:112 mod/notes.php:44
#: mod/ostatus_subscribe.php:32 mod/photos.php:175 mod/photos.php:921 #: mod/ostatus_subscribe.php:32 mod/photos.php:175 mod/photos.php:921
#: mod/repair_ostatus.php:31 mod/settings.php:47 mod/settings.php:65 #: mod/repair_ostatus.php:31 mod/settings.php:47 mod/settings.php:65
#: mod/settings.php:474 mod/suggest.php:34 mod/uimport.php:32 #: mod/settings.php:417 mod/suggest.php:34 mod/uimport.php:32
#: mod/unfollow.php:35 mod/unfollow.php:50 mod/unfollow.php:82 #: mod/unfollow.php:35 mod/unfollow.php:50 mod/unfollow.php:82
#: mod/wall_attach.php:78 mod/wall_attach.php:81 mod/wall_upload.php:99 #: mod/wall_attach.php:78 mod/wall_attach.php:81 mod/wall_upload.php:99
#: mod/wall_upload.php:102 mod/wallmessage.php:35 mod/wallmessage.php:59 #: mod/wall_upload.php:102 mod/wallmessage.php:35 mod/wallmessage.php:59
@ -855,35 +855,6 @@ msgstr ""
msgid "Permission denied." msgid "Permission denied."
msgstr "" msgstr ""
#: mod/api.php:102 mod/api.php:124 src/Module/OAuth/Acknowledge.php:44
msgid "Authorize application connection"
msgstr ""
#: mod/api.php:103
msgid "Return to your app and insert this Securty Code:"
msgstr ""
#: mod/api.php:112 src/Module/BaseAdmin.php:54 src/Module/BaseAdmin.php:58
msgid "Please login to continue."
msgstr ""
#: mod/api.php:126 src/Module/OAuth/Acknowledge.php:46
msgid ""
"Do you want to authorize this application to access your posts and contacts, "
"and/or create new posts for you?"
msgstr ""
#: mod/api.php:127 src/Module/Contact.php:464
#: src/Module/Notifications/Introductions.php:123
#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:115
msgid "Yes"
msgstr ""
#: mod/api.php:128 src/Module/Notifications/Introductions.php:123
#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:116
msgid "No"
msgstr ""
#: mod/cal.php:46 mod/cal.php:50 mod/follow.php:38 mod/redir.php:34 #: mod/cal.php:46 mod/cal.php:50 mod/follow.php:38 mod/redir.php:34
#: mod/redir.php:176 src/Module/Conversation/Community.php:194 #: mod/redir.php:176 src/Module/Conversation/Community.php:194
#: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:51 #: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:51
@ -906,45 +877,45 @@ msgstr ""
msgid "Access to this profile has been restricted." msgid "Access to this profile has been restricted."
msgstr "" msgstr ""
#: mod/cal.php:274 mod/events.php:417 src/Content/Nav.php:195 #: mod/cal.php:274 mod/events.php:422 src/Content/Nav.php:195
#: src/Content/Nav.php:262 src/Module/BaseProfile.php:88 #: src/Content/Nav.php:262 src/Module/BaseProfile.php:88
#: src/Module/BaseProfile.php:99 view/theme/frio/theme.php:230 #: src/Module/BaseProfile.php:99 view/theme/frio/theme.php:230
#: view/theme/frio/theme.php:234 #: view/theme/frio/theme.php:234
msgid "Events" msgid "Events"
msgstr "" msgstr ""
#: mod/cal.php:275 mod/events.php:418 #: mod/cal.php:275 mod/events.php:423
msgid "View" msgid "View"
msgstr "" msgstr ""
#: mod/cal.php:276 mod/events.php:420 #: mod/cal.php:276 mod/events.php:425
msgid "Previous" msgid "Previous"
msgstr "" msgstr ""
#: mod/cal.php:277 mod/events.php:421 src/Module/Install.php:207 #: mod/cal.php:277 mod/events.php:426 src/Module/Install.php:207
msgid "Next" msgid "Next"
msgstr "" msgstr ""
#: mod/cal.php:280 mod/events.php:426 src/Model/Event.php:466 #: mod/cal.php:280 mod/events.php:431 src/Model/Event.php:450
msgid "today" msgid "today"
msgstr "" msgstr ""
#: mod/cal.php:281 mod/events.php:427 src/Model/Event.php:467 #: mod/cal.php:281 mod/events.php:432 src/Model/Event.php:451
#: src/Util/Temporal.php:330 #: src/Util/Temporal.php:330
msgid "month" msgid "month"
msgstr "" msgstr ""
#: mod/cal.php:282 mod/events.php:428 src/Model/Event.php:468 #: mod/cal.php:282 mod/events.php:433 src/Model/Event.php:452
#: src/Util/Temporal.php:331 #: src/Util/Temporal.php:331
msgid "week" msgid "week"
msgstr "" msgstr ""
#: mod/cal.php:283 mod/events.php:429 src/Model/Event.php:469 #: mod/cal.php:283 mod/events.php:434 src/Model/Event.php:453
#: src/Util/Temporal.php:332 #: src/Util/Temporal.php:332
msgid "day" msgid "day"
msgstr "" msgstr ""
#: mod/cal.php:284 mod/events.php:430 #: mod/cal.php:284 mod/events.php:435
msgid "list" msgid "list"
msgstr "" msgstr ""
@ -1036,23 +1007,23 @@ msgstr ""
msgid "Event title and start time are required." msgid "Event title and start time are required."
msgstr "" msgstr ""
#: mod/events.php:419 #: mod/events.php:424
msgid "Create New Event" msgid "Create New Event"
msgstr "" msgstr ""
#: mod/events.php:531 #: mod/events.php:536
msgid "Event details" msgid "Event details"
msgstr "" msgstr ""
#: mod/events.php:532 #: mod/events.php:537
msgid "Starting date and Title are required." msgid "Starting date and Title are required."
msgstr "" msgstr ""
#: mod/events.php:533 mod/events.php:538 #: mod/events.php:538 mod/events.php:543
msgid "Event Starts:" msgid "Event Starts:"
msgstr "" msgstr ""
#: mod/events.php:533 mod/events.php:565 #: mod/events.php:538 mod/events.php:570
#: src/Module/Admin/Blocklist/Server.php:79 #: src/Module/Admin/Blocklist/Server.php:79
#: src/Module/Admin/Blocklist/Server.php:80 #: src/Module/Admin/Blocklist/Server.php:80
#: src/Module/Admin/Blocklist/Server.php:99 #: src/Module/Admin/Blocklist/Server.php:99
@ -1070,40 +1041,40 @@ msgstr ""
msgid "Required" msgid "Required"
msgstr "" msgstr ""
#: mod/events.php:546 mod/events.php:571 #: mod/events.php:551 mod/events.php:576
msgid "Finish date/time is not known or not relevant" msgid "Finish date/time is not known or not relevant"
msgstr "" msgstr ""
#: mod/events.php:548 mod/events.php:553 #: mod/events.php:553 mod/events.php:558
msgid "Event Finishes:" msgid "Event Finishes:"
msgstr "" msgstr ""
#: mod/events.php:559 mod/events.php:572 #: mod/events.php:564 mod/events.php:577
msgid "Adjust for viewer timezone" msgid "Adjust for viewer timezone"
msgstr "" msgstr ""
#: mod/events.php:561 src/Module/Profile/Profile.php:172 #: mod/events.php:566 src/Module/Profile/Profile.php:172
#: src/Module/Settings/Profile/Index.php:237 #: src/Module/Settings/Profile/Index.php:237
msgid "Description:" msgid "Description:"
msgstr "" msgstr ""
#: mod/events.php:563 src/Model/Event.php:86 src/Model/Event.php:113 #: mod/events.php:568 src/Model/Event.php:86 src/Model/Event.php:113
#: src/Model/Event.php:475 src/Model/Event.php:962 src/Model/Profile.php:420 #: src/Model/Event.php:459 src/Model/Event.php:945 src/Model/Profile.php:420
#: src/Module/Contact.php:654 src/Module/Directory.php:156 #: src/Module/Contact.php:654 src/Module/Directory.php:156
#: src/Module/Notifications/Introductions.php:166 #: src/Module/Notifications/Introductions.php:166
#: src/Module/Profile/Profile.php:190 #: src/Module/Profile/Profile.php:190
msgid "Location:" msgid "Location:"
msgstr "" msgstr ""
#: mod/events.php:565 mod/events.php:567 #: mod/events.php:570 mod/events.php:572
msgid "Title:" msgid "Title:"
msgstr "" msgstr ""
#: mod/events.php:568 mod/events.php:569 #: mod/events.php:573 mod/events.php:574
msgid "Share this event" msgid "Share this event"
msgstr "" msgstr ""
#: mod/events.php:575 mod/message.php:205 mod/message.php:368 #: mod/events.php:580 mod/message.php:205 mod/message.php:368
#: mod/photos.php:950 mod/photos.php:1053 mod/photos.php:1338 #: mod/photos.php:950 mod/photos.php:1053 mod/photos.php:1338
#: mod/photos.php:1379 mod/photos.php:1436 mod/photos.php:1511 #: mod/photos.php:1379 mod/photos.php:1436 mod/photos.php:1511
#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:612 #: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:612
@ -1121,16 +1092,16 @@ msgstr ""
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: mod/events.php:576 src/Module/Profile/Profile.php:244 #: mod/events.php:581 src/Module/Profile/Profile.php:244
msgid "Basic" msgid "Basic"
msgstr "" msgstr ""
#: mod/events.php:577 src/Module/Admin/Site.php:573 src/Module/Contact.php:961 #: mod/events.php:582 src/Module/Admin/Site.php:573 src/Module/Contact.php:961
#: src/Module/Profile/Profile.php:245 #: src/Module/Profile/Profile.php:245
msgid "Advanced" msgid "Advanced"
msgstr "" msgstr ""
#: mod/events.php:594 #: mod/events.php:599
msgid "Failed to remove event" msgid "Failed to remove event"
msgstr "" msgstr ""
@ -1860,83 +1831,75 @@ msgid_plural "Errors"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: mod/settings.php:90 #: mod/settings.php:142
msgid "Missing some important data!"
msgstr ""
#: mod/settings.php:92 src/Module/Contact.php:890
msgid "Update"
msgstr ""
#: mod/settings.php:199
msgid "Failed to connect with email account using the settings provided." msgid "Failed to connect with email account using the settings provided."
msgstr "" msgstr ""
#: mod/settings.php:228 #: mod/settings.php:171
msgid "Contact CSV file upload error" msgid "Contact CSV file upload error"
msgstr "" msgstr ""
#: mod/settings.php:247 #: mod/settings.php:190
msgid "Importing Contacts done" msgid "Importing Contacts done"
msgstr "" msgstr ""
#: mod/settings.php:260 #: mod/settings.php:203
msgid "Relocate message has been send to your contacts" msgid "Relocate message has been send to your contacts"
msgstr "" msgstr ""
#: mod/settings.php:272 #: mod/settings.php:215
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "" msgstr ""
#: mod/settings.php:280 src/Console/User.php:210 #: mod/settings.php:223 src/Console/User.php:210
msgid "Password update failed. Please try again." msgid "Password update failed. Please try again."
msgstr "" msgstr ""
#: mod/settings.php:283 src/Console/User.php:213 #: mod/settings.php:226 src/Console/User.php:213
msgid "Password changed." msgid "Password changed."
msgstr "" msgstr ""
#: mod/settings.php:286 #: mod/settings.php:229
msgid "Password unchanged." msgid "Password unchanged."
msgstr "" msgstr ""
#: mod/settings.php:371 #: mod/settings.php:314
msgid "Please use a shorter name." msgid "Please use a shorter name."
msgstr "" msgstr ""
#: mod/settings.php:374 #: mod/settings.php:317
msgid "Name too short." msgid "Name too short."
msgstr "" msgstr ""
#: mod/settings.php:381 #: mod/settings.php:324
msgid "Wrong Password." msgid "Wrong Password."
msgstr "" msgstr ""
#: mod/settings.php:386 #: mod/settings.php:329
msgid "Invalid email." msgid "Invalid email."
msgstr "" msgstr ""
#: mod/settings.php:392 #: mod/settings.php:335
msgid "Cannot change to that email." msgid "Cannot change to that email."
msgstr "" msgstr ""
#: mod/settings.php:430 #: mod/settings.php:373
msgid "Private forum has no privacy permissions. Using default privacy group." msgid "Private forum has no privacy permissions. Using default privacy group."
msgstr "" msgstr ""
#: mod/settings.php:433 #: mod/settings.php:376
msgid "Private forum has no privacy permissions and no default privacy group." msgid "Private forum has no privacy permissions and no default privacy group."
msgstr "" msgstr ""
#: mod/settings.php:452 #: mod/settings.php:395
msgid "Settings were not updated." msgid "Settings were not updated."
msgstr "" msgstr ""
#: mod/settings.php:493 #: mod/settings.php:436
msgid "Connected Apps" msgid "Connected Apps"
msgstr "" msgstr ""
#: mod/settings.php:494 src/Module/Admin/Blocklist/Contact.php:90 #: mod/settings.php:437 src/Module/Admin/Blocklist/Contact.php:90
#: src/Module/Admin/Users/Active.php:129 src/Module/Admin/Users/Blocked.php:130 #: src/Module/Admin/Users/Active.php:129 src/Module/Admin/Users/Blocked.php:130
#: src/Module/Admin/Users/Create.php:71 src/Module/Admin/Users/Deleted.php:88 #: src/Module/Admin/Users/Create.php:71 src/Module/Admin/Users/Deleted.php:88
#: src/Module/Admin/Users/Index.php:142 src/Module/Admin/Users/Index.php:162 #: src/Module/Admin/Users/Index.php:142 src/Module/Admin/Users/Index.php:162
@ -1944,31 +1907,31 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: mod/settings.php:495 src/Content/Nav.php:216 #: mod/settings.php:438 src/Content/Nav.php:216
msgid "Home Page" msgid "Home Page"
msgstr "" msgstr ""
#: mod/settings.php:496 src/Module/Admin/Queue.php:78 #: mod/settings.php:439 src/Module/Admin/Queue.php:78
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: mod/settings.php:497 #: mod/settings.php:440
msgid "Remove authorization" msgid "Remove authorization"
msgstr "" msgstr ""
#: mod/settings.php:515 #: mod/settings.php:458
msgid "Addon Settings" msgid "Addon Settings"
msgstr "" msgstr ""
#: mod/settings.php:516 #: mod/settings.php:459
msgid "No Addon settings configured" msgid "No Addon settings configured"
msgstr "" msgstr ""
#: mod/settings.php:537 #: mod/settings.php:480
msgid "Additional Features" msgid "Additional Features"
msgstr "" msgstr ""
#: mod/settings.php:539 mod/settings.php:635 mod/settings.php:770 #: mod/settings.php:482 mod/settings.php:578 mod/settings.php:713
#: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:87 #: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:87
#: src/Module/Admin/Logs/Settings.php:82 src/Module/Admin/Site.php:568 #: src/Module/Admin/Logs/Settings.php:82 src/Module/Admin/Site.php:568
#: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:66 #: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:66
@ -1976,48 +1939,48 @@ msgstr ""
msgid "Save Settings" msgid "Save Settings"
msgstr "" msgstr ""
#: mod/settings.php:561 #: mod/settings.php:504
msgid "Diaspora (Socialhome, Hubzilla)" msgid "Diaspora (Socialhome, Hubzilla)"
msgstr "" msgstr ""
#: mod/settings.php:561 mod/settings.php:562 #: mod/settings.php:504 mod/settings.php:505
msgid "enabled" msgid "enabled"
msgstr "" msgstr ""
#: mod/settings.php:561 mod/settings.php:562 #: mod/settings.php:504 mod/settings.php:505
msgid "disabled" msgid "disabled"
msgstr "" msgstr ""
#: mod/settings.php:561 mod/settings.php:562 #: mod/settings.php:504 mod/settings.php:505
#, php-format #, php-format
msgid "Built-in support for %s connectivity is %s" msgid "Built-in support for %s connectivity is %s"
msgstr "" msgstr ""
#: mod/settings.php:562 #: mod/settings.php:505
msgid "OStatus (GNU Social)" msgid "OStatus (GNU Social)"
msgstr "" msgstr ""
#: mod/settings.php:593 #: mod/settings.php:536
msgid "Email access is disabled on this site." msgid "Email access is disabled on this site."
msgstr "" msgstr ""
#: mod/settings.php:598 mod/settings.php:633 #: mod/settings.php:541 mod/settings.php:576
msgid "None" msgid "None"
msgstr "" msgstr ""
#: mod/settings.php:604 src/Module/BaseSettings.php:80 #: mod/settings.php:547 src/Module/BaseSettings.php:80
msgid "Social Networks" msgid "Social Networks"
msgstr "" msgstr ""
#: mod/settings.php:609 #: mod/settings.php:552
msgid "General Social Media Settings" msgid "General Social Media Settings"
msgstr "" msgstr ""
#: mod/settings.php:610 #: mod/settings.php:553
msgid "Accept only top level posts by contacts you follow" msgid "Accept only top level posts by contacts you follow"
msgstr "" msgstr ""
#: mod/settings.php:610 #: mod/settings.php:553
msgid "" msgid ""
"The system does an auto completion of threads when a comment arrives. This " "The system does an auto completion of threads when a comment arrives. This "
"has got the side effect that you can receive posts that had been started by " "has got the side effect that you can receive posts that had been started by "
@ -2026,11 +1989,11 @@ msgid ""
"posts from people you really do follow." "posts from people you really do follow."
msgstr "" msgstr ""
#: mod/settings.php:611 #: mod/settings.php:554
msgid "Disable Content Warning" msgid "Disable Content Warning"
msgstr "" msgstr ""
#: mod/settings.php:611 #: mod/settings.php:554
msgid "" msgid ""
"Users on networks like Mastodon or Pleroma are able to set a content warning " "Users on networks like Mastodon or Pleroma are able to set a content warning "
"field which collapse their post by default. This disables the automatic " "field which collapse their post by default. This disables the automatic "
@ -2038,222 +2001,222 @@ msgid ""
"any other content filtering you eventually set up." "any other content filtering you eventually set up."
msgstr "" msgstr ""
#: mod/settings.php:612 #: mod/settings.php:555
msgid "Disable intelligent shortening" msgid "Disable intelligent shortening"
msgstr "" msgstr ""
#: mod/settings.php:612 #: mod/settings.php:555
msgid "" msgid ""
"Normally the system tries to find the best link to add to shortened posts. " "Normally the system tries to find the best link to add to shortened posts. "
"If this option is enabled then every shortened post will always point to the " "If this option is enabled then every shortened post will always point to the "
"original friendica post." "original friendica post."
msgstr "" msgstr ""
#: mod/settings.php:613 #: mod/settings.php:556
msgid "Enable simple text shortening" msgid "Enable simple text shortening"
msgstr "" msgstr ""
#: mod/settings.php:613 #: mod/settings.php:556
msgid "" msgid ""
"Normally the system shortens posts at the next line feed. If this option is " "Normally the system shortens posts at the next line feed. If this option is "
"enabled then the system will shorten the text at the maximum character limit." "enabled then the system will shorten the text at the maximum character limit."
msgstr "" msgstr ""
#: mod/settings.php:614 #: mod/settings.php:557
msgid "Attach the link title" msgid "Attach the link title"
msgstr "" msgstr ""
#: mod/settings.php:614 #: mod/settings.php:557
msgid "" msgid ""
"When activated, the title of the attached link will be added as a title on " "When activated, the title of the attached link will be added as a title on "
"posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that " "posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that "
"share feed content." "share feed content."
msgstr "" msgstr ""
#: mod/settings.php:615 #: mod/settings.php:558
msgid "Your legacy ActivityPub/GNU Social account" msgid "Your legacy ActivityPub/GNU Social account"
msgstr "" msgstr ""
#: mod/settings.php:615 #: mod/settings.php:558
msgid "" msgid ""
"If you enter your old account name from an ActivityPub based system or your " "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 " "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." "contacts will be added automatically. The field will be emptied when done."
msgstr "" msgstr ""
#: mod/settings.php:618 #: mod/settings.php:561
msgid "Repair OStatus subscriptions" msgid "Repair OStatus subscriptions"
msgstr "" msgstr ""
#: mod/settings.php:622 #: mod/settings.php:565
msgid "Email/Mailbox Setup" msgid "Email/Mailbox Setup"
msgstr "" msgstr ""
#: mod/settings.php:623 #: mod/settings.php:566
msgid "" msgid ""
"If you wish to communicate with email contacts using this service " "If you wish to communicate with email contacts using this service "
"(optional), please specify how to connect to your mailbox." "(optional), please specify how to connect to your mailbox."
msgstr "" msgstr ""
#: mod/settings.php:624 #: mod/settings.php:567
msgid "Last successful email check:" msgid "Last successful email check:"
msgstr "" msgstr ""
#: mod/settings.php:626 #: mod/settings.php:569
msgid "IMAP server name:" msgid "IMAP server name:"
msgstr "" msgstr ""
#: mod/settings.php:627 #: mod/settings.php:570
msgid "IMAP port:" msgid "IMAP port:"
msgstr "" msgstr ""
#: mod/settings.php:628 #: mod/settings.php:571
msgid "Security:" msgid "Security:"
msgstr "" msgstr ""
#: mod/settings.php:629 #: mod/settings.php:572
msgid "Email login name:" msgid "Email login name:"
msgstr "" msgstr ""
#: mod/settings.php:630 #: mod/settings.php:573
msgid "Email password:" msgid "Email password:"
msgstr "" msgstr ""
#: mod/settings.php:631 #: mod/settings.php:574
msgid "Reply-to address:" msgid "Reply-to address:"
msgstr "" msgstr ""
#: mod/settings.php:632 #: mod/settings.php:575
msgid "Send public posts to all email contacts:" msgid "Send public posts to all email contacts:"
msgstr "" msgstr ""
#: mod/settings.php:633 #: mod/settings.php:576
msgid "Action after import:" msgid "Action after import:"
msgstr "" msgstr ""
#: mod/settings.php:633 src/Content/Nav.php:284 #: mod/settings.php:576 src/Content/Nav.php:284
msgid "Mark as seen" msgid "Mark as seen"
msgstr "" msgstr ""
#: mod/settings.php:633 #: mod/settings.php:576
msgid "Move to folder" msgid "Move to folder"
msgstr "" msgstr ""
#: mod/settings.php:634 #: mod/settings.php:577
msgid "Move to folder:" msgid "Move to folder:"
msgstr "" msgstr ""
#: mod/settings.php:648 #: mod/settings.php:591
msgid "Unable to find your profile. Please contact your admin." msgid "Unable to find your profile. Please contact your admin."
msgstr "" msgstr ""
#: mod/settings.php:684 src/Content/Widget.php:536 #: mod/settings.php:627 src/Content/Widget.php:536
msgid "Account Types" msgid "Account Types"
msgstr "" msgstr ""
#: mod/settings.php:685 #: mod/settings.php:628
msgid "Personal Page Subtypes" msgid "Personal Page Subtypes"
msgstr "" msgstr ""
#: mod/settings.php:686 #: mod/settings.php:629
msgid "Community Forum Subtypes" msgid "Community Forum Subtypes"
msgstr "" msgstr ""
#: mod/settings.php:693 src/Module/Admin/BaseUsers.php:106 #: mod/settings.php:636 src/Module/Admin/BaseUsers.php:106
msgid "Personal Page" msgid "Personal Page"
msgstr "" msgstr ""
#: mod/settings.php:694 #: mod/settings.php:637
msgid "Account for a personal profile." msgid "Account for a personal profile."
msgstr "" msgstr ""
#: mod/settings.php:697 src/Module/Admin/BaseUsers.php:107 #: mod/settings.php:640 src/Module/Admin/BaseUsers.php:107
msgid "Organisation Page" msgid "Organisation Page"
msgstr "" msgstr ""
#: mod/settings.php:698 #: mod/settings.php:641
msgid "" msgid ""
"Account for an organisation that automatically approves contact requests as " "Account for an organisation that automatically approves contact requests as "
"\"Followers\"." "\"Followers\"."
msgstr "" msgstr ""
#: mod/settings.php:701 src/Module/Admin/BaseUsers.php:108 #: mod/settings.php:644 src/Module/Admin/BaseUsers.php:108
msgid "News Page" msgid "News Page"
msgstr "" msgstr ""
#: mod/settings.php:702 #: mod/settings.php:645
msgid "" msgid ""
"Account for a news reflector that automatically approves contact requests as " "Account for a news reflector that automatically approves contact requests as "
"\"Followers\"." "\"Followers\"."
msgstr "" msgstr ""
#: mod/settings.php:705 src/Module/Admin/BaseUsers.php:109 #: mod/settings.php:648 src/Module/Admin/BaseUsers.php:109
msgid "Community Forum" msgid "Community Forum"
msgstr "" msgstr ""
#: mod/settings.php:706 #: mod/settings.php:649
msgid "Account for community discussions." msgid "Account for community discussions."
msgstr "" msgstr ""
#: mod/settings.php:709 src/Module/Admin/BaseUsers.php:99 #: mod/settings.php:652 src/Module/Admin/BaseUsers.php:99
msgid "Normal Account Page" msgid "Normal Account Page"
msgstr "" msgstr ""
#: mod/settings.php:710 #: mod/settings.php:653
msgid "" msgid ""
"Account for a regular personal profile that requires manual approval of " "Account for a regular personal profile that requires manual approval of "
"\"Friends\" and \"Followers\"." "\"Friends\" and \"Followers\"."
msgstr "" msgstr ""
#: mod/settings.php:713 src/Module/Admin/BaseUsers.php:100 #: mod/settings.php:656 src/Module/Admin/BaseUsers.php:100
msgid "Soapbox Page" msgid "Soapbox Page"
msgstr "" msgstr ""
#: mod/settings.php:714 #: mod/settings.php:657
msgid "" msgid ""
"Account for a public profile that automatically approves contact requests as " "Account for a public profile that automatically approves contact requests as "
"\"Followers\"." "\"Followers\"."
msgstr "" msgstr ""
#: mod/settings.php:717 src/Module/Admin/BaseUsers.php:101 #: mod/settings.php:660 src/Module/Admin/BaseUsers.php:101
msgid "Public Forum" msgid "Public Forum"
msgstr "" msgstr ""
#: mod/settings.php:718 #: mod/settings.php:661
msgid "Automatically approves all contact requests." msgid "Automatically approves all contact requests."
msgstr "" msgstr ""
#: mod/settings.php:721 src/Module/Admin/BaseUsers.php:102 #: mod/settings.php:664 src/Module/Admin/BaseUsers.php:102
msgid "Automatic Friend Page" msgid "Automatic Friend Page"
msgstr "" msgstr ""
#: mod/settings.php:722 #: mod/settings.php:665
msgid "" msgid ""
"Account for a popular profile that automatically approves contact requests " "Account for a popular profile that automatically approves contact requests "
"as \"Friends\"." "as \"Friends\"."
msgstr "" msgstr ""
#: mod/settings.php:725 #: mod/settings.php:668
msgid "Private Forum [Experimental]" msgid "Private Forum [Experimental]"
msgstr "" msgstr ""
#: mod/settings.php:726 #: mod/settings.php:669
msgid "Requires manual approval of contact requests." msgid "Requires manual approval of contact requests."
msgstr "" msgstr ""
#: mod/settings.php:737 #: mod/settings.php:680
msgid "OpenID:" msgid "OpenID:"
msgstr "" msgstr ""
#: mod/settings.php:737 #: mod/settings.php:680
msgid "(Optional) Allow this OpenID to login to this account." msgid "(Optional) Allow this OpenID to login to this account."
msgstr "" msgstr ""
#: mod/settings.php:745 #: mod/settings.php:688
msgid "Publish your profile in your local site directory?" msgid "Publish your profile in your local site directory?"
msgstr "" msgstr ""
#: mod/settings.php:745 #: mod/settings.php:688
#, php-format #, php-format
msgid "" msgid ""
"Your profile will be published in this node's <a href=\"%s\">local " "Your profile will be published in this node's <a href=\"%s\">local "
@ -2261,115 +2224,115 @@ msgid ""
"system settings." "system settings."
msgstr "" msgstr ""
#: mod/settings.php:751 #: mod/settings.php:694
#, php-format #, php-format
msgid "" msgid ""
"Your profile will also be published in the global friendica directories (e." "Your profile will also be published in the global friendica directories (e."
"g. <a href=\"%s\">%s</a>)." "g. <a href=\"%s\">%s</a>)."
msgstr "" msgstr ""
#: mod/settings.php:757 #: mod/settings.php:700
#, php-format #, php-format
msgid "Your Identity Address is <strong>'%s'</strong> or '%s'." msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
msgstr "" msgstr ""
#: mod/settings.php:768 #: mod/settings.php:711
msgid "Account Settings" msgid "Account Settings"
msgstr "" msgstr ""
#: mod/settings.php:776 #: mod/settings.php:719
msgid "Password Settings" msgid "Password Settings"
msgstr "" msgstr ""
#: mod/settings.php:777 src/Module/Register.php:149 #: mod/settings.php:720 src/Module/Register.php:149
msgid "New Password:" msgid "New Password:"
msgstr "" msgstr ""
#: mod/settings.php:777 #: mod/settings.php:720
msgid "" msgid ""
"Allowed characters are a-z, A-Z, 0-9 and special characters except white " "Allowed characters are a-z, A-Z, 0-9 and special characters except white "
"spaces, accentuated letters and colon (:)." "spaces, accentuated letters and colon (:)."
msgstr "" msgstr ""
#: mod/settings.php:778 src/Module/Register.php:150 #: mod/settings.php:721 src/Module/Register.php:150
msgid "Confirm:" msgid "Confirm:"
msgstr "" msgstr ""
#: mod/settings.php:778 #: mod/settings.php:721
msgid "Leave password fields blank unless changing" msgid "Leave password fields blank unless changing"
msgstr "" msgstr ""
#: mod/settings.php:779 #: mod/settings.php:722
msgid "Current Password:" msgid "Current Password:"
msgstr "" msgstr ""
#: mod/settings.php:779 #: mod/settings.php:722
msgid "Your current password to confirm the changes" msgid "Your current password to confirm the changes"
msgstr "" msgstr ""
#: mod/settings.php:780 #: mod/settings.php:723
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: mod/settings.php:780 #: mod/settings.php:723
msgid "Your current password to confirm the changes of the email address" msgid "Your current password to confirm the changes of the email address"
msgstr "" msgstr ""
#: mod/settings.php:783 #: mod/settings.php:726
msgid "Delete OpenID URL" msgid "Delete OpenID URL"
msgstr "" msgstr ""
#: mod/settings.php:785 #: mod/settings.php:728
msgid "Basic Settings" msgid "Basic Settings"
msgstr "" msgstr ""
#: mod/settings.php:786 src/Module/Profile/Profile.php:144 #: mod/settings.php:729 src/Module/Profile/Profile.php:144
msgid "Full Name:" msgid "Full Name:"
msgstr "" msgstr ""
#: mod/settings.php:787 #: mod/settings.php:730
msgid "Email Address:" msgid "Email Address:"
msgstr "" msgstr ""
#: mod/settings.php:788 #: mod/settings.php:731
msgid "Your Timezone:" msgid "Your Timezone:"
msgstr "" msgstr ""
#: mod/settings.php:789 #: mod/settings.php:732
msgid "Your Language:" msgid "Your Language:"
msgstr "" msgstr ""
#: mod/settings.php:789 #: mod/settings.php:732
msgid "" msgid ""
"Set the language we use to show you friendica interface and to send you " "Set the language we use to show you friendica interface and to send you "
"emails" "emails"
msgstr "" msgstr ""
#: mod/settings.php:790 #: mod/settings.php:733
msgid "Default Post Location:" msgid "Default Post Location:"
msgstr "" msgstr ""
#: mod/settings.php:791 #: mod/settings.php:734
msgid "Use Browser Location:" msgid "Use Browser Location:"
msgstr "" msgstr ""
#: mod/settings.php:793 #: mod/settings.php:736
msgid "Security and Privacy Settings" msgid "Security and Privacy Settings"
msgstr "" msgstr ""
#: mod/settings.php:795 #: mod/settings.php:738
msgid "Maximum Friend Requests/Day:" msgid "Maximum Friend Requests/Day:"
msgstr "" msgstr ""
#: mod/settings.php:795 mod/settings.php:805 #: mod/settings.php:738 mod/settings.php:748
msgid "(to prevent spam abuse)" msgid "(to prevent spam abuse)"
msgstr "" msgstr ""
#: mod/settings.php:797 #: mod/settings.php:740
msgid "Allow your profile to be searchable globally?" msgid "Allow your profile to be searchable globally?"
msgstr "" msgstr ""
#: mod/settings.php:797 #: mod/settings.php:740
msgid "" msgid ""
"Activate this setting if you want others to easily find and follow you. Your " "Activate this setting if you want others to easily find and follow you. Your "
"profile will be searchable on remote systems. This setting also determines " "profile will be searchable on remote systems. This setting also determines "
@ -2377,43 +2340,43 @@ msgid ""
"indexed or not." "indexed or not."
msgstr "" msgstr ""
#: mod/settings.php:798 #: mod/settings.php:741
msgid "Hide your contact/friend list from viewers of your profile?" msgid "Hide your contact/friend list from viewers of your profile?"
msgstr "" msgstr ""
#: mod/settings.php:798 #: mod/settings.php:741
msgid "" msgid ""
"A list of your contacts is displayed on your profile page. Activate this " "A list of your contacts is displayed on your profile page. Activate this "
"option to disable the display of your contact list." "option to disable the display of your contact list."
msgstr "" msgstr ""
#: mod/settings.php:799 #: mod/settings.php:742
msgid "Hide your profile details from anonymous viewers?" msgid "Hide your profile details from anonymous viewers?"
msgstr "" msgstr ""
#: mod/settings.php:799 #: mod/settings.php:742
msgid "" msgid ""
"Anonymous visitors will only see your profile picture, your display name and " "Anonymous visitors will only see your profile picture, your display name and "
"the nickname you are using on your profile page. Your public posts and " "the nickname you are using on your profile page. Your public posts and "
"replies will still be accessible by other means." "replies will still be accessible by other means."
msgstr "" msgstr ""
#: mod/settings.php:800 #: mod/settings.php:743
msgid "Make public posts unlisted" msgid "Make public posts unlisted"
msgstr "" msgstr ""
#: mod/settings.php:800 #: mod/settings.php:743
msgid "" msgid ""
"Your public posts will not appear on the community pages or in search " "Your public posts will not appear on the community pages or in search "
"results, nor be sent to relay servers. However they can still appear on " "results, nor be sent to relay servers. However they can still appear on "
"public feeds on remote servers." "public feeds on remote servers."
msgstr "" msgstr ""
#: mod/settings.php:801 #: mod/settings.php:744
msgid "Make all posted pictures accessible" msgid "Make all posted pictures accessible"
msgstr "" msgstr ""
#: mod/settings.php:801 #: mod/settings.php:744
msgid "" msgid ""
"This option makes every posted picture accessible via the direct link. This " "This option makes every posted picture accessible via the direct link. This "
"is a workaround for the problem that most other networks can't handle " "is a workaround for the problem that most other networks can't handle "
@ -2421,209 +2384,209 @@ msgid ""
"public on your photo albums though." "public on your photo albums though."
msgstr "" msgstr ""
#: mod/settings.php:802 #: mod/settings.php:745
msgid "Allow friends to post to your profile page?" msgid "Allow friends to post to your profile page?"
msgstr "" msgstr ""
#: mod/settings.php:802 #: mod/settings.php:745
msgid "" msgid ""
"Your contacts may write posts on your profile wall. These posts will be " "Your contacts may write posts on your profile wall. These posts will be "
"distributed to your contacts" "distributed to your contacts"
msgstr "" msgstr ""
#: mod/settings.php:803 #: mod/settings.php:746
msgid "Allow friends to tag your posts?" msgid "Allow friends to tag your posts?"
msgstr "" msgstr ""
#: mod/settings.php:803 #: mod/settings.php:746
msgid "Your contacts can add additional tags to your posts." msgid "Your contacts can add additional tags to your posts."
msgstr "" msgstr ""
#: mod/settings.php:804 #: mod/settings.php:747
msgid "Permit unknown people to send you private mail?" msgid "Permit unknown people to send you private mail?"
msgstr "" msgstr ""
#: mod/settings.php:804 #: mod/settings.php:747
msgid "" msgid ""
"Friendica network users may send you private messages even if they are not " "Friendica network users may send you private messages even if they are not "
"in your contact list." "in your contact list."
msgstr "" msgstr ""
#: mod/settings.php:805 #: mod/settings.php:748
msgid "Maximum private messages per day from unknown people:" msgid "Maximum private messages per day from unknown people:"
msgstr "" msgstr ""
#: mod/settings.php:807 #: mod/settings.php:750
msgid "Default Post Permissions" msgid "Default Post Permissions"
msgstr "" msgstr ""
#: mod/settings.php:811 #: mod/settings.php:754
msgid "Expiration settings" msgid "Expiration settings"
msgstr "" msgstr ""
#: mod/settings.php:812 #: mod/settings.php:755
msgid "Automatically expire posts after this many days:" msgid "Automatically expire posts after this many days:"
msgstr "" msgstr ""
#: mod/settings.php:812 #: mod/settings.php:755
msgid "If empty, posts will not expire. Expired posts will be deleted" msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr "" msgstr ""
#: mod/settings.php:813 #: mod/settings.php:756
msgid "Expire posts" msgid "Expire posts"
msgstr "" msgstr ""
#: mod/settings.php:813 #: mod/settings.php:756
msgid "When activated, posts and comments will be expired." msgid "When activated, posts and comments will be expired."
msgstr "" msgstr ""
#: mod/settings.php:814 #: mod/settings.php:757
msgid "Expire personal notes" msgid "Expire personal notes"
msgstr "" msgstr ""
#: mod/settings.php:814 #: mod/settings.php:757
msgid "" msgid ""
"When activated, the personal notes on your profile page will be expired." "When activated, the personal notes on your profile page will be expired."
msgstr "" msgstr ""
#: mod/settings.php:815 #: mod/settings.php:758
msgid "Expire starred posts" msgid "Expire starred posts"
msgstr "" msgstr ""
#: mod/settings.php:815 #: mod/settings.php:758
msgid "" msgid ""
"Starring posts keeps them from being expired. That behaviour is overwritten " "Starring posts keeps them from being expired. That behaviour is overwritten "
"by this setting." "by this setting."
msgstr "" msgstr ""
#: mod/settings.php:816 #: mod/settings.php:759
msgid "Expire photos" msgid "Expire photos"
msgstr "" msgstr ""
#: mod/settings.php:816 #: mod/settings.php:759
msgid "When activated, photos will be expired." msgid "When activated, photos will be expired."
msgstr "" msgstr ""
#: mod/settings.php:817 #: mod/settings.php:760
msgid "Only expire posts by others" msgid "Only expire posts by others"
msgstr "" msgstr ""
#: mod/settings.php:817 #: mod/settings.php:760
msgid "" msgid ""
"When activated, your own posts never expire. Then the settings above are " "When activated, your own posts never expire. Then the settings above are "
"only valid for posts you received." "only valid for posts you received."
msgstr "" msgstr ""
#: mod/settings.php:820 #: mod/settings.php:763
msgid "Notification Settings" msgid "Notification Settings"
msgstr "" msgstr ""
#: mod/settings.php:821 #: mod/settings.php:764
msgid "Send a notification email when:" msgid "Send a notification email when:"
msgstr "" msgstr ""
#: mod/settings.php:822 #: mod/settings.php:765
msgid "You receive an introduction" msgid "You receive an introduction"
msgstr "" msgstr ""
#: mod/settings.php:823 #: mod/settings.php:766
msgid "Your introductions are confirmed" msgid "Your introductions are confirmed"
msgstr "" msgstr ""
#: mod/settings.php:824 #: mod/settings.php:767
msgid "Someone writes on your profile wall" msgid "Someone writes on your profile wall"
msgstr "" msgstr ""
#: mod/settings.php:825 #: mod/settings.php:768
msgid "Someone writes a followup comment" msgid "Someone writes a followup comment"
msgstr "" msgstr ""
#: mod/settings.php:826 #: mod/settings.php:769
msgid "You receive a private message" msgid "You receive a private message"
msgstr "" msgstr ""
#: mod/settings.php:827 #: mod/settings.php:770
msgid "You receive a friend suggestion" msgid "You receive a friend suggestion"
msgstr "" msgstr ""
#: mod/settings.php:828 #: mod/settings.php:771
msgid "You are tagged in a post" msgid "You are tagged in a post"
msgstr "" msgstr ""
#: mod/settings.php:829 #: mod/settings.php:772
msgid "You are poked/prodded/etc. in a post" msgid "You are poked/prodded/etc. in a post"
msgstr "" msgstr ""
#: mod/settings.php:831 #: mod/settings.php:774
msgid "Activate desktop notifications" msgid "Activate desktop notifications"
msgstr "" msgstr ""
#: mod/settings.php:831 #: mod/settings.php:774
msgid "Show desktop popup on new notifications" msgid "Show desktop popup on new notifications"
msgstr "" msgstr ""
#: mod/settings.php:833 #: mod/settings.php:776
msgid "Text-only notification emails" msgid "Text-only notification emails"
msgstr "" msgstr ""
#: mod/settings.php:835 #: mod/settings.php:778
msgid "Send text only notification emails, without the html part" msgid "Send text only notification emails, without the html part"
msgstr "" msgstr ""
#: mod/settings.php:837 #: mod/settings.php:780
msgid "Show detailled notifications" msgid "Show detailled notifications"
msgstr "" msgstr ""
#: mod/settings.php:839 #: mod/settings.php:782
msgid "" msgid ""
"Per default, notifications are condensed to a single notification per item. " "Per default, notifications are condensed to a single notification per item. "
"When enabled every notification is displayed." "When enabled every notification is displayed."
msgstr "" msgstr ""
#: mod/settings.php:841 #: mod/settings.php:784
msgid "Show notifications of ignored contacts" msgid "Show notifications of ignored contacts"
msgstr "" msgstr ""
#: mod/settings.php:843 #: mod/settings.php:786
msgid "" msgid ""
"You don't see posts from ignored contacts. But you still see their comments. " "You don't see posts from ignored contacts. But you still see their comments. "
"This setting controls if you want to still receive regular notifications " "This setting controls if you want to still receive regular notifications "
"that are caused by ignored contacts or not." "that are caused by ignored contacts or not."
msgstr "" msgstr ""
#: mod/settings.php:845 #: mod/settings.php:788
msgid "Advanced Account/Page Type Settings" msgid "Advanced Account/Page Type Settings"
msgstr "" msgstr ""
#: mod/settings.php:846 #: mod/settings.php:789
msgid "Change the behaviour of this account for special situations" msgid "Change the behaviour of this account for special situations"
msgstr "" msgstr ""
#: mod/settings.php:849 #: mod/settings.php:792
msgid "Import Contacts" msgid "Import Contacts"
msgstr "" msgstr ""
#: mod/settings.php:850 #: mod/settings.php:793
msgid "" msgid ""
"Upload a CSV file that contains the handle of your followed accounts in the " "Upload a CSV file that contains the handle of your followed accounts in the "
"first column you exported from the old account." "first column you exported from the old account."
msgstr "" msgstr ""
#: mod/settings.php:851 #: mod/settings.php:794
msgid "Upload File" msgid "Upload File"
msgstr "" msgstr ""
#: mod/settings.php:853 #: mod/settings.php:796
msgid "Relocate" msgid "Relocate"
msgstr "" msgstr ""
#: mod/settings.php:854 #: mod/settings.php:797
msgid "" msgid ""
"If you have moved this profile from another server, and some of your " "If you have moved this profile from another server, and some of your "
"contacts don't receive your updates, try pushing this button." "contacts don't receive your updates, try pushing this button."
msgstr "" msgstr ""
#: mod/settings.php:855 #: mod/settings.php:798
msgid "Resend relocate message to contacts" msgid "Resend relocate message to contacts"
msgstr "" msgstr ""
@ -2746,7 +2709,7 @@ msgstr ""
msgid "File upload failed." msgid "File upload failed."
msgstr "" msgstr ""
#: mod/wall_upload.php:233 src/Model/Photo.php:985 #: mod/wall_upload.php:233 src/Model/Photo.php:987
msgid "Wall Photos" msgid "Wall Photos"
msgstr "" msgstr ""
@ -3435,8 +3398,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s" "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1108 src/Model/Item.php:3134 #: src/Content/Text/BBCode.php:1108 src/Model/Item.php:3142
#: src/Model/Item.php:3140 src/Model/Item.php:3141 #: src/Model/Item.php:3148 src/Model/Item.php:3149
msgid "Link to source" msgid "Link to source"
msgstr "" msgstr ""
@ -3591,7 +3554,7 @@ msgstr ""
msgid "Organisations" msgid "Organisations"
msgstr "" msgstr ""
#: src/Content/Widget.php:532 src/Model/Contact.php:1467 #: src/Content/Widget.php:532 src/Model/Contact.php:1471
msgid "News" msgid "News"
msgstr "" msgstr ""
@ -3977,137 +3940,137 @@ msgstr ""
msgid "Could not connect to database." msgid "Could not connect to database."
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:434 #: src/Core/L10n.php:377 src/Model/Event.php:418
#: src/Module/Settings/Display.php:178 #: src/Module/Settings/Display.php:178
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:435 #: src/Core/L10n.php:377 src/Model/Event.php:419
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:436 #: src/Core/L10n.php:377 src/Model/Event.php:420
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:437 #: src/Core/L10n.php:377 src/Model/Event.php:421
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:438 #: src/Core/L10n.php:377 src/Model/Event.php:422
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:439 #: src/Core/L10n.php:377 src/Model/Event.php:423
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:433 #: src/Core/L10n.php:377 src/Model/Event.php:417
#: src/Module/Settings/Display.php:178 #: src/Module/Settings/Display.php:178
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:454 #: src/Core/L10n.php:381 src/Model/Event.php:438
msgid "January" msgid "January"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:455 #: src/Core/L10n.php:381 src/Model/Event.php:439
msgid "February" msgid "February"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:456 #: src/Core/L10n.php:381 src/Model/Event.php:440
msgid "March" msgid "March"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:457 #: src/Core/L10n.php:381 src/Model/Event.php:441
msgid "April" msgid "April"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Core/L10n.php:401 src/Model/Event.php:445 #: src/Core/L10n.php:381 src/Core/L10n.php:401 src/Model/Event.php:429
msgid "May" msgid "May"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:458 #: src/Core/L10n.php:381 src/Model/Event.php:442
msgid "June" msgid "June"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:459 #: src/Core/L10n.php:381 src/Model/Event.php:443
msgid "July" msgid "July"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:460 #: src/Core/L10n.php:381 src/Model/Event.php:444
msgid "August" msgid "August"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:461 #: src/Core/L10n.php:381 src/Model/Event.php:445
msgid "September" msgid "September"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:462 #: src/Core/L10n.php:381 src/Model/Event.php:446
msgid "October" msgid "October"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:463 #: src/Core/L10n.php:381 src/Model/Event.php:447
msgid "November" msgid "November"
msgstr "" msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:464 #: src/Core/L10n.php:381 src/Model/Event.php:448
msgid "December" msgid "December"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:426 #: src/Core/L10n.php:397 src/Model/Event.php:410
msgid "Mon" msgid "Mon"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:427 #: src/Core/L10n.php:397 src/Model/Event.php:411
msgid "Tue" msgid "Tue"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:428 #: src/Core/L10n.php:397 src/Model/Event.php:412
msgid "Wed" msgid "Wed"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:429 #: src/Core/L10n.php:397 src/Model/Event.php:413
msgid "Thu" msgid "Thu"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:430 #: src/Core/L10n.php:397 src/Model/Event.php:414
msgid "Fri" msgid "Fri"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:431 #: src/Core/L10n.php:397 src/Model/Event.php:415
msgid "Sat" msgid "Sat"
msgstr "" msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:425 #: src/Core/L10n.php:397 src/Model/Event.php:409
msgid "Sun" msgid "Sun"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:441 #: src/Core/L10n.php:401 src/Model/Event.php:425
msgid "Jan" msgid "Jan"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:442 #: src/Core/L10n.php:401 src/Model/Event.php:426
msgid "Feb" msgid "Feb"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:443 #: src/Core/L10n.php:401 src/Model/Event.php:427
msgid "Mar" msgid "Mar"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:444 #: src/Core/L10n.php:401 src/Model/Event.php:428
msgid "Apr" msgid "Apr"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:446 #: src/Core/L10n.php:401 src/Model/Event.php:430
msgid "Jun" msgid "Jun"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:447 #: src/Core/L10n.php:401 src/Model/Event.php:431
msgid "Jul" msgid "Jul"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:448 #: src/Core/L10n.php:401 src/Model/Event.php:432
msgid "Aug" msgid "Aug"
msgstr "" msgstr ""
@ -4115,15 +4078,15 @@ msgstr ""
msgid "Sep" msgid "Sep"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:450 #: src/Core/L10n.php:401 src/Model/Event.php:434
msgid "Oct" msgid "Oct"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:451 #: src/Core/L10n.php:401 src/Model/Event.php:435
msgid "Nov" msgid "Nov"
msgstr "" msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:452 #: src/Core/L10n.php:401 src/Model/Event.php:436
msgid "Dec" msgid "Dec"
msgstr "" msgstr ""
@ -4291,21 +4254,21 @@ msgid ""
"tables." "tables."
msgstr "" msgstr ""
#: src/Database/DBStructure.php:90 #: src/Database/DBStructure.php:91
msgid "No unused tables found." msgid "No unused tables found."
msgstr "" msgstr ""
#: src/Database/DBStructure.php:95 #: src/Database/DBStructure.php:96
msgid "" msgid ""
"These tables are not used for friendica and will be deleted when you execute " "These tables are not used for friendica and will be deleted when you execute "
"\"dbstructure drop -e\":" "\"dbstructure drop -e\":"
msgstr "" msgstr ""
#: src/Database/DBStructure.php:133 #: src/Database/DBStructure.php:134
msgid "There are no tables on MyISAM or InnoDB with the Antelope file format." msgid "There are no tables on MyISAM or InnoDB with the Antelope file format."
msgstr "" msgstr ""
#: src/Database/DBStructure.php:157 #: src/Database/DBStructure.php:158
#, php-format #, php-format
msgid "" msgid ""
"\n" "\n"
@ -4313,20 +4276,20 @@ msgid ""
"%s\n" "%s\n"
msgstr "" msgstr ""
#: src/Database/DBStructure.php:160 #: src/Database/DBStructure.php:161
msgid "Errors encountered performing database changes: " msgid "Errors encountered performing database changes: "
msgstr "" msgstr ""
#: src/Database/DBStructure.php:548 #: src/Database/DBStructure.php:549
msgid "Another database update is currently running." msgid "Another database update is currently running."
msgstr "" msgstr ""
#: src/Database/DBStructure.php:552 #: src/Database/DBStructure.php:553
#, php-format #, php-format
msgid "%s: Database update" msgid "%s: Database update"
msgstr "" msgstr ""
#: src/Database/DBStructure.php:852 #: src/Database/DBStructure.php:853
#, php-format #, php-format
msgid "%s: updating %s table." msgid "%s: updating %s table."
msgstr "" msgstr ""
@ -4412,153 +4375,153 @@ msgstr ""
msgid "Legacy module file not found: %s" msgid "Legacy module file not found: %s"
msgstr "" msgstr ""
#: src/Model/Contact.php:1039 src/Model/Contact.php:1052 #: src/Model/Contact.php:1043 src/Model/Contact.php:1056
msgid "UnFollow" msgid "UnFollow"
msgstr "" msgstr ""
#: src/Model/Contact.php:1048 #: src/Model/Contact.php:1052
msgid "Drop Contact" msgid "Drop Contact"
msgstr "" msgstr ""
#: src/Model/Contact.php:1058 src/Module/Admin/Users/Pending.php:107 #: src/Model/Contact.php:1062 src/Module/Admin/Users/Pending.php:107
#: src/Module/Notifications/Introductions.php:111 #: src/Module/Notifications/Introductions.php:111
#: src/Module/Notifications/Introductions.php:183 #: src/Module/Notifications/Introductions.php:183
msgid "Approve" msgid "Approve"
msgstr "" msgstr ""
#: src/Model/Contact.php:1463 #: src/Model/Contact.php:1467
msgid "Organisation" msgid "Organisation"
msgstr "" msgstr ""
#: src/Model/Contact.php:1471 #: src/Model/Contact.php:1475
msgid "Forum" msgid "Forum"
msgstr "" msgstr ""
#: src/Model/Contact.php:2327 #: src/Model/Contact.php:2331
msgid "Disallowed profile URL." msgid "Disallowed profile URL."
msgstr "" msgstr ""
#: src/Model/Contact.php:2332 src/Module/Friendica.php:80 #: src/Model/Contact.php:2336 src/Module/Friendica.php:80
msgid "Blocked domain" msgid "Blocked domain"
msgstr "" msgstr ""
#: src/Model/Contact.php:2337 #: src/Model/Contact.php:2341
msgid "Connect URL missing." msgid "Connect URL missing."
msgstr "" msgstr ""
#: src/Model/Contact.php:2346 #: src/Model/Contact.php:2350
msgid "" msgid ""
"The contact could not be added. Please check the relevant network " "The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page." "credentials in your Settings -> Social Networks page."
msgstr "" msgstr ""
#: src/Model/Contact.php:2383 #: src/Model/Contact.php:2387
msgid "The profile address specified does not provide adequate information." msgid "The profile address specified does not provide adequate information."
msgstr "" msgstr ""
#: src/Model/Contact.php:2385 #: src/Model/Contact.php:2389
msgid "No compatible communication protocols or feeds were discovered." msgid "No compatible communication protocols or feeds were discovered."
msgstr "" msgstr ""
#: src/Model/Contact.php:2388 #: src/Model/Contact.php:2392
msgid "An author or name was not found." msgid "An author or name was not found."
msgstr "" msgstr ""
#: src/Model/Contact.php:2391 #: src/Model/Contact.php:2395
msgid "No browser URL could be matched to this address." msgid "No browser URL could be matched to this address."
msgstr "" msgstr ""
#: src/Model/Contact.php:2394 #: src/Model/Contact.php:2398
msgid "" msgid ""
"Unable to match @-style Identity Address with a known protocol or email " "Unable to match @-style Identity Address with a known protocol or email "
"contact." "contact."
msgstr "" msgstr ""
#: src/Model/Contact.php:2395 #: src/Model/Contact.php:2399
msgid "Use mailto: in front of address to force email check." msgid "Use mailto: in front of address to force email check."
msgstr "" msgstr ""
#: src/Model/Contact.php:2401 #: src/Model/Contact.php:2405
msgid "" msgid ""
"The profile address specified belongs to a network which has been disabled " "The profile address specified belongs to a network which has been disabled "
"on this site." "on this site."
msgstr "" msgstr ""
#: src/Model/Contact.php:2406 #: src/Model/Contact.php:2410
msgid "" msgid ""
"Limited profile. This person will be unable to receive direct/personal " "Limited profile. This person will be unable to receive direct/personal "
"notifications from you." "notifications from you."
msgstr "" msgstr ""
#: src/Model/Contact.php:2465 #: src/Model/Contact.php:2469
msgid "Unable to retrieve contact information." msgid "Unable to retrieve contact information."
msgstr "" msgstr ""
#: src/Model/Event.php:52 src/Model/Event.php:874 #: src/Model/Event.php:52 src/Model/Event.php:857
#: src/Module/Debug/Localtime.php:36 #: src/Module/Debug/Localtime.php:36
msgid "l F d, Y \\@ g:i A" msgid "l F d, Y \\@ g:i A"
msgstr "" msgstr ""
#: src/Model/Event.php:79 src/Model/Event.php:96 src/Model/Event.php:473 #: src/Model/Event.php:79 src/Model/Event.php:96 src/Model/Event.php:457
#: src/Model/Event.php:944 #: src/Model/Event.php:927
msgid "Starts:" msgid "Starts:"
msgstr "" msgstr ""
#: src/Model/Event.php:82 src/Model/Event.php:102 src/Model/Event.php:474 #: src/Model/Event.php:82 src/Model/Event.php:102 src/Model/Event.php:458
#: src/Model/Event.php:948 #: src/Model/Event.php:931
msgid "Finishes:" msgid "Finishes:"
msgstr "" msgstr ""
#: src/Model/Event.php:423 #: src/Model/Event.php:407
msgid "all-day" msgid "all-day"
msgstr "" msgstr ""
#: src/Model/Event.php:449 #: src/Model/Event.php:433
msgid "Sept" msgid "Sept"
msgstr "" msgstr ""
#: src/Model/Event.php:471 #: src/Model/Event.php:455
msgid "No events to display" msgid "No events to display"
msgstr "" msgstr ""
#: src/Model/Event.php:590 #: src/Model/Event.php:573
msgid "l, F j" msgid "l, F j"
msgstr "" msgstr ""
#: src/Model/Event.php:621 #: src/Model/Event.php:604
msgid "Edit event" msgid "Edit event"
msgstr "" msgstr ""
#: src/Model/Event.php:622 #: src/Model/Event.php:605
msgid "Duplicate event" msgid "Duplicate event"
msgstr "" msgstr ""
#: src/Model/Event.php:623 #: src/Model/Event.php:606
msgid "Delete event" msgid "Delete event"
msgstr "" msgstr ""
#: src/Model/Event.php:875 #: src/Model/Event.php:858
msgid "D g:i A" msgid "D g:i A"
msgstr "" msgstr ""
#: src/Model/Event.php:876 #: src/Model/Event.php:859
msgid "g:i A" msgid "g:i A"
msgstr "" msgstr ""
#: src/Model/Event.php:963 src/Model/Event.php:965 #: src/Model/Event.php:946 src/Model/Event.php:948
msgid "Show map" msgid "Show map"
msgstr "" msgstr ""
#: src/Model/Event.php:964 #: src/Model/Event.php:947
msgid "Hide map" msgid "Hide map"
msgstr "" msgstr ""
#: src/Model/Event.php:1056 #: src/Model/Event.php:1039
#, php-format #, php-format
msgid "%s's birthday" msgid "%s's birthday"
msgstr "" msgstr ""
#: src/Model/Event.php:1057 #: src/Model/Event.php:1040
#, php-format #, php-format
msgid "Happy Birthday %s" msgid "Happy Birthday %s"
msgstr "" msgstr ""
@ -4607,33 +4570,33 @@ msgstr ""
msgid "Edit groups" msgid "Edit groups"
msgstr "" msgstr ""
#: src/Model/Item.php:1660 #: src/Model/Item.php:1668
#, php-format #, php-format
msgid "Detected languages in this post:\\n%s" msgid "Detected languages in this post:\\n%s"
msgstr "" msgstr ""
#: src/Model/Item.php:2610 #: src/Model/Item.php:2618
msgid "activity" msgid "activity"
msgstr "" msgstr ""
#: src/Model/Item.php:2612 #: src/Model/Item.php:2620
msgid "comment" msgid "comment"
msgstr "" msgstr ""
#: src/Model/Item.php:2615 #: src/Model/Item.php:2623
msgid "post" msgid "post"
msgstr "" msgstr ""
#: src/Model/Item.php:2729 #: src/Model/Item.php:2737
#, php-format #, php-format
msgid "Content warning: %s" msgid "Content warning: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3099 #: src/Model/Item.php:3107
msgid "bytes" msgid "bytes"
msgstr "" msgstr ""
#: src/Model/Item.php:3128 src/Model/Item.php:3129 #: src/Model/Item.php:3136 src/Model/Item.php:3137
msgid "View on separate page" msgid "View on separate page"
msgstr "" msgstr ""
@ -7012,6 +6975,10 @@ msgstr ""
msgid "Item was not found." msgid "Item was not found."
msgstr "" msgstr ""
#: src/Module/BaseAdmin.php:54 src/Module/BaseAdmin.php:58
msgid "Please login to continue."
msgstr ""
#: src/Module/BaseAdmin.php:63 #: src/Module/BaseAdmin.php:63
msgid "You don't have access to administration pages." msgid "You don't have access to administration pages."
msgstr "" msgstr ""
@ -7223,6 +7190,11 @@ msgstr ""
msgid "Do you really want to delete this contact?" msgid "Do you really want to delete this contact?"
msgstr "" msgstr ""
#: src/Module/Contact.php:464 src/Module/Notifications/Introductions.php:123
#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:115
msgid "Yes"
msgstr ""
#: src/Module/Contact.php:476 #: src/Module/Contact.php:476
msgid "Contact has been removed." msgid "Contact has been removed."
msgstr "" msgstr ""
@ -7473,6 +7445,10 @@ msgstr ""
msgid "Results for: %s" msgid "Results for: %s"
msgstr "" msgstr ""
#: src/Module/Contact.php:890
msgid "Update"
msgstr ""
#: src/Module/Contact.php:893 src/Module/Contact.php:1190 #: src/Module/Contact.php:893 src/Module/Contact.php:1190
msgid "Archive" msgid "Archive"
msgstr "" msgstr ""
@ -8583,6 +8559,11 @@ msgstr ""
msgid "Claims to be known to you: " msgid "Claims to be known to you: "
msgstr "" msgstr ""
#: src/Module/Notifications/Introductions.php:123
#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:116
msgid "No"
msgstr ""
#: src/Module/Notifications/Introductions.php:131 #: src/Module/Notifications/Introductions.php:131
msgid "Shall your connection be bidirectional or not?" msgid "Shall your connection be bidirectional or not?"
msgstr "" msgstr ""
@ -8647,6 +8628,16 @@ msgstr ""
msgid "Show all" msgid "Show all"
msgstr "" msgstr ""
#: src/Module/OAuth/Acknowledge.php:44
msgid "Authorize application connection"
msgstr ""
#: src/Module/OAuth/Acknowledge.php:46
msgid ""
"Do you want to authorize this application to access your posts and contacts, "
"and/or create new posts for you?"
msgstr ""
#: src/Module/OAuth/Authorize.php:55 #: src/Module/OAuth/Authorize.php:55
msgid "Unsupported or missing response type" msgid "Unsupported or missing response type"
msgstr "" msgstr ""