Compare commits

..

1 Commits

Author SHA1 Message Date
db94693b09 Date filters type reset to text avoiding datepicker showing twice 2025-02-19 22:44:45 +01:00
103 changed files with 638 additions and 548 deletions

34
.env
View File

@ -1,34 +0,0 @@
SECRET="ch4n63m31fy0uc4n"
LOCALE=en
SERVER_NAME="Your wallabag instance"
DOMAIN_NAME=http://127.0.0.1:8000
DATABASE_URL=sqlite:///%kernel.project_dir%/data/db/wallabag.sqlite?charset=utf8
#DATABASE_URL=mysql://root:wallaroot@mariadb:3306/wallabag?charset=utf8mb4
#DATABASE_URL=postgres://wallabag:wallapass@postgres:5432/wallabag?charset=utf8
DATABASE_TABLE_PREFIX=wallabag_
FOSUSER_REGISTRATION=false
FOSUSER_CONFIRMATION=true
FOS_OAUTH_SERVER_ACCESS_TOKEN_LIFETIME=3600
FOS_OAUTH_SERVER_REFRESH_TOKEN_LIFETIME=1209600
TWOFACTOR_SENDER=no-reply@wallabag.org
MAILER_DSN=smtp://127.0.0.1
FROM_EMAIL=wallabag@example.com
RABBITMQ_HOST=rabbitmq
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest
REDIS_SCHEME=tcp
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PATH=
REDIS_PASSWORD=
RABBITMQ_PREFETCH_COUNT=10
SENTRY_DSN=

View File

@ -1,4 +0,0 @@
DATABASE_URL=sqlite:///%kernel.project_dir%/data/db/wallabag_test.sqlite?charset=utf8
#DATABASE_URL=mysql://root:wallaroot@mariadb:3306/wallabag_test?charset=utf8mb4
#DATABASE_URL=postgres://wallabag:wallapass@postgres:5432/wallabag_test?charset=utf8
FOSUSER_REGISTRATION=true

View File

@ -17,7 +17,7 @@ Installation: How did you install wallabag? Using git clone, the docker image, a
PHP version: The version of PHP you are using
OS: The host running wallabag
Database: The storage system your instance is using (SQLite, MySQL/MariaDB or PostgreSQL) with the version
Parameters: Put the content of your environment variables (hide sensitive stuff if you want)
Parameters: Paste the content of your app/config/parameters.yml (hide sensitive stuff if you want)
-->
### Environment
@ -29,37 +29,10 @@ Parameters: Put the content of your environment variables (hide sensitive stuf
* **Parameters**:
<details>
<summary>My environment variables are:</summary>
<summary>My <code>app/config/parameters.yml</code> is:</summary>
```
LOCALE=
# Make sure to hide username and password below, if any
DATABASE_URL=
DATABASE_TABLE_PREFIX=
FOSUSER_REGISTRATION=
FOSUSER_CONFIRMATION=
FOS_OAUTH_SERVER_ACCESS_TOKEN_LIFETIME=
FOS_OAUTH_SERVER_REFRESH_TOKEN_LIFETIME=
TWOFACTOR_SENDER=
# Make sure to hide username and password below, if any
MAILER_DSN=
FROM_EMAIL=
RABBITMQ_HOST=
RABBITMQ_PORT=
REDIS_SCHEME=
REDIS_HOST=
REDIS_PORT=
REDIS_PATH=
RABBITMQ_PREFETCH_COUNT=
# Make sure to hide username and password below, if any
SENTRY_DSN=
PASTE HERE
```
</details>

View File

@ -15,7 +15,7 @@ updates:
patterns:
- "*fontsource*"
ignore:
- dependency-name: "@materializecss/materialize"
- dependency-name: @materializecss/materialize
versions:
- "> 1.2.2"
- package-ecosystem: composer

View File

@ -40,7 +40,7 @@ jobs:
run: |
sudo systemctl start mysql.service
sudo mysql -u root -proot -h 127.0.0.1 -e "CREATE DATABASE wallabag_test"
cp app/config/tests/.env.mysql .env.test.local
cp app/config/tests/parameters_test.mysql.yml app/config/parameters_test.yml
- name: "Install dependencies with Composer"
id: composer-install

View File

@ -89,7 +89,7 @@ jobs:
run: yarn build:dev
- name: "Prepare database configuration"
run: cp app/config/tests/.env.${{ matrix.database }} .env.test.local
run: cp app/config/tests/parameters_test.${{ matrix.database }}.yml app/config/parameters_test.yml
- name: "Run PHPUnit"
run: "php bin/phpunit -v"
@ -140,7 +140,8 @@ jobs:
- name: "Remove database prefix"
run: |
sed -i 's/DATABASE_TABLE_PREFIX=wallabag_/DATABASE_TABLE_PREFIX=/' .env
pip install --user yq
yq -Y --in-place '.parameters.database_table_prefix = ""' app/config/parameters.yml.dist
- name: "Setup MySQL"
if: "${{ matrix.database == 'mysql' }}"
@ -168,7 +169,7 @@ jobs:
run: yarn build:dev
- name: "Prepare database configuration"
run: cp app/config/tests/.env.${{ matrix.database }} .env.test.local
run: cp app/config/tests/parameters_test.${{ matrix.database }}.yml app/config/parameters_test.yml
- name: "Run PHPUnit"
run: "php bin/phpunit -v"
@ -234,7 +235,7 @@ jobs:
run: yarn build:dev
- name: "Prepare database configuration"
run: cp app/config/tests/.env.${{ matrix.database }} .env.test.local
run: cp app/config/tests/parameters_test.${{ matrix.database }}.yml app/config/parameters_test.yml
- name: "Run PHPUnit"
run: "php bin/phpunit -v"

3
.gitignore vendored
View File

@ -17,6 +17,9 @@
phpunit.xml
compose.override.yaml
# Parameters
/app/config/parameters.yml
# Managed by Composer
/vendor/

View File

@ -67,12 +67,6 @@ class AppKernel extends Kernel
public function registerContainerConfiguration(LoaderInterface $loader)
{
if (file_exists($this->getProjectDir() . '/app/config/parameters.yml')) {
$loader->load($this->getProjectDir() . '/app/config/parameters.yml');
@trigger_error('The "app/config/parameters.yml" file is deprecated and will not be supported in a future version. Move your configuration to environment variables and remove the file.', \E_USER_DEPRECATED);
}
$loader->load($this->getProjectDir() . '/app/config/config_' . $this->getEnvironment() . '.yml');
$loader->load(function (ContainerBuilder $container) {
@ -81,12 +75,9 @@ class AppKernel extends Kernel
$container->addObjectResource($this);
});
if (file_exists($this->getProjectDir() . '/app/config/parameters.yml')) {
$loader->load(function (ContainerBuilder $container) {
$this->loadEnvVarsFromParameters($container);
$this->defineDatabaseUrlEnvVar($container);
});
}
$loader->load(function (ContainerBuilder $container) {
$this->processDatabaseParameters($container);
});
}
protected function build(ContainerBuilder $container)
@ -94,45 +85,7 @@ class AppKernel extends Kernel
$container->addCompilerPass(new ImportCompilerPass());
}
private function loadEnvVarsFromParameters(ContainerBuilder $container)
{
$this->setEnvVarFromParameter($container, 'DATABASE_TABLE_PREFIX', 'database_table_prefix');
$this->setEnvVarFromParameter($container, 'DOMAIN_NAME', 'domain_name');
$this->setEnvVarFromParameter($container, 'SERVER_NAME', 'server_name');
$this->setEnvVarFromParameter($container, 'MAILER_DSN', 'mailer_dsn');
$this->setEnvVarFromParameter($container, 'LOCALE', 'locale');
$this->setEnvVarFromParameter($container, 'SECRET', 'secret');
$this->setEnvVarFromParameter($container, 'TWOFACTOR_SENDER', 'twofactor_sender');
$this->setEnvVarFromParameter($container, 'FOSUSER_REGISTRATION', 'fosuser_registration');
$this->setEnvVarFromParameter($container, 'FOSUSER_CONFIRMATION', 'fosuser_confirmation');
$this->setEnvVarFromParameter($container, 'FOS_OAUTH_SERVER_ACCESS_TOKEN_LIFETIME', 'fos_oauth_server_access_token_lifetime');
$this->setEnvVarFromParameter($container, 'FOS_OAUTH_SERVER_REFRESH_TOKEN_LIFETIME', 'fos_oauth_server_refresh_token_lifetime');
$this->setEnvVarFromParameter($container, 'FROM_EMAIL', 'from_email');
$this->setEnvVarFromParameter($container, 'RABBITMQ_HOST', 'rabbitmq_host');
$this->setEnvVarFromParameter($container, 'RABBITMQ_PORT', 'rabbitmq_port');
$this->setEnvVarFromParameter($container, 'RABBITMQ_USER', 'rabbitmq_user');
$this->setEnvVarFromParameter($container, 'RABBITMQ_PASSWORD', 'rabbitmq_password');
$this->setEnvVarFromParameter($container, 'RABBITMQ_PREFETCH_COUNT', 'rabbitmq_prefetch_count');
$this->setEnvVarFromParameter($container, 'REDIS_SCHEME', 'redis_scheme');
$this->setEnvVarFromParameter($container, 'REDIS_HOST', 'redis_host');
$this->setEnvVarFromParameter($container, 'REDIS_PORT', 'redis_port');
$this->setEnvVarFromParameter($container, 'REDIS_PATH', 'redis_path');
$this->setEnvVarFromParameter($container, 'REDIS_PASSWORD', 'redis_password');
$this->setEnvVarFromParameter($container, 'SENTRY_DSN', 'sentry_dsn');
}
private function setEnvVarFromParameter(ContainerBuilder $container, string $envVar, string $parameter)
{
$_ENV[$envVar] = $_SERVER[$envVar] = (string) $container->getParameter($parameter);
$container->setParameter('env(' . $envVar . ')', (string) $container->getParameter($parameter));
}
private function defineDatabaseUrlEnvVar(ContainerBuilder $container)
private function processDatabaseParameters(ContainerBuilder $container)
{
switch ($container->getParameter('database_driver')) {
case 'pdo_mysql':
@ -148,39 +101,15 @@ class AppKernel extends Kernel
throw new RuntimeException('Unsupported database driver: ' . $container->getParameter('database_driver'));
}
$user = $container->getParameter('database_user');
$password = $container->getParameter('database_password');
$host = $container->getParameter('database_host');
$port = $container->getParameter('database_port');
$name = $container->getParameter('database_name');
$container->setParameter('database_scheme', $scheme);
if ('sqlite' === $scheme) {
$name = $container->getParameter('database_path');
$container->setParameter('database_name', $container->getParameter('database_path'));
}
$url = $scheme . '://' . $user . ':' . $password . '@' . $host;
if ($port) {
$url .= ':' . $port;
}
$url .= '/' . $name;
$query = [];
if ($container->getParameter('database_socket')) {
$query['unix_socket'] = $container->getParameter('database_socket');
}
if ($container->getParameter('database_charset')) {
$query['charset'] = $container->getParameter('database_charset');
}
if ([] !== $query) {
$url .= '?' . http_build_query($query);
}
$_ENV['DATABASE_URL'] = $_SERVER['DATABASE_URL'] = $url;
$container->setParameter('env(DATABASE_URL)', $url);
$container->setParameter('database_user', (string) $container->getParameter('database_user'));
$container->setParameter('database_password', (string) $container->getParameter('database_password'));
$container->setParameter('database_port', (string) $container->getParameter('database_port'));
$container->setParameter('database_socket', (string) $container->getParameter('database_socket'));
}
}

