mirror of
https://github.com/pretix/pretix.git
synced 2026-10-30 23:59:51 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b04e07f83 | ||
|
|
e6f8f178af | ||
|
|
5f5380e8b1 |
No files matched your search
@@ -61,7 +61,6 @@ dependencies = [
|
||||
"dnspython==2.8.*",
|
||||
"drf_ujson2==1.7.*",
|
||||
"geoip2==5.*",
|
||||
"importlib_metadata==9.*", # Polyfill, we can probably drop this once we require Python 3.10+
|
||||
"isoweek",
|
||||
"jsonschema",
|
||||
"kombu==5.6.*",
|
||||
|
||||
@@ -19,4 +19,4 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
__version__ = "2026.9.0"
|
||||
__version__ = "2026.10.0.dev0"
|
||||
@@ -151,12 +151,29 @@ class LoggingMixin:
|
||||
logentry = LogEntry(content_object=self, user=user, action_type=action, event=event,
|
||||
organizer_id=organizer_id, **kwargs)
|
||||
if isinstance(data, dict):
|
||||
sensitivekeys = ['password', 'secret', 'api_key']
|
||||
# sensitivekeys are matched whether contained, not exactly
|
||||
sensitivekeys = [
|
||||
'auth',
|
||||
'key',
|
||||
'token',
|
||||
'password',
|
||||
'Password',
|
||||
'_pass',
|
||||
'salt',
|
||||
'secret',
|
||||
]
|
||||
|
||||
for sensitivekey in sensitivekeys:
|
||||
for k, v in data.items():
|
||||
if (sensitivekey in k) and v:
|
||||
def clean_recursive(d):
|
||||
data = d
|
||||
data_iterator = d.items() if isinstance(d, dict) else enumerate(d)
|
||||
for k, v in data_iterator:
|
||||
if v and any([sensitivekey in str(k) for sensitivekey in sensitivekeys]):
|
||||
data[k] = "********"
|
||||
elif isinstance(v, (list, dict)):
|
||||
data[k] = clean_recursive(v)
|
||||
return data
|
||||
|
||||
data = clean_recursive(data)
|
||||
|
||||
logentry.data = json.dumps(data, cls=CustomJSONEncoder, sort_keys=True)
|
||||
elif data:
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
import os
|
||||
import sys
|
||||
from enum import Enum
|
||||
from importlib import metadata
|
||||
from typing import List
|
||||
|
||||
import importlib_metadata as metadata
|
||||
from django.apps import AppConfig, apps
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
@@ -23,10 +23,10 @@ import json
|
||||
import logging
|
||||
import pathlib
|
||||
import re
|
||||
from importlib import metadata
|
||||
from urllib.parse import urljoin
|
||||
from urllib.request import urlopen
|
||||
|
||||
import importlib_metadata as metadata
|
||||
from django import template
|
||||
from django.conf import settings
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
@@ -31,7 +31,8 @@
|
||||
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
|
||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under the License.
|
||||
import importlib_metadata as metadata
|
||||
from importlib import metadata as metadata
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.db import transaction
|
||||
|
||||
@@ -41,7 +41,7 @@ from json import loads
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import importlib_metadata as metadata
|
||||
from importlib import metadata
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.utils.crypto import get_random_string
|
||||
from kombu import Queue
|
||||
|
||||
@@ -94,6 +94,83 @@ def question(event, item):
|
||||
return q
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_log_action_filter(event, order):
|
||||
sensitivekeys = [
|
||||
'auth',
|
||||
'key',
|
||||
'token',
|
||||
'password',
|
||||
'Password',
|
||||
'_pass',
|
||||
'salt',
|
||||
'secret',
|
||||
]
|
||||
log_data = log_data_filtered = {
|
||||
'foo': 'bar',
|
||||
}
|
||||
for d in (log_data, log_data_filtered):
|
||||
value = '********' if d == log_data_filtered else '__sensitive_info__'
|
||||
for k in sensitivekeys:
|
||||
d[k] = d['prefix' + k] = d['prefix' + k + 'suffix'] = d[k + 'suffix'] = value
|
||||
|
||||
d['recursive_dict'] = {
|
||||
'test': 'dummy',
|
||||
'test_token': value,
|
||||
'd': {
|
||||
'baz': 'foo',
|
||||
'mypassword': value,
|
||||
'l': [
|
||||
'foo',
|
||||
'bar',
|
||||
{
|
||||
'baz': True,
|
||||
'superkey': value,
|
||||
},
|
||||
],
|
||||
},
|
||||
'l': [
|
||||
'okay',
|
||||
{
|
||||
'salt_to_secret': value,
|
||||
'name': 'okay'
|
||||
},
|
||||
'element',
|
||||
[
|
||||
'another',
|
||||
{
|
||||
'api_password': value,
|
||||
},
|
||||
'list'
|
||||
]
|
||||
]
|
||||
}
|
||||
d['recursive_list'] = [
|
||||
'foo',
|
||||
'bar',
|
||||
[
|
||||
'foo',
|
||||
'bar',
|
||||
{
|
||||
'foo': 'bar',
|
||||
'api_token': value,
|
||||
},
|
||||
'baz',
|
||||
],
|
||||
{
|
||||
'foo': 'bar',
|
||||
'MyPassword': value,
|
||||
}
|
||||
]
|
||||
l1 = order.log_action(
|
||||
'dummy.log',
|
||||
data=log_data,
|
||||
)
|
||||
|
||||
l1.refresh_from_db()
|
||||
assert json.loads(l1.data) == log_data_filtered
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_email_shredder(event, order):
|
||||
l1 = order.log_action(
|
||||
|
||||
Reference in new issue
Block a user