Compare commits

...

162 Commits

Author SHA1 Message Date
James Cole
c9f4cf4f34 Merge branch 'hotfix/4.7.17.4' 2019-08-02 17:08:34 +02:00
James Cole
1b3d3de969 Update version. 2019-08-02 17:08:24 +02:00
James Cole
e80d616ef4 Fix #2367 2019-08-02 17:05:54 +02:00
James Cole
2ddf48f15c Fix #2366 2019-08-02 16:46:45 +02:00
James Cole
692b256f3f Fix #2365 2019-08-02 16:44:48 +02:00
James Cole
3ad4e04e2a Fix #2364 2019-08-02 16:43:36 +02:00
James Cole
427de0594d Fix #2363 2019-08-02 16:42:16 +02:00
James Cole
7d482aa24c Merge branch 'hotfix/4.7.17.3' 2019-07-16 19:22:58 +02:00
James Cole
a9f34e9dd1 Update version. 2019-07-16 19:22:45 +02:00
James Cole
f795cb07e1 Fixes #2339 2019-07-16 19:22:35 +02:00
James Cole
17a66b3056 Fixes #2337 2019-07-16 19:22:14 +02:00
James Cole
531161db09 Fixes #2338 2019-07-16 19:21:58 +02:00
James Cole
a70b7cc7b9 Merge branch 'hotfix/4.7.17.2' 2019-07-15 19:12:34 +02:00
James Cole
def307010c Fix #2335, attempt 2. 2019-07-15 19:12:20 +02:00
James Cole
45b8c36272 Merge branch 'hotfix/4.7.17.1' 2019-07-15 16:50:36 +02:00
James Cole
45ddb64186 Fix #2335 2019-07-15 16:50:18 +02:00
James Cole
76aa8acf0f Merge branch 'release/4.7.17' 2019-03-17 09:40:13 +01:00
James Cole
220add3eda Update lock file 2019-03-17 09:17:55 +01:00
James Cole
541280ee91 Update change logs and config files. 2019-03-17 09:17:07 +01:00
James Cole
01219c951c Enable norsk, update version of DB 2019-03-17 09:14:52 +01:00
James Cole
69fa60cd21 Various language string updates. 2019-03-17 09:14:33 +01:00
James Cole
a11d2df6bb Norwegian strings. 2019-03-17 09:13:23 +01:00
James Cole
07d39a23a8 Improve installer middleware for Sandstorm. 2019-03-17 09:06:45 +01:00
James Cole
ca67d98676 Fix some issues with importer #2166 2019-03-17 08:18:42 +01:00
James Cole
7b60d210ee Other delete thing. 2019-03-17 07:31:12 +01:00
James Cole
78d955ebf6 More debug things. 2019-03-17 07:20:11 +01:00
James Cole
f6f21e02ac Extra debug info for #2159 and some kernel changes. 2019-03-16 21:54:25 +01:00
James Cole
e2ebd01719 Extra debug info for #2159 2019-03-16 20:07:26 +01:00
James Cole
b8ac7c9d89 Fix #2173 2019-03-16 19:39:39 +01:00
James Cole
037d9b7017 Rename class and add copyright statement @wrouesnel #2167 2019-03-16 19:02:13 +01:00
James Cole
6462d2b87a Merge pull request #2167 from wrouesnel/bugfix/ldapauth
Fix LDAP auth configuration paths.
2019-03-16 18:58:21 +01:00
Will Rouesnel
cb4ff35adb Fix LDAP auth configuration paths.
This commit fixes parameters broken in the latest version of `adldap2`.

Specifically:

* `adldap` auth parameters have changed in the latest version.
  * "usernames" has become `identities` and `discover` has changed to
    `discover_users_by`, `auth` has changed to `bind_users_by`
* Add the missing objectguid field to the users table for adldap2.
  * This is added as a nullable (optional) field at the moment to support
    tracking LDAP users as adldap2 wants to.
2019-03-12 09:12:54 +11:00
James Cole
d063f32c1c Fix some cache issues and a version bump. 2019-03-08 17:57:42 +01:00
James Cole
244d8eecab Updated file list. 2019-03-08 07:09:45 +01:00
James Cole
b66f6d7e2e Updated list. 2019-03-08 07:07:43 +01:00
James Cole
aa3a88f537 New file list. 2019-03-08 06:48:04 +01:00
James Cole
e5476e6e7a Merge tag '4.7.16' into develop
4.7.16
2019-03-08 06:22:05 +01:00
James Cole
4d976312e8 Merge branch 'release/4.7.16' 2019-03-08 06:22:04 +01:00
James Cole
2ef5d3d4c6 Update composer file. 2019-03-08 06:11:22 +01:00
James Cole
eb3a89555d Small fix in changelog. 2019-03-08 06:11:13 +01:00
James Cole
0a80b7fca7 New translations. 2019-03-08 06:11:05 +01:00
James Cole
f682981c1e Fix test for PHPUnit8 2019-03-05 20:11:37 +01:00
James Cole
4aac969ae4 Update version and changelog. 2019-03-05 17:52:44 +01:00
James Cole
00651adf5e Fix issue with bill display 2019-03-05 17:52:34 +01:00
James Cole
ed94e71168 Update language strings. 2019-03-05 17:52:26 +01:00
James Cole
6e12f434ad Fix issue #2144 2019-03-05 16:55:03 +01:00
James Cole
b8c4ec1449 Add old string under new key. 2019-03-03 08:17:19 +01:00
James Cole
4ca60ca92a Code for upgrade of various libraries. 2019-03-02 21:18:26 +01:00
James Cole
48219c9af3 Update libraries. 2019-03-02 20:14:45 +01:00
James Cole
9887b9809d Merge branch 'master' into develop
* master:
  Bump version for travis build.
2019-03-02 17:36:44 +01:00
James Cole
a13ad5b417 Bump version for travis build. 2019-03-02 17:36:08 +01:00
James Cole
3f28fd689f Merge tag '4.7.15' into develop
4.7.15
2019-03-02 17:17:22 +01:00
James Cole
959025545e Merge branch 'release/4.7.15' 2019-03-02 17:17:21 +01:00
James Cole
1978463e59 Update language strings for new release. 2019-03-02 15:55:26 +01:00
James Cole
e85ac07c49 Update meta files for new release. 2019-03-02 15:55:01 +01:00
James Cole
b7f0a6fff4 Update migrations so you can always roll back. 2019-03-02 15:54:24 +01:00
James Cole
3a57e09447 Fix for #2128 2019-03-02 14:33:46 +01:00
James Cole
87d5cabe52 Search improvements. 2019-03-02 14:12:09 +01:00
James Cole
af07522f16 Fix for #2135 2019-03-02 10:42:43 +01:00
James Cole
1b8d4e4c63 Make sure bills show attachment notes 2019-03-02 09:18:41 +01:00
James Cole
9f3c114d57 Add JSON decrypt for #2125 2019-03-02 09:18:26 +01:00
James Cole
c51c1b8098 Some basic date tests 2019-03-02 08:05:15 +01:00
James Cole
143fe2a71f Fix #2125 2019-03-01 17:56:52 +01:00
James Cole
3379b723cf Last attempt I hope for #2125 2019-02-28 19:56:41 +01:00
James Cole
39321b320e Improve search speed. 2019-02-27 19:08:09 +01:00
James Cole
fe738fd321 Another fix for #2125 2019-02-27 18:55:56 +01:00
James Cole
95720673d2 Merge pull request #2130 from lastlink/patch-1
add missing rollback for 477 migration
2019-02-26 18:33:20 +01:00
lastlink
963be4a4fa add missing rollback for 477 migration 2019-02-26 00:16:05 -05:00
James Cole
61db419485 Fixes #2125 2019-02-25 20:57:29 +01:00
James Cole
cb17b09b24 Merge pull request #2120 from lastlink/fix/pwaApple
missing meta tag for ios
2019-02-25 07:23:50 +01:00
Mr. Funk
0f1236a597 missing meta tag for ios 2019-02-24 15:12:58 -05:00
James Cole
ac26427a63 Merge branch 'master' into develop
* master:
  Don't change ARM PHP settings.
2019-02-24 10:56:28 +01:00
James Cole
491903778a Don't change ARM PHP settings. 2019-02-24 10:56:08 +01:00
James Cole
405c3e110a Merge tag '4.7.14' into develop
4.7.14
2019-02-24 07:28:00 +01:00
James Cole
5464bfac19 Merge branch 'release/4.7.14' 2019-02-24 07:28:00 +01:00
James Cole
ad31cc1c1f Fixes #2119 and bump version. 2019-02-24 07:27:24 +01:00
James Cole
3aa79fb1e4 Merge tag '4.7.13' into develop
4.7.13
2019-02-23 21:27:05 +01:00
James Cole
e3de03e50d Merge branch 'release/4.7.13' 2019-02-23 21:27:04 +01:00
James Cole
d8b4af34e0 Update files for release 4.7.13 2019-02-23 14:32:24 +01:00
James Cole
222d8e071a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
* 'develop' of github.com:firefly-iii/firefly-iii:
  New check for journals with 0.00 amount.