View File

@ -1,18 +1,20 @@
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
- { resource: wallabag.yml }
parameters:
craue_config.cache_adapter.class: Craue\ConfigBundle\CacheAdapter\SymfonyCacheComponentAdapter
env(DATABASE_URL): '%database_scheme%://%database_user%:%database_password%@%database_host%:%database_port%/%database_name%?unix_socket=%database_socket%&charset=%database_charset%'
framework:
#esi: ~
translator:
enabled: true
fallback: "%env(LOCALE)%"
fallback: "%locale%"
default_path: '%kernel.project_dir%/translations'
secret: "%env(SECRET)%"
secret: "%secret%"
router:
resource: "%kernel.project_dir%/app/config/routing.yml"
strict_requirements: ~
@ -20,7 +22,7 @@ framework:
csrf_protection: ~
validation:
enable_annotations: true
default_locale: "%env(LOCALE)%"
default_locale: "%locale%"
trusted_hosts: ~
session:
# handler_id set to null will use default session handler from php.ini
@ -30,10 +32,10 @@ framework:
fragments: ~
http_method_override: true
assets:
base_url: '%env(DOMAIN_NAME)%'
base_url: '%domain_name%'
json_manifest_path: '%kernel.project_dir%/web/build/manifest.json'
mailer:
dsn: "%env(MAILER_DSN)%"
dsn: "%mailer_dsn%"
http_client:
scoped_clients:
download_images.client:
@ -58,8 +60,7 @@ twig:
form_themes:
- "@SpiriitFormFilter/Form/form_div_layout.html.twig"
globals:
wallabag_url: '%env(DOMAIN_NAME)%'
registration_enabled: '%env(bool:FOSUSER_REGISTRATION)%'
registration_enabled: '%fosuser_registration%'
# Doctrine Configuration
doctrine:
@ -82,7 +83,7 @@ doctrine:
alias: Wallabag
stof_doctrine_extensions:
default_locale: "%env(LOCALE)%"
default_locale: "%locale%"
translation_fallback: true
orm:
default:
@ -190,9 +191,9 @@ fos_user:
user_class: Wallabag\Entity\User
registration:
confirmation:
enabled: "%env(bool:FOSUSER_CONFIRMATION)%"
enabled: "%fosuser_confirmation%"
from_email:
address: "%env(FROM_EMAIL)%"
address: "%from_email%"
sender_name: wallabag
service:
mailer: Wallabag\Mailer\UserMailer
@ -206,8 +207,8 @@ fos_oauth_server:
service:
user_provider: fos_user.user_provider.username_email
options:
refresh_token_lifetime: "%env(FOS_OAUTH_SERVER_REFRESH_TOKEN_LIFETIME)%"
access_token_lifetime: "%env(FOS_OAUTH_SERVER_ACCESS_TOKEN_LIFETIME)%"
refresh_token_lifetime: "%fos_oauth_server_refresh_token_lifetime%"
access_token_lifetime: "%fos_oauth_server_access_token_lifetime%"
scheb_two_factor:
trusted_device:
@ -220,12 +221,12 @@ scheb_two_factor:
google:
enabled: true
issuer: "%env(SERVER_NAME)%"
issuer: "%server_name%"
template: "Authentication/form.html.twig"
email:
enabled: true
sender_email: "%env(TWOFACTOR_SENDER)%"
sender_email: "%twofactor_sender%"
digits: 6
template: "Authentication/form.html.twig"
mailer: Wallabag\Mailer\AuthCodeMailer
@ -237,10 +238,10 @@ rulerz:
old_sound_rabbit_mq:
connections:
default:
host: "%env(RABBITMQ_HOST)%"
port: "%env(int:RABBITMQ_PORT)%"
user: "%env(RABBITMQ_USER)%"
password: "%env(RABBITMQ_PASSWORD)%"
host: "%rabbitmq_host%"
port: "%rabbitmq_port%"
user: "%rabbitmq_user%"
password: "%rabbitmq_password%"
vhost: /
lazy: true
producers:
@ -318,7 +319,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.pocket'
callback: wallabag.consumer.amqp.pocket
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_readability:
connection: default
exchange_options:
@ -327,7 +328,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.readability'
callback: wallabag.consumer.amqp.readability
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_instapaper:
connection: default
exchange_options:
@ -336,7 +337,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.instapaper'
callback: wallabag.consumer.amqp.instapaper
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_pinboard:
connection: default
exchange_options:
@ -345,7 +346,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.pinboard'
callback: wallabag.consumer.amqp.pinboard
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_delicious:
connection: default
exchange_options:
@ -354,7 +355,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.delicious'
callback: wallabag.consumer.amqp.delicious
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_wallabag_v1:
connection: default
exchange_options:
@ -363,7 +364,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.wallabag_v1'
callback: wallabag.consumer.amqp.wallabag_v1
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_wallabag_v2:
connection: default
exchange_options:
@ -372,7 +373,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.wallabag_v2'
callback: wallabag.consumer.amqp.wallabag_v2
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_elcurator:
connection: default
exchange_options:
@ -381,7 +382,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.elcurator'
callback: wallabag.consumer.amqp.elcurator
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_omnivore:
connection: default
exchange_options:
@ -390,7 +391,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.omnivore'
callback: wallabag.consumer.amqp.omnivore
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_firefox:
connection: default
exchange_options:
@ -399,7 +400,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.firefox'
callback: wallabag.consumer.amqp.firefox
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_chrome:
connection: default
exchange_options:
@ -408,7 +409,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.chrome'
callback: wallabag.consumer.amqp.chrome
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_shaarli:
connection: default
exchange_options:
@ -417,7 +418,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.shaarli'
callback: wallabag.consumer.amqp.shaarli
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_pocket_html:
connection: default
exchange_options:
@ -426,7 +427,7 @@ old_sound_rabbit_mq:
queue_options:
name: 'wallabag.import.pocket_html'
callback: wallabag.consumer.amqp.pocket_html
qos_options: {prefetch_count: "%env(int:RABBITMQ_PREFETCH_COUNT)%"}
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
fos_js_routing:
routes_to_expose:

View File

@ -21,4 +21,4 @@ monolog:
type: console
sentry:
dsn: "%env(SENTRY_DSN)%"
dsn: "%sentry_dsn%"

View File

@ -1,11 +1,11 @@
imports:
- { resource: config_dev.yml }
- { resource: parameters_test.yml }
- { resource: services_test.yml }
parameters:
fosuser_registration: '%env(FOSUSER_REGISTRATION)%'
database_url: '%env(resolve:DATABASE_URL)%'
domain_name: '%env(DOMAIN_NAME)%'
fosuser_registration: true
wallabag_dbname_suffix: '_test'
framework:
test: ~
@ -24,6 +24,7 @@ web_profiler:
doctrine:
dbal:
dbname_suffix: '%wallabag_dbname_suffix%' # for MySQL and PostgreSQL
use_savepoints: true
orm:

View File

@ -0,0 +1,67 @@
# This file is a "template" of what your parameters.yml file should look like
parameters:
# Uncomment these settings or manually update your parameters.yml
# to use Docker Compose
#
# database_driver: %env.database_driver%
# database_host: %env.database_host%
# database_port: %env.database_port%
# database_name: %env.database_name%
# database_user: %env.database_user%
# database_password: %env.database_password%
database_driver: pdo_mysql
database_host: 127.0.0.1
database_port: ~
database_name: wallabag
database_user: root
database_password: ~
# For SQLite, database_path should be "%kernel.project_dir%/data/db/wallabag.sqlite"
database_path: null
database_table_prefix: wallabag_
database_socket: null
# with PostgreSQL and SQLite, you must set "utf8"
database_charset: utf8mb4
domain_name: https://your-wallabag-instance.wallabag.org
server_name: "Your wallabag instance"
mailer_dsn: smtp://127.0.0.1
locale: en
# A secret key that's used to generate certain security-related tokens
secret: CHANGE_ME_TO_SOMETHING_SECRET_AND_RANDOM
# two factor stuff
twofactor_sender: no-reply@wallabag.org
# fosuser stuff
fosuser_registration: false
fosuser_confirmation: true
# how long the access token should live in seconds for the API
fos_oauth_server_access_token_lifetime: 3600
# how long the refresh token should life in seconds for the API
fos_oauth_server_refresh_token_lifetime: 1209600
from_email: no-reply@wallabag.org
rss_limit: 50
# RabbitMQ processing
rabbitmq_host: localhost
rabbitmq_port: 5672
rabbitmq_user: guest
rabbitmq_password: guest
rabbitmq_prefetch_count: 10
# Redis processing
redis_scheme: tcp
redis_host: localhost
redis_port: 6379
redis_path: null
redis_password: null
# sentry logging
sentry_dsn: ~

View File

@ -0,0 +1,2 @@
parameters:
database_path: "%kernel.project_dir%/data/db/wallabag%wallabag_dbname_suffix%.sqlite"

View File

@ -45,7 +45,7 @@ security:
anonymous: true
remember_me:
secret: "%env(SECRET)%"
secret: "%secret%"
lifetime: 31536000
path: /
domain: ~

View File

@ -15,15 +15,15 @@ services:
$projectDir: '%kernel.project_dir%'
$debug: '%kernel.debug%'
$defaultLocale: '%kernel.default_locale%'
$wallabagUrl: '%env(DOMAIN_NAME)%'
$tablePrefix: "%env(DATABASE_TABLE_PREFIX)%"
$wallabagUrl: '%domain_name%'
$tablePrefix: "%database_table_prefix%"
$encryptionKeyPath: "%wallabag.site_credentials.encryption_key_path%"
$fetchingErrorMessageTitle: "%wallabag.fetching_error_message_title%"
$fetchingErrorMessage: '%wallabag.fetching_error_message%'
$languages: '%wallabag.languages%'
$lifeTime: '%wallabag.cache_lifetime%'
$logoPath: 'web/img/appicon/apple-touch-icon-152.png'
$registrationEnabled: '%env(bool:FOSUSER_REGISTRATION)%'
$registrationEnabled: '%fosuser_registration%'
$restrictedAccess: '@=service(''craue_config'').get(''restricted_access'')'
$senderEmail: "%scheb_two_factor.email.sender_email%"
$senderName: "%scheb_two_factor.email.sender_name%"
@ -187,7 +187,7 @@ services:
Wallabag\Event\Subscriber\SchemaAdapterSubscriber:
arguments:
$databaseTablePrefix: "%env(DATABASE_TABLE_PREFIX)%"
$databaseTablePrefix: "%database_table_prefix%"
tags:
- { name: doctrine.event_subscriber }
@ -249,11 +249,11 @@ services:
Predis\Client:
arguments:
$parameters:
scheme: '%env(REDIS_SCHEME)%'
host: '%env(REDIS_HOST)%'
port: '%env(int:REDIS_PORT)%'
path: '%env(REDIS_PATH)%'
password: '%env(REDIS_PASSWORD)%'
scheme: '%redis_scheme%'
host: '%redis_host%'
port: '%redis_port%'
path: '%redis_path%'
password: '%redis_password%'
Wallabag\Event\Subscriber\SQLiteCascadeDeleteSubscriber:
tags:
@ -269,7 +269,7 @@ services:
Wallabag\Command\InstallCommand:
arguments:
$databaseUrl: '%env(DATABASE_URL)%'
$databaseDriver: '%database_driver%'
$defaultSettings: '%wallabag.default_internal_settings%'
$defaultIgnoreOriginInstanceRules: '%wallabag.default_ignore_origin_instance_rules%'

