X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=advancedcontentfilter%2Fadvancedcontentfilter.php;h=57c87ffd96c9e9fa8804075b84a5d04c41524e24;hb=52407530dbf9ac5700f5b1463ad2b24114e8d7ef;hp=34d47425e290b3d8ba3c20b25077c153d1a23cde;hpb=d9ec1ef80d4a27f9e5b4e24a9be1c3ed1e60d116;p=friendica-addons.git diff --git a/advancedcontentfilter/advancedcontentfilter.php b/advancedcontentfilter/advancedcontentfilter.php index 34d47425..57c87ffd 100644 --- a/advancedcontentfilter/advancedcontentfilter.php +++ b/advancedcontentfilter/advancedcontentfilter.php @@ -34,45 +34,37 @@ */ use Friendica\App; +use Friendica\BaseModule; use Friendica\Content\Text\Markdown; -use Friendica\Core\Addon; -use Friendica\Core\Cache; -use Friendica\Core\L10n; -use Friendica\Core\System; +use Friendica\Core\Hook; +use Friendica\Core\Logger; +use Friendica\Core\Renderer; use Friendica\Database\DBA; use Friendica\Database\DBStructure; +use Friendica\DI; use Friendica\Model\Item; -use Friendica\Model\Term; -use Friendica\Module\Login; +use Friendica\Model\Post; +use Friendica\Model\Tag; +use Friendica\Model\User; +use Friendica\Module\Security\Login; use Friendica\Network\HTTPException; use Friendica\Util\DateTimeFormat; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\ExpressionLanguage; -require_once 'boot.php'; -require_once 'include/conversation.php'; -require_once 'include/dba.php'; -require_once 'include/security.php'; - require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; -function advancedcontentfilter_install() +function advancedcontentfilter_install(App $a) { - Addon::registerHook('dbstructure_definition' , __FILE__, 'advancedcontentfilter_dbstructure_definition'); - Addon::registerHook('prepare_body_content_filter', __FILE__, 'advancedcontentfilter_prepare_body_content_filter'); - Addon::registerHook('addon_settings' , __FILE__, 'advancedcontentfilter_addon_settings'); - - DBStructure::update(false, true); + Hook::register('dbstructure_definition' , __FILE__, 'advancedcontentfilter_dbstructure_definition'); + Hook::register('prepare_body_content_filter', __FILE__, 'advancedcontentfilter_prepare_body_content_filter'); + Hook::register('addon_settings' , __FILE__, 'advancedcontentfilter_addon_settings'); - logger("installed advancedcontentfilter"); -} + Hook::add('dbstructure_definition' , __FILE__, 'advancedcontentfilter_dbstructure_definition'); + DBStructure::performUpdate(); -function advancedcontentfilter_uninstall() -{ - Addon::unregisterHook('dbstructure_definition' , __FILE__, 'advancedcontentfilter_dbstructure_definition'); - Addon::unregisterHook('prepare_body_content_filter', __FILE__, 'advancedcontentfilter_prepare_body_content_filter'); - Addon::unregisterHook('addon_settings' , __FILE__, 'advancedcontentfilter_addon_settings'); + Logger::log("installed advancedcontentfilter"); } /* @@ -90,7 +82,7 @@ function advancedcontentfilter_dbstructure_definition(App $a, &$database) "expression" => ["type" => "mediumtext" , "not null" => "1", "comment" => "Expression text"], "serialized" => ["type" => "mediumtext" , "not null" => "1", "comment" => "Serialized parsed expression"], "active" => ["type" => "boolean" , "not null" => "1", "default" => "1", "comment" => "Whether the rule is active or not"], - "created" => ["type" => "datetime" , "not null" => "1", "default" => NULL_DATE, "comment" => "Creation date"], + "created" => ["type" => "datetime" , "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date"], ], "indexes" => [ "PRIMARY" => ["id"], @@ -99,6 +91,26 @@ function advancedcontentfilter_dbstructure_definition(App $a, &$database) ]; } +function advancedcontentfilter_get_filter_fields(array $item) +{ + $vars = []; + + // Convert the language JSON text into a filterable format + if (!empty($item['language']) && ($languages = json_decode($item['language'], true))) { + foreach ($languages as $key => $value) { + $vars['language_' . strtolower($key)] = $value; + } + } + + foreach ($item as $key => $value) { + $vars[str_replace('-', '_', $key)] = $value; + } + + ksort($vars); + + return $vars; +} + function advancedcontentfilter_prepare_body_content_filter(App $a, &$hook_data) { static $expressionLanguage; @@ -111,18 +123,17 @@ function advancedcontentfilter_prepare_body_content_filter(App $a, &$hook_data) return; } - $vars = []; - foreach ($hook_data['item'] as $key => $value) { - $vars[str_replace('-', '_', $key)] = $value; - } + $vars = advancedcontentfilter_get_filter_fields($hook_data['item']); - $rules = Cache::get('rules_' . local_user()); + $rules = DI::cache()->get('rules_' . local_user()); if (!isset($rules)) { $rules = DBA::toArray(DBA::select( 'advancedcontentfilter_rules', ['name', 'expression', 'serialized'], ['uid' => local_user(), 'active' => true] )); + + DI::cache()->set('rules_' . local_user(), $rules); } if ($rules) { @@ -133,13 +144,14 @@ function advancedcontentfilter_prepare_body_content_filter(App $a, &$hook_data) $rule['serialized'] ); - $found = (bool) $expressionLanguage->evaluate($serializedParsedExpression, $vars); + // The error suppression operator is used because of potentially broken user-supplied regular expressions + $found = (bool) @$expressionLanguage->evaluate($serializedParsedExpression, $vars); } catch (Exception $e) { $found = false; } if ($found) { - $hook_data['filter_reasons'][] = L10n::t('Filtered by rule: %s', $rule['name']); + $hook_data['filter_reasons'][] = DI::l10n()->t('Filtered by rule: %s', $rule['name']); break; } } @@ -153,7 +165,7 @@ function advancedcontentfilter_addon_settings(App $a, &$s) return; } - $advancedcontentfilter = L10n::t('Advanced Content Filter'); + $advancedcontentfilter = DI::l10n()->t('Advanced Content Filter'); $s .= <<

$advancedcontentfilter

@@ -170,7 +182,7 @@ function advancedcontentfilter_module() {} function advancedcontentfilter_init(App $a) { - if ($a->argv[1] == 'api') { + if (DI::args()->getArgc() > 1 && DI::args()->getArgv()[1] == 'api') { $slim = new \Slim\App(); require __DIR__ . '/src/middlewares.php'; @@ -185,11 +197,13 @@ function advancedcontentfilter_init(App $a) function advancedcontentfilter_content(App $a) { if (!local_user()) { - return Login::form('/' . implode('/', $a->argv)); + return Login::form('/' . implode('/', DI::args()->getArgv())); } - if ($a->argc > 0 && $a->argv[1] == 'help') { - $lang = $a->user['language']; + if (DI::args()->getArgc() > 1 && DI::args()->getArgv()[1] == 'help') { + $user = User::getById(local_user()); + + $lang = $user['language']; $default_dir = 'addon/advancedcontentfilter/doc/'; $help_file = 'advancedcontentfilter.md'; @@ -206,34 +220,34 @@ function advancedcontentfilter_content(App $a) return $html; } else { - $t = get_markup_template('settings.tpl', 'addon/advancedcontentfilter/'); - return replace_macros($t, [ + $t = Renderer::getMarkupTemplate('settings.tpl', 'addon/advancedcontentfilter/'); + return Renderer::replaceMacros($t, [ + '$messages' => [ + 'backtosettings' => DI::l10n()->t('Back to Addon Settings'), + 'title' => DI::l10n()->t('Advanced Content Filter'), + 'add_a_rule' => DI::l10n()->t('Add a Rule'), + 'help' => DI::l10n()->t('Help'), + 'intro' => DI::l10n()->t('Add and manage your personal content filter rules in this screen. Rules have a name and an arbitrary expression that will be matched against post data. For a complete reference of the available operations and variables, check the help page.'), + 'your_rules' => DI::l10n()->t('Your rules'), + 'no_rules' => DI::l10n()->t('You have no rules yet! Start adding one by clicking on the button above next to the title.'), + 'disabled' => DI::l10n()->t('Disabled'), + 'enabled' => DI::l10n()->t('Enabled'), + 'disable_this_rule' => DI::l10n()->t('Disable this rule'), + 'enable_this_rule' => DI::l10n()->t('Enable this rule'), + 'edit_this_rule' => DI::l10n()->t('Edit this rule'), + 'edit_the_rule' => DI::l10n()->t('Edit the rule'), + 'save_this_rule' => DI::l10n()->t('Save this rule'), + 'delete_this_rule' => DI::l10n()->t('Delete this rule'), + 'rule' => DI::l10n()->t('Rule'), + 'close' => DI::l10n()->t('Close'), + 'addtitle' => DI::l10n()->t('Add new rule'), + 'rule_name' => DI::l10n()->t('Rule Name'), + 'rule_expression' => DI::l10n()->t('Rule Expression'), + 'cancel' => DI::l10n()->t('Cancel'), + ], '$current_theme' => $a->getCurrentTheme(), - '$backtosettings' => L10n::t('Back to Addon Settings'), - '$title' => L10n::t('Advanced Content Filter'), - '$add_a_rule' => L10n::t('Add a Rule'), - '$help' => L10n::t('Help'), - '$advanced_content_filter_intro' => L10n::t('Add and manage your personal content filter rules in this screen. Rules have a name and an arbitrary expression that will be matched against post data. For a complete reference of the available operations and variables, check the help page.'), - '$your_rules' => L10n::t('Your rules'), - '$no_rules' => L10n::t('You have no rules yet! Start adding one by clicking on the button above next to the title.'), - '$disabled' => L10n::t('Disabled'), - '$enabled' => L10n::t('Enabled'), - '$disable_this_rule' => L10n::t('Disable this rule'), - '$enable_this_rule' => L10n::t('Enable this rule'), - '$edit_this_rule' => L10n::t('Edit this rule'), - '$edit_the_rule' => L10n::t('Edit the rule'), - '$save_this_rule' => L10n::t('Save this rule'), - '$delete_this_rule' => L10n::t('Delete this rule'), - '$rule' => L10n::t('Rule'), - '$close' => L10n::t('Close'), - '$addtitle' => L10n::t('Add new rule'), - '$rule_name' => L10n::t('Rule Name'), - '$rule_expression' => L10n::t('Rule Expression'), - '$examples' => L10n::t('

Examples:

'), - '$cancel' => L10n::t('Cancel'), '$rules' => advancedcontentfilter_get_rules(), - '$baseurl' => System::baseUrl(true), - '$form_security_token' => get_form_security_token() + '$form_security_token' => BaseModule::getFormSecurityToken() ]); } } @@ -268,6 +282,7 @@ function advancedcontentfilter_build_fields($data) 'event_created', 'event_edited', 'event_start', 'event_finish', 'event_summary', 'event_desc', 'event_location', 'event_type', 'event_nofinish', 'event_adjust', 'event_ignore', 'children', 'pagedrop', 'tags', 'hashtags', 'mentions', + 'attachments', ]; $expressionLanguage = new ExpressionLanguage\ExpressionLanguage(); @@ -296,7 +311,7 @@ function advancedcontentfilter_build_fields($data) function advancedcontentfilter_get_rules() { if (!local_user()) { - throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this method')); + throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this method')); } $rules = DBA::toArray(DBA::select('advancedcontentfilter_rules', [], ['uid' => local_user()])); @@ -307,7 +322,7 @@ function advancedcontentfilter_get_rules() function advancedcontentfilter_get_rules_id(ServerRequestInterface $request, ResponseInterface $response, $args) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this method')); + throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this method')); } $rule = DBA::selectFirst('advancedcontentfilter_rules', [], ['id' => $args['id'], 'uid' => local_user()]); @@ -318,11 +333,11 @@ function advancedcontentfilter_get_rules_id(ServerRequestInterface $request, Res function advancedcontentfilter_post_rules(ServerRequestInterface $request) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this method')); + throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this method')); } - if (!check_form_security_token()) { - throw new HTTPException\BadRequestException(L10n::t('Invalid form security token, please refresh the page.')); + if (!BaseModule::checkFormSecurityToken()) { + throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid form security token, please refresh the page.')); } $data = json_decode($request->getBody(), true); @@ -330,37 +345,39 @@ function advancedcontentfilter_post_rules(ServerRequestInterface $request) try { $fields = advancedcontentfilter_build_fields($data); } catch (Exception $e) { - throw new HTTPException\BadRequestException($e->getMessage(), 0, $e); + throw new HTTPException\BadRequestException($e->getMessage(), $e); } if (empty($fields['name']) || empty($fields['expression'])) { - throw new HTTPException\BadRequestException(L10n::t('The rule name and expression are required.')); + throw new HTTPException\BadRequestException(DI::l10n()->t('The rule name and expression are required.')); } $fields['uid'] = local_user(); $fields['created'] = DateTimeFormat::utcNow(); if (!DBA::insert('advancedcontentfilter_rules', $fields)) { - throw new HTTPException\ServiceUnavaiableException(DBA::errorMessage()); + throw new HTTPException\ServiceUnavailableException(DBA::errorMessage()); } $rule = DBA::selectFirst('advancedcontentfilter_rules', [], ['id' => DBA::lastInsertId()]); - return json_encode(['message' => L10n::t('Rule successfully added'), 'rule' => $rule]); + DI::cache()->delete('rules_' . local_user()); + + return json_encode(['message' => DI::l10n()->t('Rule successfully added'), 'rule' => $rule]); } function advancedcontentfilter_put_rules_id(ServerRequestInterface $request, ResponseInterface $response, $args) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this method')); + throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this method')); } - if (!check_form_security_token()) { - throw new HTTPException\BadRequestException(L10n::t('Invalid form security token, please refresh the page.')); + if (!BaseModule::checkFormSecurityToken()) { + throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid form security token, please refresh the page.')); } if (!DBA::exists('advancedcontentfilter_rules', ['id' => $args['id'], 'uid' => local_user()])) { - throw new HTTPException\NotFoundException(L10n::t('Rule doesn\'t exist or doesn\'t belong to you.')); + throw new HTTPException\NotFoundException(DI::l10n()->t('Rule doesn\'t exist or doesn\'t belong to you.')); } $data = json_decode($request->getBody(), true); @@ -368,65 +385,70 @@ function advancedcontentfilter_put_rules_id(ServerRequestInterface $request, Res try { $fields = advancedcontentfilter_build_fields($data); } catch (Exception $e) { - throw new HTTPException\BadRequestException($e->getMessage(), 0, $e); + throw new HTTPException\BadRequestException($e->getMessage(), $e); } if (!DBA::update('advancedcontentfilter_rules', $fields, ['id' => $args['id']])) { - throw new HTTPException\ServiceUnavaiableException(DBA::errorMessage()); + throw new HTTPException\ServiceUnavailableException(DBA::errorMessage()); } - return json_encode(['message' => L10n::t('Rule successfully updated')]); + DI::cache()->delete('rules_' . local_user()); + + return json_encode(['message' => DI::l10n()->t('Rule successfully updated')]); } function advancedcontentfilter_delete_rules_id(ServerRequestInterface $request, ResponseInterface $response, $args) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this method')); + throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this method')); } - if (!check_form_security_token()) { - throw new HTTPException\BadRequestException(L10n::t('Invalid form security token, please refresh the page.')); + if (!BaseModule::checkFormSecurityToken()) { + throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid form security token, please refresh the page.')); } if (!DBA::exists('advancedcontentfilter_rules', ['id' => $args['id'], 'uid' => local_user()])) { - throw new HTTPException\NotFoundException(L10n::t('Rule doesn\'t exist or doesn\'t belong to you.')); + throw new HTTPException\NotFoundException(DI::l10n()->t('Rule doesn\'t exist or doesn\'t belong to you.')); } if (!DBA::delete('advancedcontentfilter_rules', ['id' => $args['id']])) { - throw new HTTPException\ServiceUnavaiableException(DBA::errorMessage()); + throw new HTTPException\ServiceUnavailableException(DBA::errorMessage()); } - return json_encode(['message' => L10n::t('Rule successfully deleted')]); + DI::cache()->delete('rules_' . local_user()); + + return json_encode(['message' => DI::l10n()->t('Rule successfully deleted')]); } function advancedcontentfilter_get_variables_guid(ServerRequestInterface $request, ResponseInterface $response, $args) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this method')); + throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this method')); } if (!isset($args['guid'])) { - throw new HTTPException\BadRequestException(L10n::t('Missing argument: guid.')); + throw new HTTPException\BadRequestException(DI::l10n()->t('Missing argument: guid.')); } $condition = ["`guid` = ? AND (`uid` = ? OR `uid` = 0)", $args['guid'], local_user()]; $params = ['order' => ['uid' => true]]; - $item = Item::selectFirstForUser(local_user(), [], $condition, $params); + $item = Post::selectFirstForUser(local_user(), [], $condition, $params); if (!DBA::isResult($item)) { - throw new HTTPException\NotFoundException(L10n::t('Unknown post with guid: %s', $args['guid'])); + throw new HTTPException\NotFoundException(DI::l10n()->t('Unknown post with guid: %s', $args['guid'])); } - $tags = Term::populateTagsFromItem($item); + $tags = Tag::populateFromItem($item); $item['tags'] = $tags['tags']; $item['hashtags'] = $tags['hashtags']; $item['mentions'] = $tags['mentions']; - $return = []; - foreach ($item as $key => $value) { - $return[str_replace('-', '_', $key)] = $value; - } + $attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? ''); + + $item['attachments'] = $attachments; + + $return = advancedcontentfilter_get_filter_fields($item); return json_encode(['variables' => str_replace('\\\'', '\'', var_export($return, true))]); }