2019-02-23 12:36:17 +01:00
James Cole
36c2f27d59 New check for journals with 0.00 amount. 2019-02-23 07:47:41 +01:00
James Cole
5d43faab96 Refactor script locations to clear up root directory. 2019-02-20 07:04:24 +01:00
James Cole
07048cb5fb Fix #2100 2019-02-19 20:19:30 +01:00
James Cole
38c79c3dc4 Upgrade fix for Softaculous. 2019-02-19 19:59:02 +01:00
James Cole
7610d9e0db Update Dockerfiles to increase PHP execution time. 2019-02-19 07:10:13 +01:00
James Cole
e4f3d0a0ea Some new strings. 2019-02-18 19:47:48 +01:00
James Cole
fdf147d9c6 Merge branch 'hotfix/4.7.12.1' 2019-02-16 23:01:29 +01:00
James Cole
f7e418f517 Merge tag '4.7.12.1' into develop
4.7.12.1
2019-02-16 23:01:29 +01:00
James Cole
738f6ed232 Fix #2093 2019-02-16 23:01:14 +01:00
James Cole
12217d9850 Merge tag '4.7.12' into develop
4.7.12
2019-02-16 19:35:01 +01:00
James Cole
87c8b3d7c6 Merge branch 'release/4.7.12' 2019-02-16 19:35:00 +01:00
James Cole
fd571abbb0 Slight change in build script. 2019-02-16 19:33:33 +01:00
James Cole
64ae56757e Updated meta files. 2019-02-16 19:22:16 +01:00
James Cole
7d75f00696 New translations. 2019-02-16 19:22:05 +01:00
James Cole
451c86e431 Final touches for #2085 2019-02-16 19:04:36 +01:00
James Cole
c8c71da903 Extra debug log. #2061 2019-02-16 14:27:54 +01:00
James Cole
423f3a9296 Fix build script. 2019-02-16 14:02:04 +01:00
James Cole
7658b7d9a6 Apply fix for #2070 2019-02-16 11:45:08 +01:00
James Cole
0d0906c5e2 Fix for #2070 2019-02-16 11:43:05 +01:00
James Cole
e0aa7f3ff5 Various code cleanup. 2019-02-16 08:05:48 +01:00
James Cole
59fdf5b77a Updates to the login procedure [skip ci] 2019-02-16 07:20:25 +01:00
James Cole
e28cfade8d Push and build stuff. 2019-02-15 17:15:42 +01:00
James Cole
19710c3eab Update LDAP config for #2085 2019-02-15 07:39:12 +01:00
James Cole
0782354160 Updated LDAP code #2085 2019-02-15 07:22:51 +01:00
James Cole
22bc6d507e Fix issue with upgrade. 2019-02-13 17:54:46 +01:00
James Cole
bf3c74e65f Add required PHP extensions to composer.json. 2019-02-13 17:54:36 +01:00
James Cole
71fb9d8fa5 Code cleaning stuff. 2019-02-13 17:38:41 +01:00
James Cole
9a461fc7b7 Fix for #2082 2019-02-13 17:34:03 +01:00
James Cole
e0d87aa11e First part of a large code cleanup commit. 2019-02-12 21:49:28 +01:00
James Cole
b273af341c Update version. 2019-02-12 21:01:19 +01:00
James Cole
2117fc2a5a Add thing to apply rules to fints #2081 2019-02-12 21:01:12 +01:00
James Cole
58e55dc789 Document things better. 2019-02-12 21:00:53 +01:00
James Cole
ac9b8b8c30 Build and push. 2019-02-12 17:33:34 +01:00
James Cole
4dcc66238e Make directory as well. 2019-02-12 17:31:30 +01:00
James Cole
90c0aa6360 Add touch command. 2019-02-12 17:29:45 +01:00
James Cole
1594335487 Experiment with manifest code. 2019-02-12 17:27:56 +01:00
James Cole
2517674849 Expand experimental things. 2019-02-12 17:21:52 +01:00
James Cole
c00bc2a1f3 Update build script. 2019-02-11 19:01:14 +01:00
James Cole
f999be81c2 Fix upgrade problem in Softaculous. 2019-02-11 17:22:46 +01:00
James Cole
e2530c5486 Refresh journal after a rule is applied, #2070 2019-02-11 17:09:52 +01:00
James Cole
7526f13ca9 Update build script. 2019-02-11 17:07:34 +01:00
James Cole
ed08d299de Fix for #2017 2019-02-11 17:07:07 +01:00
James Cole
b6ea2f1c64 Updated file list for sandstorm 2019-02-10 15:22:18 +01:00
James Cole
9ee14374bb Updated sandstorm file list. 2019-02-10 15:14:52 +01:00
James Cole
925401682b Merge tag '4.7.11' into develop
4.7.11
2019-02-10 14:53:58 +01:00
James Cole
53c71bb7a2 Merge branch 'release/4.7.11' 2019-02-10 14:53:57 +01:00
James Cole
3c036ae021 Fix issue with time stamps. 2019-02-10 14:53:24 +01:00
James Cole
bf89d9956d Update language strings. 2019-02-10 14:33:15 +01:00
James Cole
71104f375c Fix tests 2019-02-10 14:33:03 +01:00
James Cole
4c94820cf4 Update meta files. 2019-02-10 14:32:34 +01:00
James Cole
8998c9a672 Extra code for #1975 2019-02-10 10:54:30 +01:00
James Cole
ccf60f4cdc Back to classic build. 2019-02-10 08:07:25 +01:00
James Cole
c5af1d363c Add audit trail messages to several controllers. 2019-02-10 08:03:09 +01:00
James Cole
c6e3b54705 Make update code slightly more robust. 2019-02-10 07:59:11 +01:00
James Cole
4f274a290e Generic debug info. 2019-02-09 20:44:31 +01:00
James Cole
1774bcbabe Add copyright statements and newlines. 2019-02-09 10:36:59 +01:00
James Cole
492c11784b Update with manifest commands. 2019-02-09 06:40:55 +01:00
James Cole
21ddbd220a Include lib for arm 2019-02-08 17:40:29 +01:00
James Cole
e4a95e55ed Remove copy argument. 2019-02-08 17:34:46 +01:00
James Cole
3a0eb5a428 Do actual build 2019-02-08 17:31:32 +01:00
James Cole
e55fd968cf Rename file 2019-02-08 17:31:25 +01:00
James Cole
d41be08b48 Rename file 2019-02-08 17:30:42 +01:00
James Cole
a18272513d Fix YML 2019-02-08 17:28:04 +01:00
James Cole
e88061199c Trigger a new build. 2019-02-08 17:17:19 +01:00
James Cole
d0d7c437f2 Different build flow. 2019-02-08 17:15:54 +01:00
James Cole
a1ac1a4a29 Remove empty header from changelog [skip ci] 2019-02-08 17:01:49 +01:00
James Cole
41d22876c4 Update changelog and version. 2019-02-08 17:00:46 +01:00
James Cole
e1bb0298cb Fix category use date. 2019-02-08 16:56:07 +01:00
James Cole
1ec2772255 Fix #2052 2019-02-08 16:51:29 +01:00
James Cole
40d77d82cd Bunq import can now handle timestamps. 2019-02-08 16:45:42 +01:00
James Cole
311d51464d Add support for #2006 2019-02-08 07:14:45 +01:00
James Cole
d63c9c9aea Add audit logging. 2019-02-08 07:13:59 +01:00
James Cole
f1e83f240e Build with a new distribution. 2019-02-08 03:21:34 +01:00
James Cole
b0f847959f Merge pull request #2058 from skuzzle/develop
Remove console.log statement
2019-02-05 15:22:12 +01:00
Simon Taddiken
d3d4439b03 Remove console.log statement 2019-02-05 15:02:36 +01:00
James Cole
0e1da3f797 Fix webbased upgrade routine. 2019-02-04 20:35:46 +01:00
James Cole
def95df49e Fix link in changelog [skip ci] 2019-02-03 20:20:24 +01:00
James Cole
73c8c6de37 Disable manifest push [skip ci] 2019-02-03 20:19:59 +01:00
James Cole
25b2b43a38 Fix for #2049 2019-02-03 18:25:58 +01:00
James Cole
1fc2c998de Merge pull request #2048 from nescafe2002/patch-1
Fix delete-account confirmation
2019-02-03 14:52:40 +01:00
Joris
b7a577cc4c Fix delete-account confirmation 2019-02-03 14:44:32 +01:00
James Cole
2cdedd9c29 Merge tag '4.7.10' into develop
4.7.10
2019-02-03 10:10:41 +01:00
433 changed files with 9427 additions and 4559 deletions

View File

@@ -45,6 +45,14 @@ DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER}
DB_PASSWORD="${FF_DB_PASSWORD}"
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL=${PGSQL_SSL}
PGSQL_SSL_MODE=${PGSQL_SSL_MODE}
PGSQL_SSL_ROOT_CERT=${PGSQL_SSL_ROOT_CERT}
PGSQL_SSL_CERT=${PGSQL_SSL_CERT}
PGSQL_SSL_KEY=${PGSQL_SSL_KEY}
PGSQL_SSL_CRL_FILE=${PGSQL_SSL_CRL_FILE}
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
@@ -112,7 +120,7 @@ ANALYTICS_ID=${ANALYTICS_ID}
USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=${LOGIN_PROVIDER}
@@ -135,8 +143,6 @@ ADLDAP_ADMIN_PASSWORD="${ADLDAP_ADMIN_PASSWORD}"
ADLDAP_ACCOUNT_PREFIX="${ADLDAP_ACCOUNT_PREFIX}"
ADLDAP_ACCOUNT_SUFFIX="${ADLDAP_ACCOUNT_SUFFIX}"
ADLDAP_ADMIN_ACCOUNT_PREFIX="${ADLDAP_ADMIN_ACCOUNT_PREFIX}"
ADLDAP_ADMIN_ACCOUNT_SUFFIX="${ADLDAP_ADMIN_ACCOUNT_SUFFIX}"
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=${ADLDAP_PASSWORD_SYNC}

View File

@@ -3,16 +3,20 @@
# build image
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
if [ "$TRAVIS_BRANCH" == "develop" ]; then
echo "Build develop amd64"
docker build -t jc5x/firefly-iii:develop-amd -f Dockerfile .
docker push jc5x/firefly-iii:develop-amd
docker build -t jc5x/firefly-iii:develop-amd64 -f Dockerfile.amd64 .
docker tag jc5x/firefly-iii:develop-amd64 jc5x/firefly-iii:develop-$VERSION-amd64
docker push jc5x/firefly-iii:develop-amd64
docker push jc5x/firefly-iii:develop-$VERSION-amd64
fi
if [ "$TRAVIS_BRANCH" == "master" ]; then
echo "Build master amd64"
docker build -t jc5x/firefly-iii:latest-amd -f Dockerfile .
docker tag jc5x/firefly-iii:latest-amd jc5x/firefly-iii:release-$VERSION-amd
docker push jc5x/firefly-iii:latest-amd
docker push jc5x/firefly-iii:release-$VERSION-amd
docker build -t jc5x/firefly-iii:latest-amd64 -f Dockerfile.amd64 .
docker tag jc5x/firefly-iii:latest-amd64 jc5x/firefly-iii:release-$VERSION-amd64
docker push jc5x/firefly-iii:latest-amd64
docker push jc5x/firefly-iii:release-$VERSION-amd64
fi

View File

@@ -15,13 +15,15 @@ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
if [ "$TRAVIS_BRANCH" == "develop" ]; then
echo "Build develop arm"
docker build --tag jc5x/firefly-iii:develop-arm --file Dockerfile-ARM .
docker build --tag jc5x/firefly-iii:develop-arm --file Dockerfile.arm .
docker tag jc5x/firefly-iii:develop-arm jc5x/firefly-iii:develop-$VERSION-arm
docker push jc5x/firefly-iii:develop-arm
docker push jc5x/firefly-iii:develop-$VERSION-arm
fi
if [ "$TRAVIS_BRANCH" == "master" ]; then
echo "Build master arm"
docker build --tag jc5x/firefly-iii:latest-arm --file Dockerfile-ARM .
docker build --tag jc5x/firefly-iii:latest-arm --file Dockerfile.arm .
docker tag jc5x/firefly-iii:latest-arm jc5x/firefly-iii:release-$VERSION-arm
docker push jc5x/firefly-iii:latest-arm
docker push jc5x/firefly-iii:release-$VERSION-arm

View File

@@ -2,6 +2,8 @@
echo "Now in entrypoint.sh for Firefly III"
lscpu
# make sure the correct directories exists (suggested by @chrif):
echo "Making directories..."
mkdir -p $FIREFLY_PATH/storage/app/public
@@ -42,7 +44,7 @@ echo "Remove log file..."
rm -f $FIREFLY_PATH/storage/logs/laravel.log
echo "Map environment variables on .env file..."
cat .env.docker | envsubst > .env
cat $FIREFLY_PATH/.deploy/docker/.env.docker | envsubst > $FIREFLY_PATH/.env
echo "Dump auto load..."
composer dump-autoload
echo "Discover packages..."

View File