View File

@ -1 +0,0 @@
DATABASE_URL=mysql://root:root@127.0.0.1:3306/wallabag?charset=utf8mb4

View File

@ -1 +0,0 @@
DATABASE_URL=postgres://wallabag:wallabagrocks@localhost/wallabag?charset=utf8

View File

@ -1 +0,0 @@
DATABASE_URL=sqlite:///%kernel.project_dir%/data/db/wallabag.sqlite?charset=utf8

View File

@ -0,0 +1,2 @@
parameters:
env(DATABASE_URL): mysql://root:root@127.0.0.1:3306/wallabag?charset=utf8mb4

View File

@ -0,0 +1,2 @@
parameters:
env(DATABASE_URL): postgres://wallabag:wallabagrocks@localhost/wallabag?charset=utf8

View File

@ -0,0 +1,2 @@
parameters:
env(DATABASE_URL): sqlite:///%kernel.project_dir%/data/db/wallabag%wallabag_dbname_suffix%.sqlite?charset=utf8

View File

@ -25,7 +25,7 @@ parameters:
el: 'Ελληνικά'
gl: 'Galego'
wallabag.items_on_page: 12
wallabag.language: '%env(LOCALE)%'
wallabag.language: '%locale%'
wallabag.feed_limit: 50
wallabag.reading_speed: 200
wallabag.cache_lifetime: 10

View File

@ -279,6 +279,14 @@ $(document).ready(() => {
$('.collapsible[data-collapsible="expandable"]').collapsible({
accordion: false,
});
$('.datepicker').datepicker({
selectMonths: true,
selectYears: 15,
formatSubmit: 'yyyy-mm-dd',
hiddenName: false,
format: 'yyyy-mm-dd',
container: 'body',
});
$('.dropdown-trigger').dropdown({ hover: false });
$('.dropdown-trigger[data-covertrigger="false"][data-constrainwidth="false"]').dropdown({

View File

@ -3,40 +3,25 @@
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\ErrorHandler\Debug;
if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL;
}
// if you don't want to setup permissions the proper way, just uncomment the following PHP line
// read https://symfony.com/doc/current/setup.html#checking-symfony-application-configuration-and-setup
// for more information
//umask(0000);
set_time_limit(0);
require dirname(__DIR__).'/vendor/autoload.php';
if (!class_exists(Application::class) || !class_exists(Dotenv::class)) {
throw new LogicException('You need to add "symfony/framework-bundle" and "symfony/dotenv" as Composer dependencies.');
}
require __DIR__.'/../vendor/autoload.php';
$input = new ArgvInput();
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) {
putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env);
$env = $input->getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev', true);
$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption('--no-debug', true) && $env !== 'prod';
if ($debug) {
Debug::enable();
}
if ($input->hasParameterOption('--no-debug', true)) {
putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0');
}
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
if ($_SERVER['APP_DEBUG']) {
umask(0000);
if (class_exists(Debug::class)) {
Debug::enable();
}
}
$kernel = new AppKernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run($input);

View File

@ -21,6 +21,7 @@ $config
'ergebnis/composer-normalize',
'friendsofphp/php-cs-fixer',
'friendsoftwig/twigcs',
'incenteev/composer-parameter-handler',
'j0k3r/graby-site-config',
'laminas/laminas-code',
'lcobucci/jwt',

View File

@ -77,6 +77,7 @@
"friendsofsymfony/user-bundle": "^3.2.1",
"guzzlehttp/psr7": "^2.6.2",
"html2text/html2text": "^4.3.1",
"incenteev/composer-parameter-handler": "^2.2",
"j0k3r/graby": "^2.4.5",
"j0k3r/graby-site-config": "^1.0",
"javibravo/simpleue": "^2.1",
@ -121,7 +122,6 @@
"symfony/dependency-injection": "^5.4.35",
"symfony/doctrine-bridge": "^5.4.35",
"symfony/dom-crawler": "^5.4.35",
"symfony/dotenv": "^5.4.35",
"symfony/error-handler": "^5.4.35",
"symfony/event-dispatcher": "^5.4.35",
"symfony/event-dispatcher-contracts": "^2.5.2",
@ -222,6 +222,9 @@
"sort-packages": true
},
"extra": {
"incenteev-parameters": {
"file": "app/config/parameters.yml"
},
"public-dir": "web",
"symfony": {
"allow-contrib": true,
@ -236,6 +239,7 @@
"@post-cmd"
],
"post-cmd": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"bin/console cache:clear --no-warmup",
"bin/console assets:install web --symlink --relative"
]

175
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "14496bc12cd56950bd548fb244a8c769",
"content-hash": "a85056bec7fa90b9be4aa16c34464c0e",
"packages": [
{
"name": "babdev/pagerfanta-bundle",
@ -4159,6 +4159,63 @@
},
"time": "2021-07-21T13:50:14+00:00"
},
{
"name": "incenteev/composer-parameter-handler",
"version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/Incenteev/ParameterHandler.git",
"reference": "90bffce926e96b365579a2ef024aab457f4b80c5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/90bffce926e96b365579a2ef024aab457f4b80c5",
"reference": "90bffce926e96b365579a2ef024aab457f4b80c5",
"shasum": ""
},
"require": {
"php": ">=7.4",
"symfony/yaml": "^5.4 || ^6.0 || ^7.0"
},
"require-dev": {
"composer/composer": "^2.0@dev",
"phpspec/prophecy-phpunit": "^2.1",
"phpunit/phpunit": "^9.6",
"symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
"symfony/phpunit-bridge": "^6.4.1 || ^7.0.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"Incenteev\\ParameterHandler\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christophe Coevoet",
"email": "stof@notk.org"
}
],
"description": "Composer script handling your ignored parameter file",
"homepage": "https://github.com/Incenteev/ParameterHandler",
"keywords": [
"parameters management"
],
"support": {
"issues": "https://github.com/Incenteev/ParameterHandler/issues",
"source": "https://github.com/Incenteev/ParameterHandler/tree/v2.2.0"
},
"time": "2023-12-09T10:31:14+00:00"
},
{
"name": "j0k3r/graby",
"version": "2.4.5",
@ -5980,16 +6037,16 @@
},
{
"name": "php-amqplib/php-amqplib",
"version": "v3.7.3",
"version": "v3.7.2",
"source": {
"type": "git",
"url": "https://github.com/php-amqplib/php-amqplib.git",
"reference": "9f50fe69a9f1a19e2cb25596a354d705de36fe59"
"reference": "738a73eb0019b6c99d9bc25d7a0c0dd8f56a5199"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/9f50fe69a9f1a19e2cb25596a354d705de36fe59",
"reference": "9f50fe69a9f1a19e2cb25596a354d705de36fe59",
"url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/738a73eb0019b6c99d9bc25d7a0c0dd8f56a5199",
"reference": "738a73eb0019b6c99d9bc25d7a0c0dd8f56a5199",
"shasum": ""
},
"require": {
@ -6055,9 +6112,9 @@
],
"support": {
"issues": "https://github.com/php-amqplib/php-amqplib/issues",
"source": "https://github.com/php-amqplib/php-amqplib/tree/v3.7.3"
"source": "https://github.com/php-amqplib/php-amqplib/tree/v3.7.2"
},
"time": "2025-02-18T20:11:13+00:00"
"time": "2024-11-21T09:21:41+00:00"
},
{
"name": "php-amqplib/rabbitmq-bundle",
@ -9512,77 +9569,6 @@
],
"time": "2024-10-22T13:05:35+00:00"
},
{
"name": "symfony/dotenv",
"version": "v5.4.48",
"source": {
"type": "git",
"url": "https://github.com/symfony/dotenv.git",
"reference": "08013403089c8a126c968179179b817a552841ab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/08013403089c8a126c968179179b817a552841ab",
"reference": "08013403089c8a126c968179179b817a552841ab",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3"
},
"require-dev": {
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Dotenv\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Registers environment variables from a .env file",
"homepage": "https://symfony.com",
"keywords": [
"dotenv",
"env",
"environment"
],
"support": {
"source": "https://github.com/symfony/dotenv/tree/v5.4.48"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-11-27T09:33:00+00:00"
},
{
"name": "symfony/error-handler",
"version": "v5.4.46",
@ -16311,16 +16297,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.69.1",
"version": "v3.69.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "13b0c0eede38c11cd674b080f2b485d0f14ffa9f"
"reference": "630a59448c00729bc235d5e95cfedefeaca37523"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/13b0c0eede38c11cd674b080f2b485d0f14ffa9f",
"reference": "13b0c0eede38c11cd674b080f2b485d0f14ffa9f",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/630a59448c00729bc235d5e95cfedefeaca37523",
"reference": "630a59448c00729bc235d5e95cfedefeaca37523",
"shasum": ""
},
"require": {
@ -16402,7 +16388,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.69.1"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.69.0"
},
"funding": [
{
@ -16410,7 +16396,7 @@
"type": "github"
}
],
"time": "2025-02-18T23:57:43+00:00"
"time": "2025-02-14T16:19:23+00:00"
},
{
"name": "friendsoftwig/twigcs",
@ -18092,24 +18078,23 @@
},
{
"name": "react/promise",
"version": "v3.2.0",
"version": "v2.11.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise.git",
"reference": "8a164643313c71354582dc850b42b33fa12a4b63"
"reference": "1a8460931ea36dc5c76838fec5734d55c88c6831"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
"reference": "8a164643313c71354582dc850b42b33fa12a4b63",
"url": "https://api.github.com/repos/reactphp/promise/zipball/1a8460931ea36dc5c76838fec5734d55c88c6831",
"reference": "1a8460931ea36dc5c76838fec5734d55c88c6831",
"shasum": ""
},
"require": {
"php": ">=7.1.0"
"php": ">=5.4.0"
},
"require-dev": {
"phpstan/phpstan": "1.10.39 || 1.4.10",
"phpunit/phpunit": "^9.6 || ^7.5"
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
@ -18153,7 +18138,7 @@
],
"support": {
"issues": "https://github.com/reactphp/promise/issues",
"source": "https://github.com/reactphp/promise/tree/v3.2.0"
"source": "https://github.com/reactphp/promise/tree/v2.11.0"
},
"funding": [
{
@ -18161,7 +18146,7 @@
"type": "open_collective"
}
],
"time": "2024-05-24T10:39:05+00:00"
"time": "2023-11-16T16:16:50+00:00"
},
{
"name": "react/socket",
@ -19965,9 +19950,9 @@
"ext-tokenizer": "*",
"ext-xml": "*"
},
"platform-dev": [],
"platform-dev": {},
"platform-overrides": {
"php": "7.4.29"
},
"plugin-api-version": "2.3.0"
"plugin-api-version": "2.6.0"
}

