diff --git a/cps.py b/cps.py
index 16d84957..ca7d7230 100755
--- a/cps.py
+++ b/cps.py
@@ -23,8 +23,12 @@ import os
# Insert local directories into path
-sys.path.append(os.path.dirname(os.path.abspath(__file__)))
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor'))
+if sys.version_info < (3, 0):
+ sys.path.append(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))))
+ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))), 'vendor'))
+else:
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
+ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor'))
from cps import create_app
diff --git a/cps/__init__.py b/cps/__init__.py
index 50bd1781..6b8815e9 100755
--- a/cps/__init__.py
+++ b/cps/__init__.py
@@ -87,8 +87,8 @@ global_WorkerThread = WorkerThread()
from .server import WebServer
web_server = WebServer()
-from .ldap import Ldap
-ldap = Ldap()
+from .ldap_login import Ldap
+ldap1 = Ldap()
babel = Babel()
@@ -97,6 +97,12 @@ log = logger.create()
def create_app():
app.wsgi_app = ReverseProxied(app.wsgi_app)
+ # For python2 convert path to unicode
+ if sys.version_info < (3, 0):
+ app.static_folder = app.static_folder.decode('utf-8')
+ app.root_path = app.root_path.decode('utf-8')
+ app.instance_path = app.instance_path .decode('utf-8')
+
cache_buster.init_cache_busting(app)
log.info('Starting Calibre Web...')
@@ -106,7 +112,7 @@ def create_app():
web_server.init_app(app, config)
db.setup_db()
babel.init_app(app)
- ldap.init_app(app)
+ ldap1.init_app(app)
global_WorkerThread.start()
return app
diff --git a/cps/admin.py b/cps/admin.py
index 449c5684..4984e2f0 100644
--- a/cps/admin.py
+++ b/cps/admin.py
@@ -40,7 +40,7 @@ from sqlalchemy import and_
from sqlalchemy.exc import IntegrityError
from werkzeug.security import generate_password_hash
-from . import constants, logger, ldap
+from . import constants, logger, ldap1
from . import db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils
from .helper import speaking_language, check_valid_domain, check_unrar, send_test_mail, generate_random_password, \
send_registration_mail
@@ -48,7 +48,7 @@ from .gdriveutils import is_gdrive_ready, gdrive_support, downloadFile, deleteDa
from .web import admin_required, render_title_template, before_request, unconfigured, login_required_if_no_ano
feature_support = dict()
-feature_support['ldap'] = ldap.ldap_supported()
+feature_support['ldap'] = ldap1.ldap_supported()
try:
from goodreads.client import GoodreadsClient
diff --git a/cps/cli.py b/cps/cli.py
index 1bda9c93..de12be5a 100644
--- a/cps/cli.py
+++ b/cps/cli.py
@@ -82,6 +82,18 @@ parser.add_argument('-i', metavar='ip-adress', help='Server IP-Adress to listen'
parser.add_argument('-s', metavar='user:pass', help='Sets specific username to new password')
args = parser.parse_args()
+if sys.version_info < (3, 0):
+ if args.p:
+ args.p = args.p.decode('utf-8')
+ if args.g:
+ args.g = args.g.decode('utf-8')
+ if args.k:
+ args.k = args.k.decode('utf-8')
+ if args.c:
+ args.c = args.c.decode('utf-8')
+ if args.s:
+ args.s = args.s.decode('utf-8')
+
settingspath = args.p or os.path.join(_CONFIG_DIR, "app.db")
gdpath = args.g or os.path.join(_CONFIG_DIR, "gdrive.db")
diff --git a/cps/constants.py b/cps/constants.py
index aaf0cd21..fce91312 100644
--- a/cps/constants.py
+++ b/cps/constants.py
@@ -24,7 +24,12 @@ from collections import namedtuple
# Base dir is parent of current file, necessary if called from different folder
-BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.pardir))
+if sys.version_info < (3, 0):
+ BASE_DIR = os.path.abspath(os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),os.pardir)).decode('utf-8')
+else:
+ BASE_DIR = os.path.abspath(os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),os.pardir))
STATIC_DIR = os.path.join(BASE_DIR, 'cps', 'static')
TEMPLATES_DIR = os.path.join(BASE_DIR, 'cps', 'templates')
TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations')
diff --git a/cps/db.py b/cps/db.py
index 2cd959ad..5429e93c 100755
--- a/cps/db.py
+++ b/cps/db.py
@@ -342,7 +342,7 @@ def setup_db():
try:
if not os.path.exists(dbpath):
raise
- engine = create_engine('sqlite:///' + dbpath,
+ engine = create_engine('sqlite:///{0}'.format(dbpath),
echo=False,
isolation_level="SERIALIZABLE",
connect_args={'check_same_thread': False})
diff --git a/cps/ldap.py b/cps/ldap_login.py
similarity index 95%
rename from cps/ldap.py
rename to cps/ldap_login.py
index 0688475a..dcded6f6 100644
--- a/cps/ldap.py
+++ b/cps/ldap_login.py
@@ -16,10 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
Start Time: 2019-05-12 18:51:22.511134
+Start Time: 2019-06-22 21:54:40.897700
Stop Time: 2019-05-12 19:42:21.577115
+Stop Time: 2019-06-22 22:37:09.413469
Duration: 0:50:59.065981
+Duration: 0:42:28.515769
pt3.2: Incomming connection 127.0.0.1:45562 -127.0.0.1:45562 Timeouted+
pt3.2: Incomming connection 127.0.0.1:45526 +127.0.0.1:45526 Timeouted
pt3.3: Incomming connection 127.0.0.1:45564 +pt3.3: Incomming connection 127.0.0.1:45528 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45564)) -('Message addressed from:', '<name@host.com> size=507') +('Receiving message from:', ('127.0.0.1', 45528)) +('Message addressed from:', '<name@host.com> size=508') ('Message addressed to :', ['a1@b.com']) -('Message length :', 506) +('Message length :', 507) Received: QUIT
pt3.4: Incomming connection 127.0.0.1:45566 +pt3.4: Incomming connection 127.0.0.1:45530 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45566)) -('Message addressed from:', '<name@host.com> size=30377') +('Receiving message from:', ('127.0.0.1', 45530)) +('Message addressed from:', '<name@host.com> size=30379') ('Message addressed to :', ['a1@b.com']) -('Message length :', 30376) +('Message length :', 30378) Received: QUIT
pt4.1: Incomming connection 127.0.0.1:45674 -127.0.0.1:45674 Timeouted+
pt4.1: Incomming connection 127.0.0.1:45622 +127.0.0.1:45622 Timeouted
pt4.2: Incomming connection 127.0.0.1:45680 -127.0.0.1:45680 Timeouted+
pt4.2: Incomming connection 127.0.0.1:45624 +127.0.0.1:45624 Timeouted
pt4.3: Incomming connection 127.0.0.1:45682 +pt4.3: Incomming connection 127.0.0.1:45626 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45682)) +('Receiving message from:', ('127.0.0.1', 45626)) ('Message addressed from:', '<name@host.com> size=523') ('Message addressed to :', ['a1@b.com']) ('Message length :', 506) @@ -783,14 +783,14 @@ Received: QUITaria-hidden="true">×
pt4.4: Incomming connection 127.0.0.1:45684 +pt4.4: Incomming connection 127.0.0.1:45628 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45684)) +('Receiving message from:', ('127.0.0.1', 45628)) ('Message addressed from:', '<name@host.com> size=30788') ('Message addressed to :', ['a1@b.com']) ('Message length :', 30378) @@ -801,78 +801,118 @@ Received: QUIT-- test_logging.test_logging_Python27 -5 ++ -unittest.suite._ErrorHolder +3 +0 +0 3 -1 0 -1 - Detail + Detail + - - -test_debug_log-PASS -- -- -test_failed_login-PASS -- -- test_failed_register+test_logging_Python27)- + - - -test_logfile_change-PASS -- +- test_logfile_recover+test_anonymous_Python27)- ++ + +test_updater)++ + ERROR ++ + @@ -1475,7 +1515,7 @@ AssertionError: logfile config value is not empty after reseting to default +- -test_anonymous.test_anonymous_Python27 +test_anonymous.test_anonymous_Python36 10 10 0 @@ -1545,79 +1585,1386 @@ AssertionError: logfile config value is not empty after reseting to defaultPASS - test_anonymous.test_anonymous_Python36 -10 -10 -0 ++ -test_user_template.test_user_template_Python27 +25 0 0 +22 +3 - Detail + Detail + - - +test_guest_about+test_author_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_change_visibility_category+test_author_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_change_visibility_hot+test_best_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_change_visibility_language+test_best_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_change_visibility_publisher+test_category_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_change_visibility_rated+test_category_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_change_visibility_series+test_detail_random_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_random_books_available+test_detail_random_user_template++ -+ ERROR ++ + + +PASS + - - +test_guest_visibility_read+test_hot_user_template++ -+ ERROR ++ + + +PASS + + - +test_guest_visibility_sidebar+test_hot_user_template++ ++ ERROR ++ + + + ++ ++ +test_language_user_template++ ++ ERROR ++ + + + ++ ++ +test_language_user_template++ ++ ERROR ++ + + + ++ ++ +test_limit_book_languages++ ++ SKIP ++ + + + ++ ++ +test_mature_content_settings++ ++ SKIP ++ + + + ++ ++ +test_publisher_user_template++ ++ ERROR ++ + + + ++ ++ +test_publisher_user_template++ ++ ERROR ++ + + + ++ ++ +test_random_user_template++ ++ ERROR ++ + + + ++ ++ +test_random_user_template++ ++ ERROR ++ + + + ++ ++ +test_read_user_template++ ++ ERROR ++ + + + ++ ++ +test_read_user_template++ ++ ERROR ++ + + + ++ ++ +test_recent_user_template++ ++ ERROR ++ + + + ++ ++ +test_recent_user_template++ ++ ERROR ++ + + + ++ ++ +test_series_user_template++ ++ ERROR ++ + + + ++ ++ +test_series_user_template++ ++ ERROR ++ + + + ++ + +test_ui_language_settings++ -+ SKIP ++ + + +PASS - -test_user_template.test_user_template_Python27 +test_user_template.test_user_template_Python36 14 11 0 @@ -1762,186 +3109,6 @@ AssertionError: logfile config value is not empty after reseting to default- -test_user_template.test_user_template_Python36 -14 -11 -0 -0 -3 -- Detail - -- -- -test_author_user_template-PASS -- -- -test_best_user_template-PASS -- -- -test_category_user_template-PASS -- -- -test_detail_random_user_template-PASS -- -- -test_hot_user_template-PASS -- -- -test_language_user_template-PASS -- -- -test_limit_book_languages-- -- SKIP -- - - - -- -- -test_mature_content_settings-- -- SKIP -- - - - -- -- -test_publisher_user_template-PASS -- -- -test_random_user_template-PASS -- -- -test_read_user_template-PASS -- -- -test_recent_user_template-PASS -- -- -test_series_user_template-PASS -- -- -test_ui_language_settings-- -- SKIP -- - - - -- -test_updater.test_updater -1 -0 -0 -0 -1 -- Detail - -- - -test_updater-- -- SKIP -- - - - -- test_cli.test_cli_Python27 6 @@ -1950,57 +3117,57 @@ AssertionError: logfile config value is not empty after reseting to default01 - Detail + Detail + - test_already_startedPASS + - test_cli_SSL_filesPASS + - test_cli_different_folderPASS + - test_cli_different_settings_databasePASS + - test_cli_gdrive_location- + - @@ -2014,57 +3181,57 @@ AssertionError: logfile config value is not empty after reseting to default0 test_environ_port_setting1 - Detail + Detail + - test_already_startedPASS + - test_cli_SSL_filesPASS + - test_cli_different_folderPASS + - test_cli_different_settings_databasePASS + - test_cli_gdrive_location- + - @@ -2078,56 +3245,56 @@ AssertionError: logfile config value is not empty after reseting to default0 test_environ_port_setting0 - Detail + Detail + - test_delete_book_of_shelfPASS + - test_private_shelfPASS + - test_public_private_shelfPASS + - test_public_shelfPASS + - test_rename_shelfPASS + - test_shelf_database_change- + - @@ -2151,56 +3318,56 @@ AssertionError: Database change test_shelf_long_name0 0 - Detail + Detail + - test_delete_book_of_shelfPASS + - test_private_shelfPASS + - test_public_private_shelfPASS + - test_public_shelfPASS + - test_rename_shelfPASS + - test_shelf_database_change- + - test_shelf_long_namePASS + - test_login.test_login_Python27 -7 -7 +13 0 0 +13 0 - Detail + Detail + - - test_login_capital_letters_user_unicode_password_passwortPASS ++ + ERROR ++ + + + ++ + ++ +test_login_capital_letters_user_unicode_password_passwort++ ++ ERROR ++ + + + +- - test_login_delete_adminPASS ++ + ERROR ++ + + + ++ + ++ +test_login_delete_admin++ ++ ERROR ++ + + + +- - test_login_empty_passwordPASS ++ + ERROR ++ + + + ++ + ++ +test_login_empty_password++ ++ ERROR ++ + + + +- - test_login_locale_selectPASS ++ + ERROR ++ + + + ++ - - test_login_protectedPASS ++ + ERROR ++ + + + ++ + ++ +test_login_protected++ ++ ERROR ++ + + + +- - test_login_unicode_user_space_end_passwortPASS ++ + ERROR ++ + + + ++ + ++ +test_login_unicode_user_space_end_passwort++ ++ ERROR ++ + + + ++ - test_login_user_with_space_passwort_end_spacePASS ++ ++ ERROR ++ + + + ++ + +test_login_user_with_space_passwort_end_space++ + ERROR ++ + + + +- test_login.test_login_Python36 @@ -2277,102 +4124,1261 @@ AssertionError: Database change0 0 - Detail + Detail + - test_login_capital_letters_user_unicode_password_passwortPASS + - test_login_delete_adminPASS + - test_login_empty_passwordPASS + - test_login_locale_selectPASS + - test_login_protectedPASS + - test_login_unicode_user_space_end_passwortPASS + - test_login_user_with_space_passwort_end_spacePASS + - test_ebook_convert.test_ebook_convert_Python27 -11 -9 -2 +22 0 0 +22 +0 - Detail + Detail + - test_SSL_smtp_setup_error- + + ++ +test_SSL_smtp_setup_error++ ++ ERROR ++ + + + ++ test_STARTTLS_smtp_setup_error- ++ ++ +test_STARTTLS_smtp_setup_error++ ++ ERROR ++ + + + ++ ++ +test_convert_deactivate++ ++ ERROR ++ + + + ++ ++ +test_convert_deactivate++ ++ ERROR ++ + + + ++ ++ +test_convert_email++ ++ ERROR ++ + + + ++ ++ +test_convert_email++ ++ ERROR ++ + + + ++ ++ +test_convert_failed_and_email++ ++ ERROR ++ + + + ++ ++ +test_convert_failed_and_email++ ++ ERROR ++ + + + ++ ++ +test_convert_only++ ++ ERROR ++ + + + ++ ++ +test_convert_only++ ++ ERROR ++ + + + ++ ++ +test_convert_parameter++ ++ ERROR ++ + + + ++ ++ +test_convert_parameter++ ++ ERROR ++ + + + ++ ++ +test_convert_wrong_excecutable++ ++ ERROR ++ + + + ++ ++ +test_convert_wrong_excecutable++ ++ ERROR ++ + + + ++ ++ +test_email_failed++ ++ ERROR ++ + + + ++ ++ +test_email_failed++ ++ ERROR ++ + + + ++ ++ +test_email_only++ ++ ERROR ++ + + + ++ ++ +test_email_only++ ++ ERROR ++ + + + ++ ++ +test_kindle_send_not_configured++ ++ ERROR ++ + + + ++ ++ +test_kindle_send_not_configured++ ++ ERROR ++ + + + ++ +test_ebook_convert.test_ebook_convert_Python36 +11 +9 +2 +0 +0 ++ Detail + ++ ++ +test_SSL_smtp_setup_error++ ++ PASS ++ + + + ++ -+ +test_STARTTLS_smtp_setup_error++ + PASS ++ + ++ - test_convert_deactivate- + - test_convert_email- -- -- -test_convert_failed_and_email-- -- PASS -- - - - -- -- -test_convert_only-- - PASS -- - -+ - - -test_convert_parameter-PASS -- -- test_convert_wrong_excecutable+test_convert_failed_and_email- -- -- -test_email_failed-PASS -- +- -test_email_only-- +- FAIL -- - + + -+ ++ +test_convert_only++ ++ PASS ++ + + + ++ ++ +test_convert_parameter+PASS ++ ++ +test_convert_wrong_excecutable++ ++ FAIL ++ + + + ++ ++ +test_email_failed+PASS ++ -+ +test_email_only++ + FAIL ++ + ++ - test_kindle_send_not_configuredPASS - -test_ebook_convert.test_ebook_convert_Python36 -11 -4 -7 -0 -0 -- Detail - -- -- -test_SSL_smtp_setup_error-- -- PASS -- - - - -- -- -test_STARTTLS_smtp_setup_error-- -- PASS -- - - - -- -- -test_convert_deactivate-- -- PASS -- - - - -- -- -test_convert_email-- -- FAIL -- - - - -- -- -test_convert_failed_and_email-- -- FAIL -- - - - -- -- -test_convert_only-- -- FAIL -- - - - -- -- -test_convert_parameter-- -- FAIL -- - - - -- -- -test_convert_wrong_excecutable-- -- FAIL -- - - - -- -- -test_email_failed-- -- FAIL -- - - - -- -- -test_email_only-- -- FAIL -- - - - -- -- -test_kindle_send_not_configured-PASS -+ - test_visiblilitys.calibre_web_visibilitys_Python27 16 +0 +0 16 0 -0 -0 - Detail + Detail + - - test_aboutPASS ++ + ERROR ++ + + + ++ - - test_admin_SMTP_SettingsPASS ++ + ERROR ++ + + + ++ - - test_admin_add_userPASS ++ + ERROR ++ + + + ++ - - test_admin_change_passwordPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_authorsPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_categoryPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_hotPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_languagePASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_publisherPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_ratedPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_readPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_seriesPASS ++ + ERROR ++ + + + ++ - - test_checked_logged_inPASS ++ + ERROR ++ + + + ++ - - test_random_books_availablePASS ++ + ERROR ++ + + + ++ - - test_user_email_availablePASS ++ + ERROR ++ + + + ++ - test_user_visibility_sidebarPASS ++ + ERROR ++ + + + +- test_visiblilitys.calibre_web_visibilitys_Python36 @@ -2989,647 +6495,1259 @@ AssertionError: 'Waiting' != 'Finished'0 0 - Detail + Detail + - test_aboutPASS + - test_admin_SMTP_SettingsPASS + - test_admin_add_userPASS + - test_admin_change_passwordPASS + - test_admin_change_visibility_authorsPASS + - test_admin_change_visibility_categoryPASS + - test_admin_change_visibility_hotPASS + - test_admin_change_visibility_languagePASS + - test_admin_change_visibility_publisherPASS + - test_admin_change_visibility_ratedPASS + - test_admin_change_visibility_readPASS + - test_admin_change_visibility_seriesPASS + - test_checked_logged_inPASS + - test_random_books_availablePASS + - test_user_email_availablePASS + - test_user_visibility_sidebarPASS + - test_edit_books.test_edit_books_Python27 23 -11 -1 0 +0 +12 11 - Detail + Detail + - test_database_errors- + - test_delete_book- + - test_delete_format- + - - test_edit_authorPASS ++ + ERROR ++ + + + ++ - - test_edit_categoryPASS ++ + ERROR ++ + + + ++ - - test_edit_commentsPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_boolPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_ratingPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_single_selectPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_textPASS ++ + ERROR ++ + + + ++ - - test_edit_languagePASS ++ + ERROR ++ + + + ++ - - test_edit_publisherPASS ++ + ERROR ++ + + + ++ - test_edit_publishing_date- + - - test_edit_ratingPASS ++ + ERROR ++ + + + ++ - - test_edit_seriesPASS ++ + ERROR ++ + + + ++ - test_edit_title- + - test_rename_uppercase_lowercase- + - test_typeahead_author- + - test_typeahead_language- + - test_typeahead_publisher- + - test_typeahead_series- + - test_typeahead_tag- + - test_upload_cover_hdd- + - test_edit_books.test_edit_books_Python36 23 -11 +7 1 -0 +4 11 - Detail + Detail + - test_database_errors- + - test_delete_book- + - test_delete_format- + - test_edit_authorPASS + - test_edit_categoryPASS + - test_edit_commentsPASS + - - test_edit_custom_boolPASS -- -- -test_edit_custom_rating-PASS -- -- -test_edit_custom_single_select-PASS -- -- -test_edit_custom_text-PASS -- -- -test_edit_language-PASS -- -- -test_edit_publisher-PASS -- -- test_edit_publishing_date-- + + ++ +test_edit_custom_rating++ ++ ERROR ++ + + + ++ ++ +test_edit_custom_single_select++ ++ ERROR ++ + + + ++ ++ +test_edit_custom_text++ ++ ERROR ++ + + + ++ ++ +test_edit_language+PASS ++ ++ +test_edit_publisher+PASS ++ ++ +test_edit_publishing_date++ ++ SKIP ++ + + + +- test_edit_ratingPASS + - test_edit_seriesPASS + - test_edit_title- + - test_rename_uppercase_lowercase- + - test_typeahead_author- + - test_typeahead_language- + - test_typeahead_publisher- + - test_typeahead_series- + - test_typeahead_tag- + - test_upload_cover_hdd- + - test_email_STARTTLS.test_STARTTLS_Python27 2 +0 +0 2 0 -0 -0 - Detail + Detail + - test_STARTTLS- + - test_STARTTLS_SSL_setup_error- + - test_STARTTLS- + - test_STARTTLS_SSL_setup_error- + - test_author_sortPASS + - test_author_sort_commaPASS + - test_author_sort_juniorPASS + - test_author_sort_onewordPASS + - test_author_sort_romanPASS + - test_check_Limit_LengthPASS + - test_check_char_replacementPASS + - test_check_chinese_CharactersPASS + - test_check_degEUR_replacementPASS + - test_check_doubleSPASS + - test_check_finish_DotPASS + - test_check_high23PASS + @@ -4034,17 +8144,17 @@ Received: QUIT test_check_umlautsTotal -266 -178 -15 -0 -73 +281 +110 +6 +94 +71