@@ -1,8 +1,9 @@
#!/usr/bin/env bash
if [ "$TRAVIS_BRANCH" == "develop" ]; then
TARGET=jc5x/firefly-iii:develop
ARM=jc5x/firefly-iii:develop-arm
AMD=jc5x/firefly-iii:develop-amd
AMD=jc5x/firefly-iii:develop-amd64
docker manifest create $TARGET $AMD $ARM
docker manifest annotate $TARGET $ARM --arch arm --os linux
@@ -15,7 +16,7 @@ echo "The version is $VERSION"
if [ "$TRAVIS_BRANCH" == "master" ]; then
TARGET=jc5x/firefly-iii:latest
ARM=jc5x/firefly-iii:latest-arm
AMD=jc5x/firefly-iii:latest-amd
AMD=jc5x/firefly-iii:latest-amd64
docker manifest create $TARGET $AMD $ARM
docker manifest annotate $TARGET $ARM --arch arm --os linux
@@ -25,7 +26,7 @@ if [ "$TRAVIS_BRANCH" == "master" ]; then
# and another one for version specific:
TARGET=jc5x/firefly-iii:release-$VERSION
ARM=jc5x/firefly-iii:release-$VERSION-arm
AMD=jc5x/firefly-iii:release-$VERSION-amd
AMD=jc5x/firefly-iii:release-$VERSION-amd64
docker manifest create $TARGET $AMD $ARM
docker manifest annotate $TARGET $ARM --arch arm --os linux

View File

@@ -42,7 +42,12 @@ DB_CONNECTION=pgsql
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached.
@@ -112,7 +117,7 @@ ANALYTICS_ID=
USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent
@@ -136,8 +141,6 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false

View File

@@ -1,4 +1,5 @@
en_US
es_ES
de_DE
fr_FR
it_IT
@@ -6,4 +7,4 @@ nl_NL
pl_PL
pt_BR
ru_RU
tr_TR
nb_NO

View File

@@ -112,7 +112,7 @@ ANALYTICS_ID=
USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent
@@ -136,8 +136,6 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false

View File

@@ -45,6 +45,13 @@ DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
@@ -112,7 +119,7 @@ ANALYTICS_ID=
USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent
@@ -136,8 +143,6 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false

View File

@@ -1,180 +0,0 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=testing
# Set to true if you want to see debug information in error screens.
APP_DEBUG=true
# This should be your email address
SITE_OWNER=thegrumpydictator+testing@gmail.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=TestTestTestTestTestTestTestTest
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=Europe/Amsterdam
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=http://localhost
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
TRUSTED_PROXIES=
# The log channel defines where your log entries go to.
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=dailytest
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=info
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
DB_CONNECTION=sqlite
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# You can configure another file storage backend if you cannot use the local storage option.
# To set this up, fill in the following variables. The upload path is used to store uploaded
# files and the export path is to store exported data (before download).
SFTP_HOST=
SFTP_PORT=
SFTP_UPLOAD_PATH=
SFTP_EXPORT_PATH=
# SFTP uses either the username/password combination or the private key to authenticate.
SFTP_USERNAME=
SFTP_PASSWORD=
SFTP_PRIV_KEY=
# Cookie settings. Should not be necessary to change these.
COOKIE_PATH="/"
COOKIE_DOMAIN=
COOKIE_SECURE=false
# If you want Firefly III to mail you, update these settings
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_FROM=changeme@example.com
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
# Other mail drivers:
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MANDRILL_SECRET=
SPARKPOST_SECRET=
# Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=false
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
# Firefly III currently supports two provider for live Currency Exchange Rates:
# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one.
# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates,
# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key.
CER_PROVIDER=fixer
# If you have select "fixer" as default currency exchange rates,
# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited
# the free API up to the point where you might as well offer nothing.
FIXER_API_KEY=
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
ANALYTICS_ID=
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
USE_ENCRYPTION=false
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent
# LDAP connection configuration
# or FreeIPA or ActiveDirectory
ADLDAP_CONNECTION_SCHEME=OpenLDAP
ADLDAP_AUTO_CONNECT=true
# LDAP connection settings
ADLDAP_CONTROLLERS=
ADLDAP_PORT=389
ADLDAP_TIMEOUT=5
ADLDAP_BASEDN=""
ADLDAP_FOLLOW_REFFERALS=false
ADLDAP_USE_SSL=false
ADLDAP_USE_TLS=false
ADLDAP_ADMIN_USERNAME=
ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false
ADLDAP_DISCOVER_FIELD=distinguishedname
ADLDAP_AUTH_FIELD=distinguishedname
# Will allow SSO if your server provides an AUTH_USER field.
WINDOWS_SSO_DISCOVER=samaccountname
WINDOWS_SSO_KEY=AUTH_USER
# field to sync as local username.
ADLDAP_SYNC_FIELD=userprincipalname
# You can disable the X-Frame-Options header if it interfears with tools like
# Organizr. This is at your own risk.
DISABLE_FRAME_HEADER=false
# Leave the following configuration vars as is.
# Unless you like to tinker and know what you're doing.
APP_NAME=FireflyIII
ADLDAP_CONNECTION=default
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
CACHE_PREFIX=firefly_tst
SEARCH_RESULT_LIMIT=50
PUSHER_KEY=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=true
FFIII_LAYOUT=v1

View File

@@ -1,8 +1,10 @@
<!--
Please read me:
Before you create a new PR, please consider the following two considerations.
1) DO NOT create a pull request for the MASTER branch.
2) DO NOT create pull requests to add new CURRENCIES.
1) Pull request for the MASTER branch will be closed.
2) We cannot accept pull requests to add new currencies.
Thanks.
-->
Fixes issue # (if relevant)

View File

@@ -6,7 +6,7 @@ set -euo pipefail
echo "In build.sh"
cd /opt/app
cp .env.sandstorm .env
cp .deploy/sandstorm/.env.sandstorm .env
if [ -f /opt/app/composer.json ] ; then
if [ ! -f composer.phar ] ; then

View File