View File

@ -1,2 +1,9 @@
MYSQL_ROOT_PASSWORD=wallaroot
MYSQL_DATABASE=wallabag
DATABASE_DRIVER=pdo_mysql
DATABASE_HOST=mariadb
DATABASE_PORT=3306
DATABASE_NAME=wallabag
DATABASE_USER=root
DATABASE_PASSWORD=wallaroot
DATABASE_CHARSET=utf8mb4

View File

@ -0,0 +1,52 @@
parameters:
database_driver: ${DATABASE_DRIVER:-pdo_sqlite}
database_host: ${DATABASE_HOST:-127.0.0.1}
database_port: ${DATABASE_PORT:-~}
database_name: ${DATABASE_NAME:-symfony}
database_user: ${DATABASE_USER:-root}
database_password: ${DATABASE_PASSWORD:-~}
database_path: ${DATABASE_PATH:-"%kernel.project_dir%/data/db/wallabag.sqlite"}
database_table_prefix: ${DATABASE_TABLE_PREFIX:-wallabag_}
database_socket: null
database_charset: ${DATABASE_CHARSET:-utf8}
domain_name: ${DOMAIN_NAME:-https://www.example.com}
server_name: ${SERVER_NAME:-"Your wallabag instance"}
mailer_dsn: ${MAILER_DSN:-"smtp://127.0.0.1"}
locale: ${LOCALE:-en}
# A secret key that's used to generate certain security-related tokens
secret: ${SECRET:-~}
# two factor stuff
twofactor_sender: ${TWOFACTOR_SENDER:-no-reply@wallabag.org}
# fosuser stuff
fosuser_registration: ${FOSUSER_REGISTRATION:-false}
fosuser_confirmation: ${FOSUSER_CONFIRMATION:-true}
fos_oauth_server_access_token_lifetime: 3600
fos_oauth_server_refresh_token_lifetime: 1209600
from_email: ${FROM_EMAIL:-wallabag@example.com}
rss_limit: 50
# RabbitMQ processing
rabbitmq_host: ${RABBITMQ_HOST:-rabbitmq}
rabbitmq_port: ${RABBITMQ_PORT:-5672}
rabbitmq_user: ${RABBITMQ_USER:-guest}
rabbitmq_password: ${RABBITMQ_PASSWORD:-guest}
rabbitmq_prefetch_count: 10
# Redis processing
redis_scheme: ${REDIS_SCHEME:-tcp}
redis_host: ${REDIS_HOST:-redis}
redis_port: ${REDIS_PORT:-6379}
redis_path: ${REDIS_PATH:-~}
redis_password: ${REDIS_PASSWORD:-~}
# Sentry
sentry_dsn: ${SENTRY_DSN:-~}

View File

@ -1,5 +1,6 @@
#!/bin/sh
envsubst < /opt/wallabag/config/wallabag-php.ini > /usr/local/etc/php/conf.d/wallabag-php.ini
envsubst < /opt/wallabag/config/parameters.yml > /var/www/html/app/config/parameters.yml
exec "$@"

View File

@ -1,3 +1,12 @@
DATABASE_DRIVER=pdo_sqlite
DATABASE_HOST=127.0.0.1
DATABASE_PORT=~
DATABASE_NAME=symfony
DATABASE_USER=root
DATABASE_PASSWORD=~
DATABASE_PATH='"%kernel.project_dir%/data/db/wallabag.sqlite"'
DOMAIN_NAME=http://localhost:8000
SECRET=ch4n63m31fy0uc4n
PHP_SESSION_SAVE_PATH=tcp://redis:6379?database=2
PHP_SESSION_HANDLER=redis
TRUSTED_PROXIES=0.0.0.0/0

View File

@ -1,3 +1,10 @@
POSTGRES_USER=wallabag
POSTGRES_PASSWORD=wallapass
POSTGRES_DB=wallabag
DATABASE_HOST=postgres
DATABASE_PORT=5432
DATABASE_NAME=wallabag
DATABASE_USER=wallabag
DATABASE_PASSWORD=wallapass
DATABASE_DRIVER=pdo_pgsql
DATABASE_PATH=null

View File

@ -44,7 +44,7 @@
"@babel/core": "^7.26.9",
"@babel/eslint-parser": "^7.26.8",
"@babel/preset-env": "^7.26.9",
"@symfony/webpack-encore": "^5.1.0",
"@symfony/webpack-encore": "^5.0.1",
"autoprefixer": "^10.4.20",
"babel-loader": "^9.2.1",
"core-js": "^3.23.0",
@ -56,7 +56,7 @@
"file-loader": "^6.2.0",
"lato-font": "^3.0.0",
"mini-css-extract-plugin": "^2.9.2",
"postcss": "^8.5.3",
"postcss": "^8.5.2",
"postcss-loader": "^8.1.1",
"postcss-scss": "^4.0.9",
"regenerator-runtime": "^0.14.1",

View File

@ -6,8 +6,6 @@ parameters:
paths:
- src
- tests
bootstrapFiles:
- tests/phpstan-bootstrap.php
symfony:
container_xml_path: %rootDir%/../../../var/cache/dev/AppKernelDevDebugContainer.xml

View File

@ -19,7 +19,7 @@
<php>
<ini name="error_reporting" value="-1"/>
<server name="KERNEL_CLASS" value="AppKernel"/>
<server name="APP_ENV" value="test" force="true"/>
<server name="APP_ENV" value="test"/>
<server name="APP_DEBUG" value="0"/>
<env name="SYMFONY_DEPRECATIONS_HELPER" value="weak"/>
</php>

View File

@ -7,7 +7,6 @@ use Doctrine\DBAL\Exception\DriverException;
use Doctrine\DBAL\Platforms\MySQLPlatform;
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Tools\DsnParser;
use Doctrine\Migrations\Metadata\Storage\TableMetadataStorageConfiguration;
use Doctrine\ORM\EntityManagerInterface;
use FOS\UserBundle\Event\UserEvent;
@ -42,17 +41,17 @@ class InstallCommand extends Command
private EventDispatcherInterface $dispatcher;
private UserManagerInterface $userManager;
private TableMetadataStorageConfiguration $tableMetadataStorageConfiguration;
private string $databaseUrl;
private string $databaseDriver;
private array $defaultSettings;
private array $defaultIgnoreOriginInstanceRules;
public function __construct(EntityManagerInterface $entityManager, EventDispatcherInterface $dispatcher, UserManagerInterface $userManager, TableMetadataStorageConfiguration $tableMetadataStorageConfiguration, string $databaseUrl, array $defaultSettings, array $defaultIgnoreOriginInstanceRules)
public function __construct(EntityManagerInterface $entityManager, EventDispatcherInterface $dispatcher, UserManagerInterface $userManager, TableMetadataStorageConfiguration $tableMetadataStorageConfiguration, string $databaseDriver, array $defaultSettings, array $defaultIgnoreOriginInstanceRules)
{
$this->entityManager = $entityManager;
$this->dispatcher = $dispatcher;
$this->userManager = $userManager;
$this->tableMetadataStorageConfiguration = $tableMetadataStorageConfiguration;
$this->databaseUrl = $databaseUrl;
$this->databaseDriver = $databaseDriver;
$this->defaultSettings = $defaultSettings;
$this->defaultIgnoreOriginInstanceRules = $defaultIgnoreOriginInstanceRules;
@ -104,24 +103,13 @@ class InstallCommand extends Command
$status = '<info>OK!</info>';
$help = '';
/** @see \Doctrine\DBAL\DriverManager::$driverSchemeAliases */
$params = (new DsnParser([
'mysql' => 'pdo_mysql',
'mysql2' => 'pdo_mysql', // Amazon RDS, for some weird reason
'postgres' => 'pdo_pgsql',
'postgresql' => 'pdo_pgsql',
'pgsql' => 'pdo_pgsql',
'sqlite' => 'pdo_sqlite',
'sqlite3' => 'pdo_sqlite',
]))->parse($this->databaseUrl);
if (!\extension_loaded($params['driver'])) {
if (!\extension_loaded($this->databaseDriver)) {
$fulfilled = false;
$status = '<error>ERROR!</error>';
$help = 'Database driver "' . $params['driver'] . '" is not installed.';
$help = 'Database driver "' . $this->databaseDriver . '" is not installed.';
}
$rows[] = [\sprintf($label, $params['driver']), $status, $help];
$rows[] = [\sprintf($label, $this->databaseDriver), $status, $help];
// testing if connection to the database can be established
$label = '<comment>Database connection</comment>';

View File

@ -103,6 +103,8 @@ class DeveloperController extends AbstractController
*/
public function howtoFirstAppAction()
{
return $this->render('Developer/howto_app.html.twig');
return $this->render('Developer/howto_app.html.twig', [
'wallabag_url' => $this->getParameter('domain_name'),
]);
}
}

View File

@ -104,7 +104,7 @@ class UserRestController extends WallabagRestController
*/
public function putUserAction(Request $request, Config $craueConfig, UserManagerInterface $userManager, EntityManagerInterface $entityManager, EventDispatcherInterface $eventDispatcher)
{
if (!$this->registrationEnabled || !$craueConfig->get('api_user_registration')) {
if (!$this->getParameter('fosuser_registration') || !$craueConfig->get('api_user_registration')) {
$json = $this->serializer->serialize(['error' => "Server doesn't allow registrations"], 'json');
return (new JsonResponse())

View File

@ -26,16 +26,14 @@ class WallabagRestController extends AbstractFOSRestController
protected AuthorizationCheckerInterface $authorizationChecker;
protected TokenStorageInterface $tokenStorage;
protected TranslatorInterface $translator;
protected bool $registrationEnabled;
public function __construct(EntityManagerInterface $entityManager, SerializerInterface $serializer, AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage, TranslatorInterface $translator, bool $registrationEnabled)
public function __construct(EntityManagerInterface $entityManager, SerializerInterface $serializer, AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage, TranslatorInterface $translator)
{
$this->entityManager = $entityManager;
$this->serializer = $serializer;
$this->authorizationChecker = $authorizationChecker;
$this->tokenStorage = $tokenStorage;
$this->translator = $translator;
$this->registrationEnabled = $registrationEnabled;
}
/**
@ -88,7 +86,7 @@ class WallabagRestController extends AbstractFOSRestController
{
$info = new ApplicationInfo(
$this->getParameter('wallabag.version'),
$this->registrationEnabled && $craueConfig->get('api_user_registration'),
$this->getParameter('fosuser_registration') && $craueConfig->get('api_user_registration'),
);
return (new JsonResponse())->setJson($this->serializer->serialize($info, 'json'));

View File

@ -257,6 +257,7 @@ class ConfigController extends AbstractController
'username' => $user->getUsername(),
'token' => $config->getFeedToken(),
],
'wallabag_url' => $this->getParameter('domain_name'),
'enabled_users' => $userRepository->getSumEnabledUsers(),
]);
}

View File

@ -150,6 +150,7 @@ class FeedController extends AbstractController
'url' => $url,
'entries' => $entries,
'user' => $user->getUsername(),
'domainName' => $this->getParameter('domain_name'),
'version' => $this->getParameter('wallabag.version'),
'tag' => $tag->getSlug(),
'updated' => $this->prepareFeedUpdatedDate($entries, $sort),
@ -230,6 +231,7 @@ class FeedController extends AbstractController
'url' => $url,
'entries' => $entries,
'user' => $user->getUsername(),
'domainName' => $this->getParameter('domain_name'),
'version' => $this->getParameter('wallabag.version'),
'updated' => $this->prepareFeedUpdatedDate($entries),
], new Response('', 200, ['Content-Type' => 'application/atom+xml']));

View File

@ -50,18 +50,27 @@ class AuthCodeMailer implements AuthCodeMailerInterface
*/
private $supportUrl;
/**
* Url for the wallabag instance (only used for image in the HTML email template).
*
* @var string
*/
private $wallabagUrl;
/**
* @param string $senderEmail
* @param string $senderName
* @param string $supportUrl wallabag support url
* @param string $wallabagUrl wallabag instance url
*/
public function __construct(MailerInterface $mailer, Environment $twig, $senderEmail, $senderName, $supportUrl)
public function __construct(MailerInterface $mailer, Environment $twig, $senderEmail, $senderName, $supportUrl, $wallabagUrl)
{
$this->mailer = $mailer;
$this->twig = $twig;
$this->senderEmail = $senderEmail;
$this->senderName = $senderName;
$this->supportUrl = $supportUrl;
$this->wallabagUrl = $wallabagUrl;
}
/**
@ -76,6 +85,7 @@ class AuthCodeMailer implements AuthCodeMailerInterface
'user' => $user->getName(),
'code' => $user->getEmailAuthCode(),
'support_url' => $this->supportUrl,
'wallabag_url' => $this->wallabagUrl,
]);
$bodyText = $template->renderBlock('body_text', [
'user' => $user->getName(),

View File

@ -85,7 +85,6 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder
'notLoggedInXpath' => $config->not_logged_in_xpath ?: null,
'username' => $credentials['username'],
'password' => $credentials['password'],
'httpHeaders' => $config->http_header,
];
$config = new SiteConfig($parameters);

View File

@ -30,7 +30,7 @@ class LoginFormAuthenticator
$siteConfig->getPasswordField() => $siteConfig->getPassword(),
] + $this->getExtraFields($siteConfig);
$this->browser->request('POST', $siteConfig->getLoginUri(), $postFields, [], $this->getHttpHeaders($siteConfig));
$this->browser->request('POST', $siteConfig->getLoginUri(), $postFields);
return $this;
}
@ -73,20 +73,6 @@ class LoginFormAuthenticator
return \count($loggedIn) > 0;
}
/**
* Processes http_header(*) config, prepending HTTP_ string to the header's name.
* See : https://github.com/symfony/browser-kit/blob/5.4/AbstractBrowser.php#L349.
*/
protected function getHttpHeaders(SiteConfig $siteConfig): array
{
$headers = [];
foreach ($siteConfig->getHttpHeaders() as $headerName => $headerValue) {
$headers["HTTP_$headerName"] = $headerValue;
}
return $headers;
}
/**
* Returns extra fields from the configuration.
* Evaluates any field value that is an expression language string.

View File

@ -70,13 +70,6 @@ class SiteConfig
*/
protected $password;
/**
* Associative array of HTTP headers to send with the form.
*
* @var array
*/
protected $httpHeaders = [];
/**
* SiteConfig constructor. Sets the properties by name given a hash.
*
@ -267,16 +260,4 @@ class SiteConfig
return $this;
}
public function getHttpHeaders(): array
{
return $this->httpHeaders;
}
public function setHttpHeaders(array $httpHeaders): self
{
$this->httpHeaders = $httpHeaders;
return $this;
}
}

View File

@ -3,10 +3,10 @@
{% if type != 'tag' %}
<title>wallabag — {{ type }} feed</title>
<subtitle type="html">Atom feed for {{ type }} entries</subtitle>
<id>wallabag:{{ wallabag_url|removeScheme|removeWww }}:{{ user }}:{{ type }}</id>
<id>wallabag:{{ domainName|removeScheme|removeWww }}:{{ user }}:{{ type }}</id>
<link rel="alternate" type="text/html" href="{{ url(type) }}"/>
{% else %}
<id>wallabag:{{ wallabag_url|removeScheme|removeWww }}:{{ user }}:{{ type }}:{{ tag }}</id>
<id>wallabag:{{ domainName|removeScheme|removeWww }}:{{ user }}:{{ type }}:{{ tag }}</id>
<link rel="alternate" type="text/html" href="{{ url('tag_entries', {'slug': tag}) }}"/>
<title>wallabag — {{ type }} {{ tag }} feed</title>
<subtitle type="html">Atom feed for entries tagged with {{ tag }}</subtitle>
@ -34,7 +34,7 @@
<link rel="alternate" href="{{ entry.url }}"/>
<link rel="via" type="text/html"
href="{{ url('view', {'id': entry.id}) }}"/>
<id>wallabag:{{ wallabag_url|removeScheme|removeWww }}:{{ user }}:entry:{{ entry.id }}</id>
<id>wallabag:{{ domainName|removeScheme|removeWww }}:{{ user }}:entry:{{ entry.id }}</id>
<updated>{{ entry.updatedAt|date('c') }}</updated>
<published>{{ entry.createdAt|date('c') }}</published>
{% for tag in entry.tags %}

View File

@ -100,6 +100,7 @@
<tr><td>hoa/visitor</td><td>BSD-3-Clause</td></tr>
<tr><td>hoa/zformat</td><td>BSD-3-Clause</td></tr>
<tr><td>htmlawed/htmlawed</td><td>GPL-2.0+ or LGPL-3.0</td></tr>
<tr><td>incenteev/composer-parameter-handler</td><td>MIT</td></tr>
<tr><td>j0k3r/graby</td><td>MIT</td></tr>
<tr><td>j0k3r/graby-site-config</td><td>Public domain</td></tr>
<tr><td>j0k3r/php-readability</td><td>Apache-2.0</td></tr>

View File

@ -19,8 +19,6 @@ use Wallabag\Command\InstallCommand;
class InstallCommandTest extends WallabagTestCase
{
private string $originalDatabaseUrl;
public static function setUpBeforeClass(): void
{
// disable doctrine-test-bundle
@ -40,28 +38,22 @@ class InstallCommandTest extends WallabagTestCase
/** @var Connection $connection */
$connection = $this->getTestClient()->getContainer()->get(ManagerRegistry::class)->getConnection();
$this->originalDatabaseUrl = $this->getTestClient()->getContainer()->getParameter('database_url');
$tmpDatabaseName = 'wallabag_test_' . bin2hex(random_bytes(5));
$originalDatabaseUrl = $this->getTestClient()->getContainer()->getParameter('env(DATABASE_URL)');
$dbnameSuffix = $this->getTestClient()->getContainer()->getParameter('wallabag_dbname_suffix');
$tmpDatabaseName = 'wallabag_' . bin2hex(random_bytes(5));
if ($connection->getDatabasePlatform() instanceof SqlitePlatform) {
$tmpDatabaseName = $this->getTestClient()->getContainer()->getParameter('kernel.project_dir') . '/data/db/' . $tmpDatabaseName . '.sqlite';
/** @see \Doctrine\DBAL\Tools\DsnParser::parse */
$url = preg_replace('#^((?:pdo-)?sqlite3?):///#', '$1://localhost/', $this->originalDatabaseUrl);
$tmpDatabaseUrl = (string) (new Uri($url))->withPath($tmpDatabaseName);
// Add back the leading "/" that was removed by withPath, and remove the "localhost" part
$tmpDatabaseUrl = str_replace('//localhost', '///', $tmpDatabaseUrl);
$tmpDatabaseUrl = str_replace('wallabag' . $dbnameSuffix . '.sqlite', $tmpDatabaseName . $dbnameSuffix . '.sqlite', $originalDatabaseUrl);
} else {
$tmpDatabaseUrl = (string) (new Uri($this->originalDatabaseUrl))->withPath($tmpDatabaseName);
$tmpDatabaseUrl = (string) (new Uri($originalDatabaseUrl))->withPath($tmpDatabaseName);
}
$_ENV['DATABASE_URL'] = $_SERVER['DATABASE_URL'] = $tmpDatabaseUrl;
putenv("DATABASE_URL=$tmpDatabaseUrl");
if ($connection->getDatabasePlatform() instanceof PostgreSQLPlatform) {
// PostgreSQL requires that the database exists before connecting to it
$connection->executeQuery('CREATE DATABASE ' . $tmpDatabaseName);
$tmpTestDatabaseName = $tmpDatabaseName . $dbnameSuffix;
$connection->executeQuery('CREATE DATABASE ' . $tmpTestDatabaseName);
}
// The environnement has been changed, recreate the client in order to update connection
@ -70,18 +62,16 @@ class InstallCommandTest extends WallabagTestCase
protected function tearDown(): void
{
$databaseUrl = $_SERVER['DATABASE_URL'];
$databaseUrl = getenv('DATABASE_URL');
/** @var Connection $connection */
$connection = $this->getTestClient()->getContainer()->get(ManagerRegistry::class)->getConnection();
if ($connection->getDatabasePlatform() instanceof SqlitePlatform) {// Remove the real environnement variable
$_ENV['DATABASE_URL'] = $_SERVER['DATABASE_URL'] = $this->originalDatabaseUrl;
if ($connection->getDatabasePlatform() instanceof SqlitePlatform) {
// Remove the real environnement variable
putenv('DATABASE_URL');
/** @see \Doctrine\DBAL\Tools\DsnParser::parse */
$url = preg_replace('#^((?:pdo-)?sqlite3?):///#', '$1://localhost/', $databaseUrl);
$databasePath = parse_url($url, \PHP_URL_PATH);
$databasePath = parse_url($databaseUrl, \PHP_URL_PATH);
if (file_exists($databasePath)) {
unlink($databasePath);
@ -90,7 +80,8 @@ class InstallCommandTest extends WallabagTestCase
$testDatabaseName = $connection->getDatabase();
$connection->close();
$_ENV['DATABASE_URL'] = $_SERVER['DATABASE_URL'] = $this->originalDatabaseUrl;
// Remove the real environnement variable
putenv('DATABASE_URL');
// Create a new client to avoid the error:
// Transaction commit failed because the transaction has been marked for rollback only.

View File

@ -41,6 +41,12 @@ class WallabagRestControllerTest extends WallabagApiTestCase
// create a new client instead of using $this->client to be sure client isn't authenticated
$client = $this->createUnauthorizedClient();
if (!$client->getContainer()->getParameter('fosuser_registration')) {
$this->markTestSkipped('fosuser_registration is not enabled.');
return;
}
$client->getContainer()->get(Config::class)->set('api_user_registration', 1);
$client->request('GET', '/api/info');

View File

@ -1561,7 +1561,7 @@ class EntryControllerTest extends WallabagTestCase
{
return [
'ru' => [
'https://ru.wikipedia.org/wiki/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA',
'https://ru.wikipedia.org/wiki/Открытое_программное_обеспечение',
'ru',
],
'fr' => [
@ -1569,23 +1569,23 @@ class EntryControllerTest extends WallabagTestCase
'fr',
],
'de' => [
'https://de.wikipedia.org/wiki/Deutsche_Sprache',
'https://www.bild.de/politik/ausland/theresa-may/wahlbeben-grossbritannien-analyse-52108924.bild.html',
'de',
],
'it' => [
'https://it.wikipedia.org/wiki/Lingua_italiana',
'https://www.ansa.it/sito/notizie/mondo/europa/2017/06/08/voto-gb-seggi-aperti-misure-sicurezza-rafforzate_0cb71f7f-e23b-4d5f-95ca-bc12296419f0.html',
'it',
],
'zh' => [
'https://zh.wikipedia.org/wiki/%E7%8F%BE%E4%BB%A3%E6%A8%99%E6%BA%96%E6%BC%A2%E8%AA%9E',
'zh',
'zh_CN' => [
'http://tuijian.hao123.com/tuijian/?__noscript__-=1',
'zh_CN',
],
'pt_BR' => [
'https://www.monpetitbresil.com/pages/quem-somos',
'https://esportes.r7.com/lance/futebol/victor-hugo-e-matheus-franca-devem-desfalcar-flamengo-no-carioca-22112022/',
'pt_BR',
],
'es' => [
'https://es.wikipedia.org/wiki/Idioma_espa%C3%B1ol',
'es-ES' => [
'https://elpais.com/internacional/2022-11-03/ultima-hora-de-la-guerra-entre-rusia-y-ucrania-hoy-en-directo.html',
'es',
],
];

View File

@ -85,6 +85,13 @@ class SecurityControllerTest extends WallabagTestCase
public function testEnabledRegistration()
{
$client = $this->getTestClient();
if (!$client->getContainer()->getParameter('fosuser_registration')) {
$this->markTestSkipped('fosuser_registration is not enabled.');
return;
}
$client->followRedirects();
$client->request('GET', '/register');
$this->assertStringContainsString('registration.submit', $client->getResponse()->getContent());

View File

@ -63,7 +63,8 @@ TWIG;
$this->twig,
'nobody@test.io',
'wallabag test',
'http://0.0.0.0/support'
'http://0.0.0.0/support',
'http://0.0.0.0/'
);
$authCodeMailer->sendAuthCode($user);

View File

@ -183,62 +183,4 @@ class LoginFormAuthenticatorTest extends TestCase
$this->assertTrue($loginRequired);
}
public function testLoginPostWithUserAgentHeaderWithData()
{
$siteConfig = new SiteConfig([
'host' => 'nextinpact.com',
'loginUri' => 'https://compte.nextinpact.com/Account/Login',
'usernameField' => 'UserName',
'passwordField' => 'Password',
'username' => 'johndoe',
'password' => 'unkn0wn',
'httpHeaders' => [
'user-agent' => 'Wallabag (Guzzle/5)',
],
]);
$browserResponse = new MockResponse('<html></html>', ['http_code' => 200, 'response_headers' => ['content-type' => 'text/html']]);
$browserClient = new MockHttpClient([$browserResponse]);
$browser = $this->getMockBuilder(HttpBrowser::class)
->setConstructorArgs([$browserClient])
->getMock();
$browser->expects($this->any())
->method('request')
->with(
$this->equalTo('POST'),
$this->equalTo('https://compte.nextinpact.com/Account/Login'),
$this->equalTo([
'UserName' => 'johndoe',
'Password' => 'unkn0wn',
]),
$this->equalTo([]),
$this->equalTo([
'HTTP_user-agent' => 'Wallabag (Guzzle/5)',
]),
)
;
$requestHtmlFunctionResponse = $this->getMockBuilder(ResponseInterface::class)->getMock();
$requestHtmlFunctionResponse->expects($this->any())
->method('getContent')
->willReturn(file_get_contents(__DIR__ . '/../fixtures/nextinpact-login.html'))
;
$requestHtmlFunctionClient = $this->getMockBuilder(HttpClientInterface::class)->getMock();
$requestHtmlFunctionClient->expects($this->any())
->method('request')
->with(
$this->equalTo('GET'),
$this->equalTo('https://nextinpact.com/'),
)
->willReturn($requestHtmlFunctionResponse)
;
$authenticatorProvider = new AuthenticatorProvider($requestHtmlFunctionClient);
$auth = new LoginFormAuthenticator($browser, $authenticatorProvider);
$res = $auth->login($siteConfig);
$this->assertInstanceOf(LoginFormAuthenticator::class, $res);
}
}

View File

@ -37,9 +37,6 @@ class SiteConfigTest extends TestCase
],
'username' => 'johndoe',
'password' => 'unkn0wn',
'httpHeaders' => [
'user-agent' => 'Wallabag (Guzzle/5)',
],
]);
$this->assertInstanceOf(SiteConfig::class, $config);

View File

@ -1,13 +1,10 @@
<?php
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Process\Process;
require __DIR__ . '/../vendor/autoload.php';
(new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');
(new Filesystem())->remove(__DIR__ . '/../var/cache/test');
if (!isPartialRun()) {

View File

@ -1,7 +0,0 @@
<?php
use Symfony\Component\Dotenv\Dotenv;
require __DIR__ . '/../vendor/autoload.php';
(new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');

View File

@ -18,6 +18,7 @@ share_twitter: Freigabe für Twitter aktivieren
share_unmark: Freigabe für Unmark.it aktivieren
show_printlink: Link anzeigen, um den Inhalt auszudrucken
wallabag_support_url: Support-URL für wallabag
wallabag_url: URL von *deiner* wallabag-Instanz
entry: Artikel
export: Export
import: Import

View File

@ -18,6 +18,7 @@ share_twitter: "Включить возможность поделиться в
share_unmark: "Включить возможность поделиться в Unmark.it"
show_printlink: "Отображать ссылки в версии для печати"
wallabag_support_url: "Поддержка URL для wallabag"
wallabag_url: "URL *вашего* wallabag сервиса"
entry: "запись"
export: "экспорт"
import: "импорт"

View File

@ -251,6 +251,14 @@ config:
old_password_label: Aktuální heslo
description: Zde můžete změnit své heslo. Vaše nové heslo by mělo být alespoň 8 znaků dlouhé.
repeat_new_password_label: Zopakujte nové heslo
form_rss:
rss_limit: Počet položek v novinkovém kanálu
rss_link:
all: Všechny
archive: Archivované
unread: Nepřečtené
token_create: Vytvořit váš token
no_token: Žádný token
tab_menu:
rss: RSS
settings: Nastavení

View File

@ -89,6 +89,19 @@ config:
help_reading_speed: wallabag berechnet eine Lesezeit pro Artikel. Hier kannst du definieren, ob du ein schneller oder langsamer Leser bist. wallabag wird die Lesezeiten danach neu berechnen.
help_language: Du kannst die Sprache der wallabag-Oberfläche ändern.
help_pocket_consumer_key: Nötig für den Pocket-Import. Du kannst ihn in deinem Pocket account einrichten.
form_rss:
description: Die RSS-Feeds von wallabag erlauben es dir, deine gespeicherten Artikel mit deinem bevorzugten RSS-Reader zu lesen. Vorher musst du jedoch einen Token erstellen.
token_label: RSS-Token
no_token: Kein Token
token_create: Token erstellen
token_reset: Token zurücksetzen
rss_links: RSS-Links
rss_link:
unread: Ungelesene
starred: Favoriten
archive: Archivierte
all: Alle
rss_limit: Anzahl der Einträge pro Feed
form_user:
two_factor_description: Wenn du die Zwei-Faktor-Authentifizierung aktivierst, erhältst du eine E-Mail mit einem Code bei jeder nicht vertrauenswürdigen Verbindung.
name_label: Name

View File

@ -99,7 +99,20 @@ config:
lineheight_label: Interlineación
maxwidth_label: Anchura máxima
help_display_thumbnails: Puedes decidir si deseas mostrar o no las miniaturas de los artículos. Útil para conexiones lentas.
display_thumbnails_label: Mostrar las miniaturas de los artículos (útil para conexiones lentas).'
display_thumbnails_label: Mostrar las miniaturas de los artículos (útil para conexiones lentas).
form_rss:
description: 'Los feeds RSS proporcionados por wallabag permiten leer los artículos guardados con su lector RSS favorito. Primero necesitas generar un token.'
token_label: 'Token RSS'
no_token: 'Sin token'
token_create: 'Crear un token'
token_reset: 'Reiniciar el token'
rss_links: 'URLs de feeds RSS'
rss_link:
unread: 'Sin leer'
starred: 'Favoritos'
archive: 'Archivados'
all: Todos
rss_limit: 'Número de artículos en el feed RSS'
form_user:
two_factor_description: "Activar la autenticación en dos pasos significa que recibirás un código por correo electrónico en cada nueva conexión que no sea de confianza."
name_label: 'Nombre'

View File

@ -87,6 +87,18 @@ config:
redirect_current_page: ماندن در صفحه جاری
label: پس از حذف یا ستاره زدن یک مقاله یا علامت زدن به عنوان خوانده شده چه اتفاقی رخ دهد؟
help_items_per_page: تعداد مقالات نمایش داده شده در هر صفحه را تغییر دادید.
form_rss:
description: با خوراک آر-اس-اس که wallabag در اختیارتان می‌گذارد، می‌توانید مقاله‌های ذخیره‌شده را در نرم‌افزار آر-اس-اس دلخواه خود بخوانید. برای این کار نخست باید یک کد بسازید.
token_label: کد آر-اس-اس
no_token: بدون کد
token_create: کد خود را بسازید
token_reset: بازنشانی کد
rss_links: پیوند آر-اس-اس
rss_link:
unread: خوانده‌نشده
starred: برگزیده
archive: بایگانی
rss_limit: محدودیت آر-اس-اس
form_user:
two_factor_description: با فعال‌کردن تأیید ۲مرحله‌ای هر بار که اتصال تأییدنشده‌ای برقرار شد، به شما یک کد از راه ایمیل فرستاده می‌شود.
name_label: نام

View File

@ -146,6 +146,19 @@ about:
bug_reports: Izvještaji o greškama
page_title: Informacije
config:
form_rss:
rss_limit: Broj stavki u feedu
rss_link:
unread: Nepročitano
archive: Arhivirano
starred: Favorizirano
all: Sve
token_label: RSS token
description: RSS feedovi koje pruža wallabag dozvoljavaju ti čitati tvoje spremljene članke s tvojim omiljenim čitačem RSS-a. Najprije moraš generirati token.
no_token: Nema tokena
token_reset: Ponovo generiraj token
token_create: Stvori token
rss_links: RSS poveznice
form_rules:
faq:
variable_description:

View File

@ -78,6 +78,19 @@ config:
help_reading_speed: A wallabag kiszámítja az elolvasási időt minden egyes cikkre. Itt meghatározhatja, ennek a listának köszönhetően, hogy mennyire gyors vagy lassú olvasó. A wallabag újra ki fogja számítani az elolvasási időt minden egyes cikkre.
help_language: Megváltoztathatja a wallabag felületének a nyelvét.
help_pocket_consumer_key: A Pocket importálásához szükséges. Ezt a Pocket fiókodban hozhatod létre.
form_rss:
description: A wallabag által biztosított RSS-hírfolyam lehetővé teszi hogy az elmentett cikkeit a kedvenc RSS hírolvasójában olvashassa el. Ehhez először viszont létre kell hoznia egy hozzáférési kulcsot.
token_label: RSS hozzáférési kulcs
no_token: Nincs hozzáférési kulcs
token_create: Hozzáférési kulcsának létrehozása
token_reset: Új hozzáférési kulcs létrehozása
rss_links: RSS linkek
rss_link:
unread: Olvasatlan
starred: Csillagozott
archive: Archivált
all: Összes
rss_limit: Tételek száma a hírcsatornában
form_user:
two_factor_description: A kétfaktoros hitelesítés engedélyezésével egy biztonsági kódot tartalmazó e-mailt fog kapni minden új, nem azonosítható eszközről történő bejelentkezés esetén.
name_label: Név

View File

@ -88,6 +88,19 @@ config:
help_reading_speed: wallabag calcola un tempo di lettura per ogni articolo. Puoi definire qui, grazie a questa lista, se sei un lettore lento o veloce. wallabag ricalcolerà la velocità di lettura per ogni articolo.
help_language: Puoi cambiare la lingua dell'interfaccia di wallabag.
help_pocket_consumer_key: Richiesta per importare da Pocket. La puoi creare nel tuo account Pocket.
form_rss:
description: I feed RSS generati da wallabag ti permettono di leggere i tuoi contenuti salvati con il tuo lettore di RSS preferito. Prima, devi generare un token.
token_label: Token RSS
no_token: Nessun token
token_create: Crea il tuo token
token_reset: Rigenera il tuo token
rss_links: Collegamenti RSS
rss_link:
unread: Non letti
starred: Preferiti
archive: Archiviati
all: Tutti
rss_limit: Numero di elementi nel feed
form_user:
two_factor_description: Abilitando l'autenticazione a due fattori riceverai un'e-mail con un codice per ogni nuova connesione non verificata.
name_label: Nome

View File

@ -89,6 +89,19 @@ config:
label: 記事に既読やスターをつけた後、どこに移動しますか?
android_configuration: Androidアプリの設定をする
android_instruction: ここをタッチするとあなたのAndroid アプリに自動入力します
form_rss:
description: wallabag が提供する RSS フィードは、お好みの RSS リーダーで保存した記事を読むできます。最初にトークンを生成する必要があります。
token_label: RSS トークン
no_token: トークンがありません
token_create: トークンを作成
token_reset: トークンを再生成
rss_links: RSS のリンク
rss_limit: フィード内のアイテムの数
rss_link:
unread: 未読
starred: スター付
archive: アーカイブ
all: すべて
form_user:
two_factor_description: 二要素認証を有効にすると、信頼されていない新しい接続ごとに、コードを記載したメールが届きます。
help_twoFactorAuthentication: 二要素認証を有効にした場合、wallabag にログインするたびに、メールでコードを受信します。

View File

@ -100,6 +100,16 @@ config:
help_lineheight: Du kan velge linjehøyde du vil bruke.
font_label: Skrifttype
help_fontsize: Du kan velge skriftstørrelse du vil bruke.
form_rss:
token_label: RSS-symbol
no_token: Inget symbol
token_create: Opprett ditt symbol
token_reset: Regenerer ditt symbol
rss_links: RSS-lenker
rss_link:
unread: ulest
starred: stjernemerket
archive: arkivert
form_user:
name_label: Navn
email_label: E-post

View File

@ -55,6 +55,19 @@ config:
googleTwoFactor_label: Gebruik maken van OTP app (open de app, zoals Google Authenticator, Authy of FreeOTP, om een eenmalige code te krijgen)
emailTwoFactor_label: Gebruik maken van email (ontvang een code per mail)
login_label: Login (kan niet veranderd worden)
form_rss:
rss_limit: Aantal items in de lijst
rss_link:
all: Alles
archive: Gearchiveerd
starred: Gemarkeerd
unread: Ongelezen
rss_links: RSS-koppelingen
token_reset: Token opnieuw genereren
token_create: Creëer uw token
no_token: Geen token
token_label: RSS-token
description: Met RSS-feeds van wallabag kunt u uw opgeslagen artikelen lezen met uw favoriete RSS-lezer. U moet wel eerst een token genereren.
form_rules:
faq:
tagging_rules_definition_description: Dit zijn regels die door Wallabag worden gebruikt om automatisch nieuwe items te labelen. <br /> Elke keer dat een nieuw item wordt toegevoegd, worden alle labelregels gebruikt om de labels toe te voegen die je hebt geconfigureerd, waardoor je de moeite van het handmatig classificeren van je items bespaart.

View File

@ -100,6 +100,19 @@ config:
fontsize_label: Talha de polissa
lineheight_label: Nautor de linha
maxwidth_label: Largor maximala
form_rss:
description: Los fluxes RSS fornits per wallabag vos permeton de legir vòstres articles salvagardats dins vòstre lector de fluxes preferit. Per los poder emplegar, vos cal, d'en primièr crear un geton.
token_label: Geton RSS
no_token: Pas cap de geton generat
token_create: Creatz vòstre geton
token_reset: Reïnicializatz vòstre geton
rss_links: URLs de vòstres fluxes RSS
rss_link:
unread: Pas legits
starred: Favorits
archive: Legits
all: Totes
rss_limit: Nombre d'articles dins un flux RSS
form_user:
two_factor_description: Activar l'autentificacion en dos temps vòl dire que recebretz un còdi per corrièl per cada novèla connexion pas aprovada.
name_label: Nom

View File

@ -100,6 +100,19 @@ config:
lineheight_label: Wysokość linii
maxwidth_label: Maksymalna szerokość
help_fontsize: Możesz wybrać rozmiar czcionek do użycia.
form_rss:
description: Kanały RSS prowadzone przez wallabag pozwalają Ci na czytanie twoich zapisanych artykułów w twoim ulubionym czytniku RSS. Musisz najpierw wygenerować tokena.
token_label: Token RSS
no_token: Brak tokena
token_create: Stwórz tokena
token_reset: Zresetuj swojego tokena
rss_links: RSS links
rss_link:
unread: Nieprzeczytane
starred: Oznaczone gwiazdką
archive: Archiwum
all: Wszystkie
rss_limit: Link do RSS
form_user:
two_factor_description: Włączenie autoryzacji dwuetapowej oznacza, że będziesz otrzymywał maile z kodem przy każdym nowym, niezaufanym połączeniu.
name_label: Nazwa

View File

@ -76,6 +76,18 @@ config:
400_word: 'Posso ler ~400 palavras por minuto'
pocket_consumer_key_label: 'Chave do consumidor do Pocket para importar conteúdo'
help_pocket_consumer_key: Necessário para importar do Pocket. Pode criá-lo na sua conta do Pocket.
form_rss:
description: 'Feeds RSS providos pelo wallabag permitem que você leia seus artigos salvos em seu leitor de RSS favorito. Você precisa gerar um token primeiro.'
token_label: 'Token RSS'
no_token: 'Nenhum Token'
token_create: 'Criar seu token'
token_reset: 'Gerar novamente seu token'
rss_links: 'Links RSS'
rss_link:
unread: 'Não lido'
starred: 'Destacado'
archive: 'Arquivado'
rss_limit: 'Número de itens no feed'
form_user:
two_factor_description: 'Habilitar autenticação de dois passos significa que você receberá um e-mail com um código a cada nova conexão desconhecida.'
name_label: 'Nome'

View File

@ -89,6 +89,19 @@ config:
help_language: "Вы можете изменить язык интерфейса wallabag."
help_pocket_consumer_key: "Обязательно для импорта из Pocket. Вы можете создать это в Вашем аккаунте на Pocket."
android_instruction: Нажмите здесь, чтобы предустановить ваше приложение для Android
form_rss:
description: 'RSS фид созданный с помощью wallabag позволяет читать Ваши записи через Ваш любимый RSS агрегатор. Для начала Вам потребуется создать ключ.'
token_label: 'RSS ключ'
no_token: 'Ключ не задан'
token_create: 'Создать ключ'
token_reset: 'Пересоздать ключ'
rss_links: 'ссылка на RSS'
rss_link:
unread: 'непрочитанные'
starred: 'помеченные'
archive: 'архивные'
all: Все
rss_limit: 'Количество записей в фиде'
form_user:
two_factor_description: "Включить двухфакторную аутентификацию, Вы получите сообщение на указанный email с кодом, при каждом новом непроверенном подключении."
name_label: 'Имя'

View File

@ -100,6 +100,19 @@ config:
fontsize_label: Yazı tipi boyutu
lineheight_label: Satır yüksekliği
help_fontsize: Kullanmak istediğiniz yazı tipi boyutunu seçebilirsiniz.
form_rss:
description: wallabag RSS akışı kaydetmiş olduğunuz makalelerini favori RSS okuyucunuzda görüntülemenizi sağlar. Bunu yapabilmek için öncelikle belirteç (token) oluşturmalısınız.
token_label: RSS belirteci (token)
no_token: Belirteç (token) yok
token_create: Yeni belirteç (token) oluştur
token_reset: Belirteci (token) sıfırla
rss_links: RSS akış bağlantıları
rss_link:
unread: Okunmayan
starred: Favoriler
archive: Arşiv
all: Tümü
rss_limit: RSS içeriğinden talep edilecek makale limiti
form_user:
two_factor_description: İki adımlı kimlik doğrulamayı etkinleştirmek, her yeni güvenilmeyen bağlantıda bir kod içeren bir e-posta alacağınız anlamına gelir.
name_label: İsim

View File

@ -209,6 +209,19 @@ config:
enable: "启用"
two_factor_code_description_5: 如果你看不到二维码或无法扫描它,请在你的应用程序中输入下列认证代码:
qrcode_label: 二维码
form_rss:
rss_limit: RSS源中的条目数
rss_link:
all: 全部
archive: 已存档
starred: 已标星
unread: 未读
rss_links: RSS链接
token_reset: 重新生成你的令牌
token_create: 创建你的令牌
no_token: 没有令牌
token_label: RSS令牌
description: wallabag提供的RSS源可以让你用你喜欢的RSS阅读器阅读你保存的文章。首先需要生成一个令牌。
form_ignore_origin_rules:
faq:
operator_description:

View File

@ -4,4 +4,4 @@ validator:
password_too_short: يجب أن تتكون كلمة المرور الخاصة بك من 8 أحرف على الأقل.
item_per_page_too_high: سيؤدي هذا بالتأكيد إلى تدمير التطبيق
quote_length_too_high: الاقتباس طويل جدًا. يجب أن يحتوي على {{ Limit }} حرف أو أقل.
feed_limit_too_high: سيؤدي هذا بالتأكيد إلى تدمير التطبيق
rss_limit_too_high: سيؤدي هذا بالتأكيد إلى تدمير التطبيق

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Vaše heslo musí mít alespoň 8 znaků.
password_must_match: Hesla se musí shodovat.
quote_length_too_high: Citace je příliš dlouhá. Měla by mít {{ limit }} znaků nebo méně.
feed_limit_too_high: Toto určitě ukončí aplikaci
rss_limit_too_high: Toto určitě ukončí aplikaci
item_per_page_too_high: Toto určitě ukončí aplikaci

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Ihr Passwort muss mindestens 8 Zeichen lang sein.
password_wrong_value: Falsches aktuelles Passwort angegeben.
item_per_page_too_high: Dies wird die Anwendung möglicherweise beenden
feed_limit_too_high: Dies wird die Anwendung möglicherweise beenden
rss_limit_too_high: Dies wird die Anwendung möglicherweise beenden
quote_length_too_high: Das Zitat ist zu lang. Es sollte nicht mehr als {{ limit }} Zeichen enthalten.

View File

@ -1,6 +1,6 @@
validator:
quote_length_too_high: Η παράθεση είναι υπερβολικά μεγάλη. Πρέπει να έχει μέχρι και {{ limit }} χαρακτήρες.
feed_limit_too_high: Αυτό θα τερματίσει σίγουρα την εφαρμογή
rss_limit_too_high: Αυτό θα τερματίσει σίγουρα την εφαρμογή
item_per_page_too_high: Αυτό θα τερματίσει σίγουρα την εφαρμογή
password_wrong_value: Έγινε εισαγωγή λάθος κωδικού.
password_too_short: Ο κωδικός σας πρέπει να έχει τουλάχιστον 8 χαρακτήρες.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Your password must be at least 8 characters.
password_wrong_value: Wrong current password supplied.
item_per_page_too_high: This will certainly kill the app
feed_limit_too_high: This will certainly kill the app
rss_limit_too_high: This will certainly kill the app
quote_length_too_high: The quote is too long. It should have {{ limit }} characters or less.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Su contraseña debe tener al menos 8 caracteres.
password_wrong_value: Se ha proporcionado una contraseña incorrecta.
item_per_page_too_high: Esto matará la aplicación
feed_limit_too_high: Esto matará la aplicación
rss_limit_too_high: Esto matará la aplicación
quote_length_too_high: La cita es muy larga. Debe tener {{ limit }} caracteres o menos.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: گذرواژه شما باید حداقل ۸ حرف باشد.
password_wrong_value: گذواژه فعلی را اشتباه وارد کرده‌اید.
item_per_page_too_high: با این تعداد برنامه به فنا می‌رود
feed_limit_too_high: با این تعداد برنامه به فنا می‌رود
rss_limit_too_high: با این تعداد برنامه به فنا می‌رود
quote_length_too_high: نقل‌قول بسیار طولانی است. می‌بایست {{ limit }} حرف یا کمتر باشد.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Votre mot de passe doit faire au moins 8 caractères.
password_wrong_value: Mot de passe fourni incorrect.
item_per_page_too_high: Ça ne va pas plaire à lapplication
feed_limit_too_high: Ça ne va pas plaire à lapplication
rss_limit_too_high: Ça ne va pas plaire à lapplication
quote_length_too_high: La citation est trop longue. Elle doit avoir au maximum {{ limit }} caractères.

View File

@ -1,6 +1,6 @@
validator:
quote_length_too_high: A cita é demasiado longa. Debería ter {{ limit }} caracteres ou menos.
feed_limit_too_high: Esto certarmente estragará a app
rss_limit_too_high: Esto certarmente estragará a app
item_per_page_too_high: Esto certamente estragará a app
password_wrong_value: O contrasinal escrito non é o actual.
password_too_short: O teu contrasinal debe ter polo menos 8 caracteres.

View File

@ -2,6 +2,6 @@ validator:
quote_length_too_high: Citat je predug. Trebao bi sadržati {{limit}} ili manje znakova.
password_too_short: Lozinka mora sadržati barem 8 znakova.
password_wrong_value: Dostavljena je kriva trenutačna lozinka.
feed_limit_too_high: Ovo će zasigurno urušiti program
rss_limit_too_high: Ovo će zasigurno urušiti program
item_per_page_too_high: Ovo će zasigurno urušiti program
password_must_match: Polja lozinki moraju se poklapati.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: A jelszónak legalább 8 karakter hosszúságúnak kell lennie.
password_wrong_value: A megadott jelenlegi jelszó nem megfelelő.
item_per_page_too_high: Ettől minden bizonnyal nagyon lassú lesz az alkalmazás
feed_limit_too_high: Ettől minden bizonnyal nagyon lassú lesz az alkalmazás
rss_limit_too_high: Ettől minden bizonnyal nagyon lassú lesz az alkalmazás
quote_length_too_high: Az idézet az túl hosszú. {{ limit }} karakterek vagy annál kevesebbnek kell lennie.

View File

@ -3,5 +3,5 @@ validator:
password_must_match: Kata sandi harus cocok.
password_too_short: Kata sandi Anda harus setidaknya 8 karakter.
item_per_page_too_high: Ini akan mematikan aplikasi
feed_limit_too_high: Ini akan mematikan aplikasi
rss_limit_too_high: Ini akan mematikan aplikasi
quote_length_too_high: Kutipannya terlalu panjang. Setidaknya butuh {{ limit }} karakter atau kurang.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: La password deve essere di almeno 8 caratteri.
password_wrong_value: La password fornita è errata.
item_per_page_too_high: Questo valore è troppo alto
feed_limit_too_high: Questo valore è troppo alto
rss_limit_too_high: Questo valore è troppo alto
quote_length_too_high: La citazione è troppo lunga. Deve avere {{ limit }} caratteri o meno.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: パスワードは 8 文字以上で入力してください。
password_wrong_value: 現在のパスワードが間違っています。
item_per_page_too_high: 確実にアプリを終了します
feed_limit_too_high: 確実にアプリを終了します
rss_limit_too_high: 確実にアプリを終了します
quote_length_too_high: 引用が長すぎます。{{ limit }} 文字以下にする必要があります。

View File

@ -1,6 +1,6 @@
validator:
quote_length_too_high: 인용이 너무 깁니다. {{limit}} 자 이하로 해야합니다.
feed_limit_too_high: 확실히 앱을 종료합니다
rss_limit_too_high: 확실히 앱을 종료합니다
item_per_page_too_high: 확실히 앱을 종료합니다
password_wrong_value: 현재 비밀번호가 잘못되었습니다.
password_too_short: 비밀번호는 8자 이상이어야합니다.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Passordet ditt må være minst åtte tegn.
password_wrong_value: Feil nåværende passord angitt.
item_per_page_too_high: Dette vil drepe programmet
feed_limit_too_high: Dette vil drepe programmet
rss_limit_too_high: Dette vil drepe programmet
quote_length_too_high: Sitatet er for langt. De kan være {{ limit }} tegn eller mindre.

View File

@ -1,6 +1,6 @@
validator:
quote_length_too_high: De quote is te lang. Het maximaal aantal tekens is {{ limit }}.
feed_limit_too_high: Dit breekt zeker de app
rss_limit_too_high: Dit breekt zeker de app
password_must_match: De wachtwoordvelden moeten gelijk zijn.
item_per_page_too_high: Dit breekt vrijwel zeker de app
password_wrong_value: Verkeerd huidig wachtwoord opgegeven.

View File

@ -5,3 +5,4 @@ validator:
item_per_page_too_high: "Aquò li agradarà pas a l'aplicacion"
feed_limit_too_high: "Aquò li agradarà pas a l'aplicacion"
quote_length_too_high: 'Aquesta citacion es tròpa longa. Cal que faga {{ limit }} caractèrs o mens.'
rss_limit_too_high: Aquò matarà segurament laplicacion

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Twoje hasło musi mieć co najmniej 8 znaków.
password_wrong_value: Twoje obecne hasło jest błędne.
item_per_page_too_high: To może spowodować problemy z aplikacją
feed_limit_too_high: To może spowodować problemy z aplikacją
rss_limit_too_high: To może spowodować problemy z aplikacją
quote_length_too_high: Cytat jest zbyt długi. powinien mieć {{ limit }} znaków lub mniej.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: A palavra-passe deve ter pelo menos 8 caracteres.
password_wrong_value: A palavra-passe atual está errada.
item_per_page_too_high: Certamente isso pode matar a aplicação
feed_limit_too_high: Certamente isso pode matar a aplicação
rss_limit_too_high: Certamente isso pode matar a aplicação
quote_length_too_high: A citação é longa demais. Ela deve ter {{ limite }} caracteres ou menos.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: 'Ваш пароль должен состоять не менее чем из 8 символов.'
password_wrong_value: 'Указан неверный пароль.'
item_per_page_too_high: 'Это, безусловно, убьёт приложение'
feed_limit_too_high: 'Это, безусловно, убьёт приложение'
rss_limit_too_high: 'Это, безусловно, убьёт приложение'
quote_length_too_high: Цитата слишком длинная. Она должна содержать не более {{ limit }} символов.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: 'รหัสผ่านควรมีอย่างน้อยสุด 8 ตัวอักษร'
password_wrong_value: 'ค่าที่ผิดพลาดของรหัสผ่านปัจุบันของคุณ'
item_per_page_too_high: 'สิ่งนี้จะทำให้ส่งผลต่อ app'
feed_limit_too_high: 'สิ่งนี้จะทำให้ส่งผลต่อ app'
rss_limit_too_high: 'สิ่งนี้จะทำให้ส่งผลต่อ app'
quote_length_too_high: 'การอ้างอิงที่ยาวไป มันควรที่จะมี {{ limit }} ตัวอักษรหรือน้อยกว่านั้น'

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Parolanız en az 8 karakter olmalıdır.
password_wrong_value: Girdiğiniz mevcut parolanız hatalı.
item_per_page_too_high: Bu uygulamayı tam olarak kapatacak
feed_limit_too_high: Bu uygulamayı tam olarak kapatacak
rss_limit_too_high: Bu uygulamayı tam olarak kapatacak
quote_length_too_high: Alıntı çok uzun. En fazla {{ limit }} karakter olmalıdır.

View File

@ -3,5 +3,5 @@ validator:
password_too_short: Ваш пароль повинен бути довжиною принаймні 8 символів.
password_wrong_value: Введено неправильний поточний пароль.
item_per_page_too_high: Вибрано завелику кількість
feed_limit_too_high: Вибрано завелику кількість
rss_limit_too_high: Вибрано завелику кількість
quote_length_too_high: Цитата занадто довга. Вона повинна мати не більше {{ limit }} символів.

View File

@ -5,3 +5,4 @@ validator:
item_per_page_too_high: '这会让应用十分卡顿'
feed_limit_too_high: '这会让应用十分卡顿'
quote_length_too_high: '引用内容过长,最多不能超过 {{ limit }} 个字符。'
rss_limit_too_high: 这肯定会杀死应用程序

View File

@ -3,5 +3,5 @@ validator:
password_too_short: 你的密碼必須至少有 8 個字元。
password_wrong_value: 提供了錯誤的密碼。
item_per_page_too_high: 這肯定會毀了應用程式
feed_limit_too_high: 這肯定會毀了應用程式
rss_limit_too_high: 這肯定會毀了應用程式
quote_length_too_high: 密碼太長了。 它應該要有{{limit}}個字或更少。

Some files were not shown because too many files have changed in this diff Show More