@@ -1,3 +1,70 @@
# 4.7.17.4 (API 0.9.2)
- Several XSS issues, found by [@dayn1ne](https://github.com/dayn1ne).
# 4.7.17.3 (API 0.9.2)
- XSS bug in file uploads (x2), found by [@dayn1ne](https://github.com/dayn1ne).
- XSS bug in search, found by [@dayn1ne](https://github.com/dayn1ne).
# 4.7.17.2 (API 0.9.2)
- XSS bug in budget title, found by [@dayn1ne](https://github.com/dayn1ne).
# 4.7.17 (API 0.9.2)
- Support for Norwegian!
- Clear cache during install routine.
- Add Firefly III version number to install routine.
- Initial release.
- [Issue 2159](https://github.com/firefly-iii/firefly-iii/issues/2159) Bad redirect due to Laravel upgrade.
- [Issue 2166](https://github.com/firefly-iii/firefly-iii/issues/2166) Importer had some issues with distinguishing double transfers.
- [Issue 2167](https://github.com/firefly-iii/firefly-iii/issues/2167) New LDAP package gave some configuration changes.
- [Issue 2173](https://github.com/firefly-iii/firefly-iii/issues/2173) Missing class when generating 2FA codes.
# 4.7.16 (API 0.9.2)
- 4.7.16 was released to fix a persistent issue with broken user preferences.
- Firefly III now uses Laravel 5.8
# 4.7.15 (API 0.9.2)
- 4.7.15 was released to fix some issues upgrading from older versions.
- [Issue 2128](https://github.com/firefly-iii/firefly-iii/issues/2128) Support for Postgres SSL
- [Issue 2120](https://github.com/firefly-iii/firefly-iii/issues/2120) Add a missing meta tag, thanks to @lastlink
- Search is a lot faster now.
- [Issue 2125](https://github.com/firefly-iii/firefly-iii/issues/2125) Decryption issues during upgrade
- [Issue 2130](https://github.com/firefly-iii/firefly-iii/issues/2130) Fixed database migrations and rollbacks.
- [Issue 2135](https://github.com/firefly-iii/firefly-iii/issues/2135) Date fixes in transaction overview
# 4.7.14 (API 0.9.2)
- 4.7.14 was released to fix an issue with the Composer installation script.
# 4.7.13 (API 0.9.2)
- 4.7.13 was released to fix an issue that affected the Softaculous build.
- A routine has been added that warns about transactions with a 0.00 amount.
- PHP maximum execution time is now 600 seconds in the Docker image.
- Moved several files outside of the root of Firefly III
- Fix issue where missing preference breaks the database upgrade.
- [Issue 2100](https://github.com/firefly-iii/firefly-iii/issues/2100) Mass edit transactions results in a reset of the date.
# 4.7.12
- 4.7.12 was released to fix several shortcomings in v4.7.11's Docker image. Those in turn were caused by me. My apologies.
- [Issue 2085](https://github.com/firefly-iii/firefly-iii/issues/2085) Upgraded the LDAP code. To keep using LDAP, set the `LOGIN_PROVIDER` to `ldap`.
- [Issue 2061](https://github.com/firefly-iii/firefly-iii/issues/2061) Some users reported empty update popups.
- [Issue 2070](https://github.com/firefly-iii/firefly-iii/issues/2070) A cache issue prevented rules from being applied correctly.
- [Issue 2071](https://github.com/firefly-iii/firefly-iii/issues/2071) Several issues with Postgres and date values with time zone information in them.
- [Issue 2081](https://github.com/firefly-iii/firefly-iii/issues/2081) Rules were not being applied when importing using FinTS.
- [Issue 2082](https://github.com/firefly-iii/firefly-iii/issues/2082) The mass-editor changed all dates to today.
# 4.7.11
- Experimental audit logging channel to track important events (separate from debug logging).
- [Issue 2003](https://github.com/firefly-iii/firefly-iii/issues/2003), [issue 2006](https://github.com/firefly-iii/firefly-iii/issues/2006) Transactions can be stored with a timestamp. The user-interface does not support this yet. But the API does.
- Docker image tags a new manifest for arm and amd64.
- [skuzzle](https://github.com/skuzzle) removed an annoying console.log statement.
- [Issue 2048](https://github.com/firefly-iii/firefly-iii/issues/2048) Fix "Are you sure?" popup, thanks to @nescafe2002!
- [Issue 2049](https://github.com/firefly-iii/firefly-iii/issues/2049) Empty preferences would crash Firefly III.
- [Issue 2052](https://github.com/firefly-iii/firefly-iii/issues/2052) Rules could not auto-covert to liabilities.
- Webbased upgrade routine will also decrypt the database.
- Last use date for categories was off.
- The `date`-field in any transaction object now returns a ISO 8601 timestamp instead of a date.
# 4.7.10
- [Issue 2037](https://github.com/firefly-iii/firefly-iii/issues/2037) Added some new magic keywords to reports.
- Added a new currency exchange rate service, [ratesapi.io](https://ratesapi.io/), that does not require expensive API keys. Built by [@BoGnY](https://github.com/BoGnY).

File diff suppressed because it is too large Load Diff

View File

@@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
manifest = (
appTitle = (defaultText = "Firefly III"),
appVersion = 20,
appMarketingVersion = (defaultText = "4.7.10"),
appVersion = 30,
appMarketingVersion = (defaultText = "4.7.17.4"),
actions = [
# Define your "new document" handlers here.

View File

@@ -13,6 +13,7 @@ apt-get update
apt-get install -y python-software-properties software-properties-common
# install all languages
#en_US
sed -i 's/# es_ES.UTF-8 UTF-8/es_ES.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
@@ -22,6 +23,9 @@ sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# nb_NO.UTF-8 UTF-8/nb_NO.UTF-8 UTF-8/g' /etc/locale.gen
dpkg-reconfigure --frontend=noninteractive locales

View File

@@ -1,23 +1,29 @@
sudo: required
language: bash
env:
- VERSION=4.7.17.4
dist: xenial
# safelist
branches:
only:
- develop
- master
env:
- VERSION=4.7.10
services:
- docker
script:
# enable experimental features.
- echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
- mkdir $HOME/.docker
- touch $HOME/.docker/config.json
- echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json
- sudo service docker restart
- docker version -f '{{.Server.Experimental}}'
- docker version
# build everything
- .deploy/docker/build-amd64.sh
- .deploy/docker/build-arm.sh
- .deploy/docker/manifest.sh

View File

@@ -1,7 +1,7 @@
FROM php:7.2-apache
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com"
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
@@ -44,6 +44,11 @@ RUN chown -R www-data:www-data /var/www && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# configure PHP
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = 30/max_execution_time = 600/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/etc/php/php.ini
# Expose port 80
EXPOSE 80

57
Dockerfile.amd64 Normal file
View File

@@ -0,0 +1,57 @@
FROM php:7.2-apache
ARG ARCH
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Install some stuff
RUN apt-get update && apt-get install -y libpng-dev \
libicu-dev \
unzip \
gettext-base \
libldap2-dev \
libpq-dev \
locales \
libmemcached-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Copy in Firefly III source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# copy ca certs to correct location
COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem
# copy Apache config to correct spot.
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
# Enable default site (Firefly III)
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
# Run a lot of installation commands:
RUN chown -R www-data:www-data /var/www && \
chmod -R 775 $FIREFLY_PATH/storage && \
a2enmod rewrite && a2enmod ssl && \
docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine)/ && \
docker-php-ext-install -j$(nproc) zip bcmath ldap gd pdo_pgsql pdo_mysql intl opcache && \
pecl install memcached-3.1.3 && \
docker-php-ext-enable memcached && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nes_ES.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# configure PHP
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = 30/max_execution_time = 600/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/etc/php/php.ini
# Expose port 80
EXPOSE 80
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

View File

@@ -1,8 +1,8 @@
FROM arm32v7/php:7.2.8-apache-stretch
ARG TARGETPLATFORM
ARG ARCH
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com"
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload

50
Dockerfile.arm64 Normal file
View File

@@ -0,0 +1,50 @@
FROM arm32v7/php:7.2.8-apache-stretch
ARG ARCH
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Install some stuff
RUN apt-get update && apt-get install -y libpng-dev \
libicu-dev \
unzip \
gettext-base \
libldap2-dev \
libpq-dev \
locales \
libmemcached-dev
# Copy in Firefly III source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# copy ca certs to correct location
COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem
# copy Apache config to correct spot.
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
# Enable default site (Firefly III)
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
# Run a lot of installation commands:
RUN chown -R www-data:www-data /var/www && \
chmod -R 775 $FIREFLY_PATH/storage && \
a2enmod rewrite && a2enmod ssl && \
docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine)/ && \
docker-php-ext-install -j$(nproc) zip bcmath ldap gd pdo_pgsql pdo_mysql intl opcache && \
pecl install memcached-3.1.3 && \
docker-php-ext-enable memcached && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nes_ES.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# Expose port 80
EXPOSE 80
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

View File

@@ -60,7 +60,7 @@ class AboutController extends Controller
'driver' => $currentDriver,
];
return response()->json(['data' => $data], 200)->header('Content-Type', 'application/vnd.api+json');
return response()->json(['data' => $data])->header('Content-Type', 'application/vnd.api+json');
}
/**

View File

@@ -100,7 +100,7 @@ class AttachmentController extends Controller
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
/** @var LaravelResponse $response */
$response = response($content, 200);
$response = response($content);
$response
->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream')

View File

@@ -24,12 +24,10 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\AvailableBudgetRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Factory\TransactionCurrencyFactory;
use FireflyIII\Models\AvailableBudget;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
@@ -48,8 +46,6 @@ use League\Fractal\Serializer\JsonApiSerializer;
*/
class AvailableBudgetController extends Controller
{
/** @var CurrencyRepositoryInterface The currency repository */
private $currencyRepository;
/** @var BudgetRepositoryInterface The budget repository */
private $repository;
@@ -64,7 +60,6 @@ class AvailableBudgetController extends Controller
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
@@ -110,9 +105,11 @@ class AvailableBudgetController extends Controller
$start = $this->parameters->get('start');
$end = $this->parameters->get('end');
if (null !== $start && null !== $end) {
$collection = $collection->filter(function(AvailableBudget $availableBudget) use ($start, $end) {
$collection = $collection->filter(
function (AvailableBudget $availableBudget) use ($start, $end) {
return $availableBudget->start_date->gte($start) && $availableBudget->end_date->lte($end);
});
}
);
}
$count = $collection->count();
@@ -164,7 +161,6 @@ class AvailableBudgetController extends Controller
* @param AvailableBudgetRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(AvailableBudgetRequest $request): JsonResponse
{

View File

@@ -1,4 +1,25 @@
<?php
/**
* AccountController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
@@ -135,6 +156,70 @@ class AccountController extends Controller
return response()->json($chartData);
}
/**
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function overview(Request $request): JsonResponse
{
// parameters for chart:
$start = (string)$request->get('start');
$end = (string)$request->get('end');
if ('' === $start || '' === $end) {
throw new FireflyException('Start and end are mandatory parameters.');
}
$start = Carbon::createFromFormat('Y-m-d', $start);
$end = Carbon::createFromFormat('Y-m-d', $end);
// user's preferences
$defaultSet = $this->repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray();
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
$default = app('amount')->getDefaultCurrency();
if (0 === \count($frontPage->data)) {
$frontPage->data = $defaultSet;
$frontPage->save();
}
// get accounts:
$accounts = $this->repository->getAccountsById($frontPage->data);
$chartData = [];
/** @var Account $account */
foreach ($accounts as $account) {
$currency = $this->repository->getAccountCurrency($account);
if (null === $currency) {
$currency = $default;
}
$currentSet = [
'label' => $account->name,
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'line', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => [],
];
$currentStart = clone $start;
$range = app('steam')->balanceInRange($account, $start, clone $end);
$previous = round(array_values($range)[0], 12);
while ($currentStart <= $end) {
$format = $currentStart->format('Y-m-d');
$label = $currentStart->format('Y-m-d');
$balance = isset($range[$format]) ? round($range[$format], 12) : $previous;
$previous = $balance;
$currentStart->addDay();
$currentSet['entries'][$label] = $balance;
}
$chartData[] = $currentSet;
}
return response()->json($chartData);
}
/**
* @param Request $request
*
@@ -223,70 +308,6 @@ class AccountController extends Controller
return response()->json($chartData);
}
/**
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function overview(Request $request): JsonResponse
{
// parameters for chart:
$start = (string)$request->get('start');
$end = (string)$request->get('end');
if ('' === $start || '' === $end) {
throw new FireflyException('Start and end are mandatory parameters.');
}
$start = Carbon::createFromFormat('Y-m-d', $start);
$end = Carbon::createFromFormat('Y-m-d', $end);
// user's preferences
$defaultSet = $this->repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray();
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
$default = app('amount')->getDefaultCurrency();
if (0 === \count($frontPage->data)) {
$frontPage->data = $defaultSet;
$frontPage->save();
}
// get accounts:
$accounts = $this->repository->getAccountsById($frontPage->data);
$chartData = [];
/** @var Account $account */
foreach ($accounts as $account) {
$currency = $this->repository->getAccountCurrency($account);
if (null === $currency) {
$currency = $default;
}
$currentSet = [
'label' => $account->name,
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'line', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => [],
];
$currentStart = clone $start;
$range = app('steam')->balanceInRange($account, $start, clone $end);
$previous = round(array_values($range)[0], 12);
while ($currentStart <= $end) {
$format = $currentStart->format('Y-m-d');
$label = $currentStart->format('Y-m-d');
$balance = isset($range[$format]) ? round($range[$format], 12) : $previous;
$previous = $balance;
$currentStart->addDay();
$currentSet['entries'][$label] = $balance;
}
$chartData[] = $currentSet;
}
return response()->json($chartData);
}
/**
* Small helper function for the revenue and expense account charts.
* TODO should include Trait instead of doing this.

View File

@@ -1,4 +1,25 @@
<?php
/**
* AvailableBudgetController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
@@ -9,7 +30,6 @@ use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
/**
@@ -39,13 +59,11 @@ class AvailableBudgetController extends Controller
}
/**
* @param Request $request
*
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/
public function overview(Request $request, AvailableBudget $availableBudget): JsonResponse
public function overview(AvailableBudget $availableBudget): JsonResponse
{
$currency = $availableBudget->transactionCurrency;
$budgets = $this->repository->getActiveBudgets();

View File

@@ -1,4 +1,25 @@
<?php
/**
* CategoryController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;

View File

@@ -54,7 +54,6 @@ class ConfigurationController extends Controller
$admin = auth()->user();
if (!$this->repository->hasRole($admin, 'owner')) {
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
}
@@ -72,7 +71,7 @@ class ConfigurationController extends Controller
{
$configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json');
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
}
/**
@@ -82,7 +81,6 @@ class ConfigurationController extends Controller
* @param string $name
*
* @return JsonResponse
* @throws FireflyException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(ConfigurationRequest $request, string $name): JsonResponse
@@ -91,7 +89,7 @@ class ConfigurationController extends Controller
app('fireflyconfig')->set($name, $data['value']);
$configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json');
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
}
/**

View File

@@ -104,7 +104,7 @@ class Controller extends BaseController
$obj = null;
if (null !== $date) {
try {
$obj = new Carbon($date);
$obj = Carbon::parse($date);
} catch (InvalidDateException $e) {
// don't care
Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage()));

View File

@@ -265,6 +265,8 @@ class CurrencyController extends Controller
*
* @param Request $request
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
*/
public function budgetLimits(Request $request, TransactionCurrency $currency): JsonResponse
@@ -491,6 +493,8 @@ class CurrencyController extends Controller
*
* @param Request $request
*
* @param TransactionCurrency $currency
*
* @return JsonResponse]
*/
public function recurrences(Request $request, TransactionCurrency $currency): JsonResponse

View File

@@ -127,6 +127,7 @@ class ImportController extends Controller
/**
* Show all transactions
*
* @param Request $request
* @param ImportJob $importJob
*
* @return JsonResponse

View File

@@ -90,7 +90,7 @@ class LinkTypeController extends Controller
if (false === $linkType->editable) {
throw new FireflyException(sprintf('You cannot delete this link type (#%d, "%s")', $linkType->id, $linkType->name));
}
$this->repository->destroy($linkType, null);
$this->repository->destroy($linkType);
return response()->json([], 204);
}
@@ -190,6 +190,7 @@ class LinkTypeController extends Controller
/**
* Delete the resource.
*
* @param Request $request
* @param LinkType $linkType
*
* @return JsonResponse

View File

@@ -59,7 +59,7 @@ class PreferenceController extends Controller
// an important fallback is that the frontPageAccount array gets refilled automatically
// when it turns up empty.
$frontPageAccounts = app('preferences')->getForUser($user, 'frontPageAccounts', [])->data;
if (\count($frontPageAccounts) === 0) {
if (0 === \count($frontPageAccounts)) {
/** @var Collection $accounts */
$accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]);
$accountIds = $accounts->pluck('id')->toArray();

View File

@@ -247,7 +247,7 @@ class RecurrenceController extends Controller
return response()->json([], 204);
}
if (true === $result) {
return response()->json([], 200);
return response()->json();
}
return response()->json([], 418); // @codeCoverageIgnore

View File

@@ -1,4 +1,25 @@
<?php
/**
* SummaryController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
@@ -84,6 +105,7 @@ class SummaryController extends Controller
$spentData = $this->getLeftToSpendInfo($start, $end);
$networthData = $this->getNetWorthInfo($start, $end);
$total = array_merge($balanceData, $billData, $spentData, $networthData);
// TODO: liabilities with icon line-chart
return response()->json($total);
@@ -340,7 +362,10 @@ class SummaryController extends Controller
*/
private function getNetWorthInfo(Carbon $start, Carbon $end): array
{
$date = Carbon::create()->startOfDay();
/** @var User $user */
$user = auth()->user();
$date = Carbon::now()->startOfDay();
// start and end in the future? use $end
if ($this->notInDateRange($date, $start, $end)) {
@@ -350,7 +375,7 @@ class SummaryController extends Controller
/** @var NetWorthInterface $netWorthHelper */
$netWorthHelper = app(NetWorthInterface::class);
$netWorthHelper->setUser(auth()->user());
$netWorthHelper->setUser($user);
$allAccounts = $this->accountRepository->getActiveAccountsByType([AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE]);
// filter list on preference of being included.
@@ -368,7 +393,7 @@ class SummaryController extends Controller
/** @var TransactionCurrency $currency */
$currency = $data['currency'];
$amount = round($data['balance'], $currency->decimal_places);
if ($amount === 0.0) {
if (0.0 === $amount) {
continue;
}
// return stuff

View File

@@ -179,7 +179,7 @@ class TransactionController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$events = $this->repository->getPiggyBankEventsByTr($transaction);
$events = $this->repository->getPiggyBankEventsbyTr($transaction);
/** @var PiggyBankEventTransformer $transformer */
$transformer = app(PiggyBankEventTransformer::class);

View File

@@ -29,7 +29,6 @@ use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\JournalLinkTransformer;
use FireflyIII\Transformers\TransactionLinkTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Models\Category;
use FireflyIII\Rules\IsBoolean;
/**
* Class CategoryRequest
@@ -50,7 +49,7 @@ class CategoryRequest extends Request
public function getAll(): array
{
return [
'name' => $this->string('name')
'name' => $this->string('name'),
];
}
@@ -62,7 +61,7 @@ class CategoryRequest extends Request
public function rules(): array
{
$rules = [
'name' => 'required|between:1,100|uniqueObjectForUser:categories,name'
'name' => 'required|between:1,100|uniqueObjectForUser:categories,name',
];
switch ($this->method()) {
default:

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\User;
use Illuminate\Validation\Validator;
/**
@@ -98,13 +99,15 @@ class TransactionLinkRequest extends Request
*/
private function validateExistingLink(Validator $validator): void
{
/** @var User $user */
$user = auth()->user();
/** @var LinkTypeRepositoryInterface $repository */
$repository = app(LinkTypeRepositoryInterface::class);
$repository->setUser(auth()->user());
$repository->setUser($user);
/** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class);
$journalRepos->setUser(auth()->user());
$journalRepos->setUser($user);
$data = $validator->getData();
$inwardId = (int)($data['inward_id'] ?? 0);

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\BelongsUser;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\IsDateOrTime;
use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator;
@@ -59,7 +60,7 @@ class TransactionRequest extends Request
{
$data = [
'type' => $this->string('type'),
'date' => $this->date('date'),
'date' => $this->dateTime('date'),
'description' => $this->string('description'),
'piggy_bank_id' => $this->integer('piggy_bank_id'),
'piggy_bank_name' => $this->string('piggy_bank_name'),
@@ -103,7 +104,7 @@ class TransactionRequest extends Request
// basic fields for journal:
'type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
'description' => 'between:1,255',
'date' => 'required|date',
'date' => ['required', new IsDateOrTime],
'piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser],
'piggy_bank_name' => ['between:1,255', 'nullable', new BelongsUser],
'bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser],

View File

@@ -41,6 +41,7 @@ use Illuminate\Support\Collection;
/**
*
* Class ApplyRules
*
* @codeCoverageIgnore
*/
class ApplyRules extends Command
@@ -184,6 +185,8 @@ class ApplyRules extends Command
private function applyRuleSelection(Collection $rules, Collection $transactions, bool $breakProcessing): void
{
$bar = $this->output->createProgressBar($rules->count() * $transactions->count());
/** @var Rule $rule */
foreach ($rules as $rule) {
/** @var Processor $processor */
$processor = app(Processor::class);
@@ -191,7 +194,7 @@ class ApplyRules extends Command
/** @var Transaction $transaction */
foreach ($transactions as $transaction) {
/** @var Rule $rule */
/** @noinspection DisconnectedForeachInstructionInspection */
$bar->advance();
$result = $processor->handleTransaction($transaction);
if (true === $result) {
@@ -210,6 +213,7 @@ class ApplyRules extends Command
/**
*
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function grabAllRules(): void
{
@@ -226,11 +230,12 @@ class ApplyRules extends Command
/**
*
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function parseDates(): void
{
// parse start date.
$startDate = Carbon::create()->startOfMonth();
$startDate = Carbon::now()->startOfMonth();
$startString = $this->option('start_date');
if (null === $startString) {
/** @var JournalRepositoryInterface $repository */

View File

@@ -97,7 +97,7 @@ class CreateImport extends Command
return 1;
}
if (\strlen($configuration) > 0) {
if ('' !== $configuration) {
$configurationData = json_decode(file_get_contents($configuration), true);
if (null === $configurationData) {
$this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd));
@@ -136,7 +136,7 @@ class CreateImport extends Command
}
// store file as attachment.
if (\strlen($file) > 0) {
if ('' !== $file) {
$messages = $jobRepository->storeCLIUpload($importJob, 'import_file', $file);
if ($messages->count() > 0) {
$this->errorLine($messages->first());

View File

@@ -48,16 +48,6 @@ class Cron extends Command
*/
protected $signature = 'firefly:cron';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*

View File

@@ -1,9 +1,33 @@
<?php
/**
* DecryptDatabase.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Crypt;
use DB;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Preference;
use FireflyIII\Support\Facades\FireflyConfig;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
@@ -64,6 +88,22 @@ class DecryptDatabase extends Command
}
$id = $row->id;
$value = $this->tryDecrypt($original);
// A separate routine for preferences:
if ('preferences' === $table) {
// try to json_decrypt the value.
$value = json_decode($value, true) ?? $value;
Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, print_r($value, true), $table, $id));
/** @var Preference $object */
$object = Preference::find((int)$id);
if (null !== $object) {
$object->data = $value;
$object->save();
}
continue;
}
if ($value !== $original) {
Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, $value, $table, $id));
DB::table($table)->where('id', $id)->update([$field => $value]);
@@ -91,7 +131,7 @@ class DecryptDatabase extends Command
$configName = sprintf('is_decrypted_%s', $table);
$configVar = FireflyConfig::get($configName, false);
if (null !== $configVar) {
return $configVar->data;
return (bool)$configVar->data;
}
return false;
@@ -108,7 +148,10 @@ class DecryptDatabase extends Command
try {
$value = Crypt::decrypt($value);
} catch (DecryptException $e) {
//Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
if ('The MAC is invalid.' === $e->getMessage()) {
throw new FireflyException($e->getMessage());
}
Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
}
return $value;

View File

@@ -28,6 +28,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Crypt;
use DB;
use Exception;
use FireflyIII\Models\Account;
@@ -35,6 +36,7 @@ use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill;
use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\Note;
use FireflyIII\Models\Preference;
@@ -52,6 +54,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\User;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\QueryException;
use Illuminate\Support\Collection;
use Log;
@@ -105,6 +108,22 @@ class UpgradeDatabase extends Command
return 0;
}
/**
* @param string $value
*
* @return string
*/
private function tryDecrypt(string $value): string
{
try {
$value = Crypt::decrypt($value);
} catch (DecryptException $e) {
Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
}
return $value;
}
/**
* Since it is one routine these warnings make sense and should be supressed.
*
@@ -126,11 +145,17 @@ class UpgradeDatabase extends Command
return;
}
$currencyCode = $this->tryDecrypt($currencyPreference->data);
$currency = TransactionCurrency::where('code', $currencyPreference->data)->first();
// try json decrypt just in case.
if (\strlen($currencyCode) > 3) {
$currencyCode = json_decode($currencyCode) ?? 'EUR';
}
$currency = TransactionCurrency::where('code', $currencyCode)->first();
if (null === $currency) {
$this->line('Fall back to default currency in migrateBillsToRules().');
$currency = app('amount')->getDefaultCurrency();
$currency = app('amount')->getDefaultCurrencyByUser($user);
}
if (null === $ruleGroup) {
@@ -272,6 +297,7 @@ class UpgradeDatabase extends Command
->whereNull('transactions.deleted_at')
->groupBy(['transaction_journals.id'])
->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]);
/** @noinspection PhpStrictTypeCheckingInspection */
$result = DB::table(DB::raw('(' . $subQuery->toSql() . ') AS derived'))
->mergeBindings($subQuery->getQuery())
->where('t_count', '>', 2)
@@ -292,23 +318,38 @@ class UpgradeDatabase extends Command
*/
public function updateAccountCurrencies(): void
{
Log::debug('Now in updateAccountCurrencies()');
$defaultConfig = (string)config('firefly.default_currency', 'EUR');
Log::debug(sprintf('System default currency is "%s"', $defaultConfig));
$accounts = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id')
->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->get(['accounts.*']);
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
$accounts->each(
function (Account $account) use ($repository) {
function (Account $account) use ($repository, $defaultConfig) {
$repository->setUser($account->user);
// get users preference, fall back to system pref.
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data;
// expand and debug routine.
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', $defaultConfig)->data;
Log::debug(sprintf('Default currency code is "%s"', var_export($defaultCurrencyCode, true)));
if (!is_string($defaultCurrencyCode)) {
$defaultCurrencyCode = $defaultConfig;
Log::debug(sprintf('Default currency code is not a string, now set to "%s"', $defaultCurrencyCode));
}
$defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first();
$accountCurrency = (int)$repository->getMetaValue($account, 'currency_id');
$openingBalance = $account->getOpeningBalance();
$obCurrency = (int)$openingBalance->transaction_currency_id;
if (null === $defaultCurrency) {
throw new UnexpectedValueException('The default currency is NULL, and this is more or less impossible.');
throw new UnexpectedValueException(sprintf('User has a preference for "%s", but this currency does not exist.', $defaultCurrencyCode));
}
Log::debug(
sprintf('Found default currency #%d (%s) while searching for "%s"', $defaultCurrency->id, $defaultCurrency->code, $defaultCurrencyCode)
);
// both 0? set to default currency:
if (0 === $accountCurrency && 0 === $obCurrency) {
@@ -448,11 +489,12 @@ class UpgradeDatabase extends Command
/** @var BudgetLimit $budgetLimit */
foreach ($budgetLimits as $budgetLimit) {
if (null === $budgetLimit->transaction_currency_id) {
/** @var Budget $budget */
$budget = $budgetLimit->budget;
if (null !== $budget) {
$user = $budget->user;
if (null !== $user) {
$currency = \Amount::getDefaultCurrencyByUser($user);
$currency = app('amount')->getDefaultCurrencyByUser($user);
$budgetLimit->transaction_currency_id = $currency->id;
$budgetLimit->save();
$this->line(
@@ -464,6 +506,9 @@ class UpgradeDatabase extends Command
}
}
/**
*
*/
private function createNewTypes(): void
{
// create transaction type "Reconciliation".
@@ -490,7 +535,7 @@ class UpgradeDatabase extends Command
// move description:
$description = (string)$att->description;
if (\strlen($description) > 0) {
if ('' !== $description) {
// find or create note:
$note = $att->notes()->first();
if (null === $note) {

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Crypt;
use DB;
use Exception;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
@@ -42,7 +42,6 @@ use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Log;
@@ -100,6 +99,7 @@ class VerifyDatabase extends Command
$this->fixBadMeta();
$this->removeBills();
$this->enableCurrencies();
$this->reportZeroAmount();
return 0;
}
@@ -691,4 +691,24 @@ class VerifyDatabase extends Command
);
}
}
/**
* Collect all journals with empty amount.
*/
private function reportZeroAmount(): void
{
$set = Transaction::where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
$set = array_unique($set);
/** @var Collection $journals */
$journals = TransactionJournal::whereIn('id', $set)->get();
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {
$message = sprintf(
'Transaction "%s" (#%d), owned by user %s, has amount zero (0.00). It should be deleted.', $journal->description,
$journal->id, $journal->user->email
);
$this->error($message);
}
}
}

View File

@@ -30,6 +30,7 @@ use Log;
/**
* File to make sure commands work.
*
* @codeCoverageIgnore
*/
class Kernel extends ConsoleKernel
@@ -54,7 +55,9 @@ class Kernel extends ConsoleKernel
{
$schedule->call(
function () {
Log::error('Firefly III no longer users the Laravel scheduler to do cron jobs! Please read the instructions at https://firefly-iii.readthedocs.io/en/latest/');
Log::error(
'Firefly III no longer users the Laravel scheduler to do cron jobs! Please read the instructions at https://firefly-iii.readthedocs.io/en/latest/'
);
echo "\n";
echo '------------';
echo "\n";

View File

@@ -30,6 +30,7 @@ use Log;
/**
* Class AdminRequestedTestMessage.
*
* @codeCoverageIgnore
*/
class AdminRequestedTestMessage extends Event

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Events;
/**
* Class Event.
*
* @codeCoverageIgnore
*/
abstract class Event

View File

@@ -29,6 +29,7 @@ use Illuminate\Queue\SerializesModels;
/**
* Class RegisteredUser.
*
* @codeCoverageIgnore
*/
class RegisteredUser extends Event

View File

@@ -29,6 +29,7 @@ use Illuminate\Queue\SerializesModels;
/**
* Class RequestedNewPassword.
*
* @codeCoverageIgnore
*/
class RequestedNewPassword extends Event

View File

@@ -28,6 +28,7 @@ use Crypt;
use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\Collection;
use Log;
use Storage;
@@ -102,6 +103,7 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface
* @param Attachment $attachment
*
* @return bool
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
private function exportAttachment(Attachment $attachment): bool
{
@@ -110,7 +112,7 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface
if ($this->uploadDisk->exists($file)) {
try {
$decrypted = Crypt::decrypt($this->uploadDisk->get($file));
} catch (DecryptException $e) {
} catch (DecryptException|FileNotFoundException $e) {
Log::error('Catchable error: could not decrypt attachment #' . $attachment->id . ' because: ' . $e->getMessage());
return false;

View File

@@ -110,7 +110,7 @@ class UploadCollector extends BasicCollector implements CollectorInterface
Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage()));
}
if (\strlen($content) > 0) {
if ('' !== $content) {
// add to export disk.
$date = $job->created_at->format('Y-m-d');
$file = sprintf('%s-Old %s import dated %s.%s', $this->job->key, strtoupper($job->file_type), $date, $job->file_type);

View File

@@ -49,48 +49,24 @@ use FireflyIII\Models\Transaction;
*/
final class Entry
{
/** @var int ID of the journal */
public $journal_id;
/** @var int ID of the transaction */
public $transaction_id = 0;
/** @var string The date. */
public $date;
/** @var string The description */
public $description;
/** @var string The currency code. */
public $currency_code;
/** @var string The amount. */
public $amount;
/** @var string The foreign currency code */
public $foreign_currency_code = '';
/** @var string Foreign amount */
public $foreign_amount = '0';
/** @var string Transaction type */
public $transaction_type;
/** @var string Asset account BIC */
public $asset_account_bic;
/** @var string Asset account IBAN */
public $asset_account_iban;
/** @var string Asset account ID */
public $asset_account_id;
/** @var string Asset account name */
public $asset_account_name;
/** @var string Asset account IBAN */
public $asset_account_iban;
/** @var string Asset account BIC */
public $asset_account_bic;
/** @var string Asset account number */
public $asset_account_number;
/** @var string Asset account currency code */
public $asset_currency_code;
/** @var string Opposing account ID */
public $opposing_account_id;
/** @var string Opposing account name */
public $opposing_account_name;
/** @var string Opposing account IBAN */
public $opposing_account_iban;
/** @var string Opposing account BIC */
public $opposing_account_bic;
/** @var string Opposing account number */
public $opposing_account_number;
/** @var string Opposing account code */
public $opposing_currency_code;
/** @var string Bill ID */
public $bill_id;
/** @var string Bill name */
public $bill_name;
/** @var string Budget ID */
public $budget_id;
/** @var string Budget name */
@@ -99,14 +75,38 @@ final class Entry
public $category_id;
/** @var string Category name */
public $category_name;
/** @var string Bill ID */
public $bill_id;
/** @var string Bill name */
public $bill_name;
/** @var string The currency code. */
public $currency_code;
/** @var string The date. */
public $date;
/** @var string The description */
public $description;
/** @var string Foreign amount */
public $foreign_amount = '0';
/** @var string The foreign currency code */
public $foreign_currency_code = '';
/** @var int ID of the journal */
public $journal_id;
/** @var string Notes */
public $notes;
/** @var string Opposing account BIC */
public $opposing_account_bic;
/** @var string Opposing account IBAN */
public $opposing_account_iban;
/** @var string Opposing account ID */
public $opposing_account_id;
/** @var string Opposing account name */
public $opposing_account_name;
/** @var string Opposing account number */
public $opposing_account_number;
/** @var string Opposing account code */
public $opposing_currency_code;
/** @var string Tags */
public $tags;
/** @var int ID of the transaction */
public $transaction_id = 0;
/** @var string Transaction type */
public $transaction_type;
/**
* Entry constructor.
@@ -132,7 +132,7 @@ final class Entry
$entry->transaction_id = $transaction->id;
$entry->date = $transaction->date->format('Ymd');
$entry->description = $transaction->description;
if (\strlen((string)$transaction->transaction_description) > 0) {
if ('' !== (string)$transaction->transaction_description) {
$entry->description = $transaction->transaction_description . '(' . $transaction->description . ')';
}
$entry->currency_code = $transaction->transactionCurrency->code;

View File

@@ -25,7 +25,6 @@ declare(strict_types=1);
namespace FireflyIII\Export;
use Crypt;
use DB;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Export\Collector\AttachmentCollector;
@@ -41,8 +40,8 @@ use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use Illuminate\Support\Collection;
use Log;
use Illuminate\Support\Facades\Storage;
use Log;
use ZipArchive;
/**
@@ -339,7 +338,7 @@ class ExpandedProcessor implements ProcessorInterface
$return = [];
/** @var Note $note */
foreach ($notes as $note) {
if (\strlen(trim((string)$note->text)) > 0) {
if ('' !== trim((string)$note->text)) {
$id = (int)$note->noteable_id;
$return[$id] = $note->text;
}

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Export\Exporter;
use FireflyIII\Export\Entry\Entry;
use League\Csv\Writer;
use Illuminate\Support\Facades\Storage;
use League\Csv\Writer;
/**
* Class CsvExporter.

View File

@@ -49,6 +49,7 @@ class AccountFactory
/**
* AccountFactory constructor.
*
* @codeCoverageIgnore
*/
public function __construct()

View File

@@ -43,6 +43,7 @@ class AccountMetaFactory
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/**
* @param array $data
*
@@ -73,6 +74,7 @@ class AccountMetaFactory
// if $data has field and $entry is null, create new one:
if (null === $entry) {
Log::debug(sprintf('Created meta-field "%s":"%s" for account #%d ("%s") ', $field, $value, $account->id, $account->name));
return $this->create(['account_id' => $account->id, 'name' => $field, 'data' => $value]);
}
@@ -89,6 +91,7 @@ class AccountMetaFactory
} catch (Exception $e) { // @codeCoverageIgnore
Log::debug(sprintf('Could not delete entry: %s', $e->getMessage())); // @codeCoverageIgnore
}
return null;
}

View File

@@ -38,6 +38,9 @@ class BillFactory
{
use BillServiceTrait;
/** @var User */
private $user;
/**
* Constructor.
*/
@@ -48,9 +51,6 @@ class BillFactory
}
}
/** @var User */
private $user;
/**
* @param array $data
*
@@ -111,7 +111,7 @@ class BillFactory
}
// then find by name:
if (null === $bill && \strlen($billName) > 0) {
if (null === $bill && '' !== $billName) {
$bill = $this->findByName($billName);
}

View File

@@ -34,6 +34,9 @@ use Log;
*/
class BudgetFactory
{
/** @var User */
private $user;
/**
* Constructor.
*/
@@ -44,10 +47,6 @@ class BudgetFactory
}
}
/** @var User */
private $user;
/**
* @param int|null $budgetId
* @param null|string $budgetName

View File

@@ -34,6 +34,9 @@ use Log;
*/
class CategoryFactory
{
/** @var User */
private $user;
/**
* Constructor.
*/
@@ -44,9 +47,6 @@ class CategoryFactory
}
}
/** @var User */
private $user;
/**
* @param string $name
*
@@ -94,7 +94,7 @@ class CategoryFactory
}
}
if (\strlen($categoryName) > 0) {
if ('' !== $categoryName) {
$category = $this->findByName($categoryName);
if (null !== $category) {
return $category;

View File

@@ -33,6 +33,9 @@ use Log;
*/
class PiggyBankFactory
{
/** @var User */
private $user;
/**
* Constructor.
*/
@@ -43,9 +46,6 @@ class PiggyBankFactory
}
}
/** @var User */
private $user;
/**
* @param int|null $piggyBankId
* @param null|string $piggyBankName
@@ -70,7 +70,7 @@ class PiggyBankFactory
}
// then find by name:
if (\strlen($piggyBankName) > 0) {
if ('' !== $piggyBankName) {
/** @var PiggyBank $piggyBank */
$piggyBank = $this->findByName($piggyBankName);
if (null !== $piggyBank) {

View File

@@ -39,6 +39,11 @@ use Log;
*/
class RecurrenceFactory
{
/** @var User */
private $user;
use TransactionTypeTrait, TransactionServiceTrait, RecurringTransactionTrait;
/**
* Constructor.
*/
@@ -49,11 +54,6 @@ class RecurrenceFactory
}
}
use TransactionTypeTrait, TransactionServiceTrait, RecurringTransactionTrait;
/** @var User */
private $user;
/**
* @param array $data
*

View File

@@ -38,6 +38,7 @@ class TransactionCurrencyFactory
{
/**
* TransactionCurrencyFactory constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
@@ -100,7 +101,7 @@ class TransactionCurrencyFactory
Log::warning(sprintf('Currency ID is %d but found nothing!', $currencyId));
}
// then by code:
if (\strlen($currencyCode) > 0) {
if ('' !== $currencyCode) {
$currency = TransactionCurrency::whereCode($currencyCode)->first();
if (null !== $currency) {
return $currency;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Factory;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Services\Internal\Support\JournalServiceTrait;
@@ -70,6 +71,10 @@ class TransactionJournalFactory
Log::debug(sprintf('Going to store a %s', $type->type));
$description = app('steam')->cleanString($data['description']);
$description = str_replace(["\n", "\t", "\r"], "\x20", $description);
/** @var Carbon $carbon */
$carbon = $data['date'];
$carbon->setTimezone(config('app.timezone'));
$journal = TransactionJournal::create(
[
'user_id' => $data['user'],
@@ -77,7 +82,7 @@ class TransactionJournalFactory
'bill_id' => null,
'transaction_currency_id' => $defaultCurrency->id,
'description' => $description,
'date' => $data['date']->format('Y-m-d'),
'date' => $carbon->format('Y-m-d H:i:s'),
'order' => 0,
'tag_count' => 0,
'completed' => 0,

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\TransactionType;
use Log;
/**
* Class TransactionTypeFactory
*/

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Chart\Basic;
use FireflyIII\Support\ChartColour;
use Log;
/**
* Class ChartJsGenerator.
*/
@@ -39,6 +40,46 @@ class ChartJsGenerator implements GeneratorInterface
}
}
/**
* Expects data as:.
*
* key => [value => x, 'currency_symbol' => 'x']
*
* @param array $data
*
* @return array
*/
public function multiCurrencyPieChart(array $data): array
{
$chartData = [
'datasets' => [
0 => [],
],
'labels' => [],
];
$amounts = array_column($data, 'amount');
$next = next($amounts);
$sortFlag = SORT_ASC;
if (!\is_bool($next) && 1 === bccomp((string)$next, '0')) {
$sortFlag = SORT_DESC;
}
array_multisort($amounts, $sortFlag, $data);
unset($next, $sortFlag, $amounts);
$index = 0;
foreach ($data as $key => $valueArray) {
// make larger than 0
$chartData['datasets'][0]['data'][] = (float)app('steam')->positive((string)$valueArray['amount']);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol'];
$chartData['labels'][] = $key;
++$index;
}
return $chartData;
}
/**
* Will generate a Chart JS compatible array from the given input. Expects this format.
*
@@ -150,46 +191,6 @@ class ChartJsGenerator implements GeneratorInterface
return $chartData;
}
/**
* Expects data as:.
*
* key => [value => x, 'currency_symbol' => 'x']
*
* @param array $data
*
* @return array
*/
public function multiCurrencyPieChart(array $data): array
{
$chartData = [
'datasets' => [
0 => [],
],
'labels' => [],
];
$amounts = array_column($data, 'amount');
$next = next($amounts);
$sortFlag = SORT_ASC;
if (!\is_bool($next) && 1 === bccomp((string)$next, '0')) {
$sortFlag = SORT_DESC;
}
array_multisort($amounts, $sortFlag, $data);
unset($next, $sortFlag, $amounts);
$index = 0;
foreach ($data as $key => $valueArray) {
// make larger than 0
$chartData['datasets'][0]['data'][] = (float)app('steam')->positive((string)$valueArray['amount']);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol'];
$chartData['labels'][] = $key;
++$index;
}
return $chartData;
}
/**
* Will generate a (ChartJS) compatible array from the given input. Expects this format:.
*

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Audit;
/**
* Class MultiYearReportGenerator.
*
* @codeCoverageIgnore
*/
class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Audit;
/**
* Class YearReportGenerator.
*
* @codeCoverageIgnore
*/
class YearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Budget;
/**
* Class MultiYearReportGenerator.
*
* @codeCoverageIgnore
*/
class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Budget;
/**
* Class YearReportGenerator.
*
* @codeCoverageIgnore
*/
class YearReportGenerator extends MonthReportGenerator

View File

@@ -40,6 +40,7 @@ use Throwable;
/**
* Class MonthReportGenerator.
*
* @codeCoverageIgnore
*/
class MonthReportGenerator extends Support implements ReportGeneratorInterface

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Category;
/**
* Class MultiYearReportGenerator.
*
* @codeCoverageIgnore
*/
class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Category;
/**
* Class YearReportGenerator.
*
* @codeCoverageIgnore
*/
class YearReportGenerator extends MonthReportGenerator

View File

@@ -27,6 +27,7 @@ use FireflyIII\Exceptions\FireflyException;
/**
* Class ReportGeneratorFactory.
*
* @codeCoverageIgnore
*/
class ReportGeneratorFactory

View File

@@ -31,6 +31,7 @@ use Throwable;
/**
* Class MonthReportGenerator.
*
* @codeCoverageIgnore
*/
class MonthReportGenerator implements ReportGeneratorInterface

View File

@@ -30,6 +30,7 @@ use Throwable;
/**
* Class MonthReportGenerator.
*
* @codeCoverageIgnore
*/
class MultiYearReportGenerator implements ReportGeneratorInterface

View File

@@ -30,6 +30,7 @@ use Throwable;
/**
* Class MonthReportGenerator.
*
* @codeCoverageIgnore
*/
class YearReportGenerator implements ReportGeneratorInterface

View File

@@ -31,6 +31,7 @@ use Illuminate\Support\Collection;
* Class Support.
* @method Collection getExpenses()
* @method Collection getIncome()
*
* @codeCoverageIgnore
*/
class Support

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Tag;
/**
* Class MultiYearReportGenerator.
*
* @codeCoverageIgnore
*/
class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Tag;
/**
* Class YearReportGenerator.
*
* @codeCoverageIgnore
*/
class YearReportGenerator extends MonthReportGenerator

View File

@@ -146,6 +146,7 @@ class UserEventHandler
} catch (Exception $e) {
Log::error($e->getMessage());
}
// @codeCoverageIgnoreEnd
return true;
@@ -172,6 +173,7 @@ class UserEventHandler
} catch (Exception $e) {
Log::error($e->getMessage());
}
// @codeCoverageIgnoreEnd
return true;
@@ -199,6 +201,7 @@ class UserEventHandler
} catch (Exception $e) {
Log::error($e->getMessage());
}
// @codeCoverageIgnoreEnd
return true;

View File

@@ -26,11 +26,12 @@ use Crypt;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Attachment;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\MessageBag;
use Log;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
@@ -85,7 +86,7 @@ class AttachmentHelper implements AttachmentHelperInterface
try {
$content = Crypt::decrypt($this->uploadDisk->get(sprintf('at-%d.data', $attachment->id)));
} catch (DecryptException $e) {
} catch (DecryptException|FileNotFoundException $e) {
Log::error(sprintf('Could not decrypt data of attachment #%d: %s', $attachment->id, $e->getMessage()));
$content = '';
}
@@ -102,8 +103,7 @@ class AttachmentHelper implements AttachmentHelperInterface
*/
public function getAttachmentLocation(Attachment $attachment): string
{
$path = sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int)$attachment->id);
return $path;
return sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int)$attachment->id);
}
/**
@@ -186,7 +186,7 @@ class AttachmentHelper implements AttachmentHelperInterface
* @param array|null $files
*
* @return bool
* @throws \Illuminate\Contracts\Encryption\EncryptException
* @throws FireflyException
*/
public function saveAttachmentsForModel(object $model, ?array $files): bool
{
@@ -265,7 +265,7 @@ class AttachmentHelper implements AttachmentHelperInterface
$attachment->save();
Log::debug('Created attachment:', $attachment->toArray());
$fileObject = $file->openFile('r');
$fileObject = $file->openFile();
$fileObject->rewind();
if (0 === $file->getSize()) {

View File

@@ -651,6 +651,40 @@ class TransactionCollector implements TransactionCollectorInterface
return $this;
}
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return TransactionCollectorInterface
*/
public function setSearchWords(array $array): TransactionCollectorInterface
{
// 'transaction_journals.description',
$this->query->where(
function (EloquentBuilder $q) use ($array) {
$q->where(
function (EloquentBuilder $q1) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q1->where('transaction_journals.description', 'LIKE', $keyword);
}
}
);
$q->orWhere(
function (EloquentBuilder $q2) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q2->where('transactions.description', 'LIKE', $keyword);
}
}
);
}
);
return $this;
}
/**
* @param Tag $tag
*

View File

@@ -145,15 +145,6 @@ interface TransactionCollectorInterface
*/
public function setAllAssetAccounts(): TransactionCollectorInterface;
/**
* Set the required currency (local or foreign)
*
* @param TransactionCurrency $currency
*
* @return TransactionCollectorInterface
*/
public function setCurrency(TransactionCurrency $currency): TransactionCollectorInterface;
/**
* Collect transactions before a specific date.
*
@@ -208,6 +199,15 @@ interface TransactionCollectorInterface
*/
public function setCategory(Category $category): TransactionCollectorInterface;
/**
* Set the required currency (local or foreign)
*
* @param TransactionCurrency $currency
*
* @return TransactionCollectorInterface
*/
public function setCurrency(TransactionCurrency $currency): TransactionCollectorInterface;
/**
* Set the journal IDs to filter on.
*
@@ -272,6 +272,15 @@ interface TransactionCollectorInterface
*/
public function setRange(Carbon $start, Carbon $end): TransactionCollectorInterface;
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return TransactionCollectorInterface
*/
public function setSearchWords(array $array): TransactionCollectorInterface;
/**
* Set the tag to collect from.
*

View File

@@ -31,6 +31,7 @@ use Illuminate\Support\Collection;
/**
* Class CountAttachmentsFilter
*
* @codeCoverageIgnore
*/
class CountAttachmentsFilter implements FilterInterface

View File

@@ -26,6 +26,7 @@ use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection;
use Log;
/**
* Class TransferFilter.
*

View File

@@ -25,7 +25,6 @@ namespace FireflyIII\Helpers\Help;
use Cache;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use League\CommonMark\CommonMarkConverter;
use Log;
use Route;
@@ -87,14 +86,14 @@ class Help implements HelpInterface
$res = $client->request('GET', $uri, $opt);
$statusCode = $res->getStatusCode();
$content = trim($res->getBody()->getContents());
} catch (GuzzleException|Exception $e) {
} catch (Exception $e) {
Log::info($e->getMessage());
Log::info($e->getTraceAsString());
}
Log::debug(sprintf('Status code is %d', $statusCode));
if (\strlen($content) > 0) {
if ('' !== $content) {
Log::debug('Content is longer than zero. Expect something.');
$converter = new CommonMarkConverter();
$content = $converter->convertToHtml($content);
@@ -153,7 +152,7 @@ class Help implements HelpInterface
public function putInCache(string $route, string $language, string $content): void
{
$key = sprintf(self::CACHEKEY, $route, $language);
if (\strlen($content) > 0) {
if ('' !== $content) {
Log::debug(sprintf('Will store entry in cache: %s', $key));
Cache::put($key, $content, 10080); // a week.

View File

@@ -25,7 +25,6 @@ namespace FireflyIII\Helpers\Report;
use Carbon\Carbon;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\CacheProperties;

View File

@@ -31,6 +31,7 @@ use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Support\Collection;
use Log;
/**
* Class PopupReport.
*

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Support\Collection;
use Log;
/**
* Class ReportHelper.
*

View File

@@ -50,6 +50,8 @@ trait UpdateTrait
$request->call();
} catch (FireflyException $e) {
Log::error(sprintf('Could not check for updates: %s', $e->getMessage()));
return null;
}
// get releases from array.
@@ -81,17 +83,20 @@ trait UpdateTrait
Log::debug(sprintf('Now in parseResult(%d)', $versionCheck));
$current = (string)config('firefly.version');
$return = '';
$triggered = false;
if ($versionCheck === -2) {
Log::debug('-2, so give error.');
$return = (string)trans('firefly.update_check_error');
$triggered = true;
}
if ($versionCheck === -1 && null !== $release) {
$triggered = true;
Log::debug('New version!');
// there is a new FF version!
// has it been released for at least three days?
$today = new Carbon;
$releaseDate = $release->getUpdated();
if ($today->diffInDays($releaseDate, true) > 3) {
if ($today->diffInDays($releaseDate) > 3) {
Log::debug('New version is older than 3 days!');
$monthAndDayFormat = (string)trans('config.month_and_day');
$return = (string)trans(
@@ -106,16 +111,23 @@ trait UpdateTrait
}
if (0 === $versionCheck) {
$triggered = true;
Log::debug('User is running current version.');
// you are running the current version!
$return = (string)trans('firefly.update_current_version_alert', ['version' => $current]);
}
if (1 === $versionCheck && null !== $release) {
$triggered = true;
Log::debug('User is running NEWER version.');
// you are running a newer version!
$return = (string)trans('firefly.update_newer_version_alert', ['your_version' => $current, 'new_version' => $release->getTitle()]);
}
if (false === $triggered) {
Log::debug('No option was triggered.');
$return = (string)trans('firefly.update_check_error');
}
return $return;
}
@@ -131,6 +143,7 @@ trait UpdateTrait
Log::debug('Now in versionCheck()');
if (null === $release) {
Log::debug('Release is null, return -2.');
return -2;
}
$current = (string)config('firefly.version');

View File

@@ -111,6 +111,7 @@ class CreateController extends Controller
$this->rememberPreviousUri('accounts.create.uri');
}
$request->session()->forget('accounts.create.fromStore');
Log::channel('audit')->info('Create new account.');
return view('accounts.create', compact('subTitleIcon', 'what', 'interestPeriods', 'subTitle', 'roles', 'liabilityTypes'));
}
@@ -131,7 +132,7 @@ class CreateController extends Controller
$request->session()->flash('success', (string)trans('firefly.stored_new_account', ['name' => $account->name]));
app('preferences')->mark();
Log::channel('audit')->info('Store new account.', $data);
// update preferences if necessary:
$frontPage = app('preferences')->get('frontPageAccounts', [])->data;

View File

@@ -145,7 +145,6 @@ class ShowController extends Controller
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View
*
* @throws FireflyException
*
*/
public function showAll(Request $request, Account $account)

View File

@@ -27,8 +27,8 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser;
use FireflyIII\Http\Requests\ConfigurationRequest;
use FireflyIII\Support\Facades\FireflyConfig;
use Illuminate\Http\RedirectResponse;
use Log;
/**
* Class ConfigurationController.
@@ -64,10 +64,12 @@ class ConfigurationController extends Controller
$subTitle = (string)trans('firefly.instance_configuration');
$subTitleIcon = 'fa-wrench';
Log::channel('audit')->info('User visits admin config index.');
// all available configuration and their default value in case
// they don't exist yet.
$singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$siteOwner = config('firefly.site_owner');
return view(
@@ -88,9 +90,11 @@ class ConfigurationController extends Controller
// get config values:
$data = $request->getConfigurationData();
Log::channel('audit')->info('User updates global configuration.', $data);
// store config values
FireflyConfig::set('single_user_mode', $data['single_user_mode']);
FireflyConfig::set('is_demo_site', $data['is_demo_site']);
app('fireflyconfig')->set('single_user_mode', $data['single_user_mode']);
app('fireflyconfig')->set('is_demo_site', $data['is_demo_site']);
// flash message
session()->flash('success', (string)trans('firefly.configuration_updated'));

View File

@@ -52,6 +52,7 @@ class HomeController extends Controller
*/
public function index()
{
Log::channel('audit')->info('User visits admin index.');
$title = (string)trans('firefly.administration');
$mainTitleIcon = 'fa-hand-spock-o';
$sandstorm = 1 === (int)getenv('SANDSTORM');
@@ -68,6 +69,7 @@ class HomeController extends Controller
*/
public function testMessage(Request $request)
{
Log::channel('audit')->info('User sends test message.');
/** @var User $user */
$user = auth()->user();
$ipAddress = $request->ip();

View File

@@ -28,6 +28,7 @@ use FireflyIII\Http\Requests\LinkTypeFormRequest;
use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use Illuminate\Http\Request;
use Log;
use View;
/**
@@ -63,6 +64,8 @@ class LinkController extends Controller
$subTitle = (string)trans('firefly.create_new_link_type');
$subTitleIcon = 'fa-link';
Log::channel('audit')->info('User visits link index.');
// put previous url in session if not redirect from store (not "create another").
if (true !== session('link-types.create.fromStore')) {
$this->rememberPreviousUri('link-types.create.uri');
@@ -88,6 +91,8 @@ class LinkController extends Controller
return redirect(route('admin.links.index'));
}
Log::channel('audit')->info(sprintf('User wants to delete link type #%d', $linkType->id));
$subTitle = (string)trans('firefly.delete_link_type', ['name' => $linkType->name]);
$otherTypes = $repository->get();
$count = $repository->countJournals($linkType);
@@ -116,6 +121,7 @@ class LinkController extends Controller
*/
public function destroy(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType)
{
Log::channel('audit')->info(sprintf('User destroyed link type #%d', $linkType->id));
$name = $linkType->name;
$moveTo = $repository->findNull((int)$request->get('move_link_type_before_delete'));
$repository->destroy($linkType, $moveTo);
@@ -144,6 +150,8 @@ class LinkController extends Controller
$subTitle = (string)trans('firefly.edit_link_type', ['name' => $linkType->name]);
$subTitleIcon = 'fa-link';
Log::channel('audit')->info(sprintf('User wants to edit link type #%d', $linkType->id));
// put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('link-types.edit.fromUpdate')) {
$this->rememberPreviousUri('link-types.edit.uri'); // @codeCoverageIgnore
@@ -165,6 +173,8 @@ class LinkController extends Controller
$subTitle = (string)trans('firefly.journal_link_configuration');
$subTitleIcon = 'fa-link';
$linkTypes = $repository->get();
Log::channel('audit')->info('User on index of link types in admin.');
$linkTypes->each(
function (LinkType $linkType) use ($repository) {
$linkType->journalCount = $repository->countJournals($linkType);
@@ -187,6 +197,8 @@ class LinkController extends Controller
$subTitleIcon = 'fa-link';
$links = $linkType->transactionJournalLinks()->get();
Log::channel('audit')->info(sprintf('User viewing link type #%d', $linkType->id));
return view('admin.link.show', compact('subTitle', 'subTitleIcon', 'linkType', 'links'));
}
@@ -206,6 +218,9 @@ class LinkController extends Controller
'outward' => $request->string('outward'),
];
$linkType = $repository->store($data);
Log::channel('audit')->info('User stored new link type.', $linkType->toArray());
$request->session()->flash('success', (string)trans('firefly.stored_new_link_type', ['name' => $linkType->name]));
$redirect = redirect($this->getPreviousUri('link-types.create.uri'));
if (1 === (int)$request->get('create_another')) {
@@ -243,6 +258,8 @@ class LinkController extends Controller
];
$repository->update($linkType, $data);
Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data);
$request->session()->flash('success', (string)trans('firefly.updated_link_type', ['name' => $linkType->name]));
app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('link-types.edit.uri'));

View File

@@ -23,12 +23,12 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin;
use FireflyConfig;
use FireflyIII\Helpers\Update\UpdateTrait;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser;
use Illuminate\Http\Request;
use Log;
/**
* Class HomeController.
@@ -87,8 +87,8 @@ class UpdateController extends Controller
public function post(Request $request)
{
$checkForUpdates = (int)$request->get('check_for_updates');
FireflyConfig::set('permission_update_check', $checkForUpdates);
FireflyConfig::set('last_update_check', time());
app('fireflyconfig')->set('permission_update_check', $checkForUpdates);
app('fireflyconfig')->set('last_update_check', time());
session()->flash('success', (string)trans('firefly.configuration_updated'));
return redirect(route('admin.update-check'));
@@ -102,12 +102,13 @@ class UpdateController extends Controller
$latestRelease = $this->getLatestRelease();
$versionCheck = $this->versionCheck($latestRelease);
$resultString = $this->parseResult($versionCheck, $latestRelease);
Log::debug(sprintf('Result string is: "%s"', $resultString));
if (0 !== $versionCheck && '' !== $resultString) {
// flash info
session()->flash('info', $resultString);
}
FireflyConfig::set('last_update_check', time());
app('fireflyconfig')->set('last_update_check', time());
return response()->json(['result' => $resultString]);
}

View File

@@ -178,7 +178,7 @@ class UserController extends Controller
$data = $request->getUserData();
// update password
if (\strlen($data['password']) > 0) {
if ('' !== $data['password']) {
$repository->changePassword($user, $data['password']);
}

View File

@@ -111,7 +111,7 @@ class AttachmentController extends Controller
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
/** @var LaravelResponse $response */
$response = response($content, 200);
$response = response($content);
$response
->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream')
@@ -211,13 +211,27 @@ class AttachmentController extends Controller
* @return LaravelResponse
* @throws FireflyException
*/
public function view(Attachment $attachment): LaravelResponse
public function view(Request $request, Attachment $attachment): LaravelResponse
{
if ($this->repository->exists($attachment)) {
$content = $this->repository->getContent($attachment);
// prevent XSS by adding a new secure header.
$csp = [
"default-src 'none'",
"object-src 'none'",
"script-src 'none'",
"style-src 'none'",
"base-uri 'none'",
"font-src 'none'",
"connect-src 'none'",
"img-src 'none'",
"manifest-src 'none'",
];
return response()->make(
$content, 200, [
'Content-Security-Policy' => implode('; ', $csp),
'Content-Type' => $attachment->mime,
'Content-Disposition' => 'inline; filename="' . $attachment->filename . '"',
]

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