django-restit 4.2.78__tar.gz → 4.2.80__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_restit-4.2.78 → django_restit-4.2.80}/PKG-INFO +1 -1
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/models/event.py +1 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/models/ossec.py +2 -0
- django_restit-4.2.80/incident/parsers/ossec.py +298 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/rpc.py +11 -7
- {django_restit-4.2.78 → django_restit-4.2.80}/pyproject.toml +1 -1
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/models/base.py +4 -0
- django_restit-4.2.78/incident/parsers/ossec.py +0 -227
- {django_restit-4.2.78 → django_restit-4.2.80}/LICENSE.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/fcm/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/fcm/google.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/fcm/v1.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0003_member_phone_number.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0005_member_auth_code_expires.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0006_member_security_token.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0009_alter_member_phone_number.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0010_delete_authtoken.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0011_authtoken.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0012_settings_settingsmetadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0013_memberdevice_ip.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0014_alter_notificationmemberrecord_member.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0015_memberdevice_buid.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0016_authsession_buid.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0017_rename_requires_topt_member_requires_totp.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0018_userpasskey.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0019_group_location.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/device.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/feeds.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/group.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/legacy.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/member.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/membership.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/notify.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/passkeys.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/session.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/models/settings.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/oauth/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/oauth/google.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/passkeys/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/passkeys/core.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/periodic.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/auth.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/device.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/group.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/member.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/notify.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/oauth.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/passkeys.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/rpc/settings.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/settings.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/base.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/invite.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/plain/base.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/plain/invite.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/plain/reset_code.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/reset_code.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/simple/invite.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/email/simple/reset_code.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/account/templates/unsubscribed.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/README +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/cloudwatch.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/decorators.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/middleware.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/periodic.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/auditlog/urls.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/handlers.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/migrations/0002_alter_message_cc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/migrations/0003_attachment_content_type.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/migrations/0004_mailtemplate.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/models/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/models/bounce.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/models/complaint.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/models/message.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/models/template.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/utils/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/utils/parsing.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/utils/render.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/inbox/utils/sending.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0002_event_component_event_component_id.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0003_rule_action.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0006_delete_eventmetadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0007_event_metadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0009_incident_reporter_ip.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0010_incident_category_incident_component_id.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0011_ticket.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0012_rule_match_by.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0013_rulecheck_is_required.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/0014_event_group_alter_rulecheck_index.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/models/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/models/incident.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/models/rules.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/models/ticket.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/parsers/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/periodic.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/templates/email/incident_change.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/templates/email/incident_msg.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/templates/email/incident_new.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/templates/email/incident_plain.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/incident/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/geolocate.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/migrations/0003_address_postalcode_suffix.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/migrations/0004_remove_address_modified_by_address_group_and_more.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/models/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/models/address.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/models/ip.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/models/legacy.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/models/location.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/models/track.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/abstractapi.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/extremeip.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/geoplugin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/ipapi.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/ipinfo.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/iplookup/restit.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/location/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/location/google.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/timezones/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/timezones/google.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/providers/zillow.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/rpc/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/rpc/address.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/rpc/ip.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/rpc/location.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/location/rpc/track.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/cvutil/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/cvutil/contours.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/cvutil/images.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/cvutil/misc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/cvutil/text.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/fixtures/initial_data.json +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/fixtures/medialib.json +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/fixtures/medialib_test_fixture.json +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/forms.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/ocr.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/pdf.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/qrcode.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/anigif.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/ffmpeg.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/gifsicle.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/hls.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/mp4box.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/rtmp/Makefile +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/rtmp/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/rtmp/rtmp.i +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/rtmpdump.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/rtmpsink.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/video_getinfo.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/engines/websnap.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/exceptions.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/akamai.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/animated_thumbnail.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/ffmpeg.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/flv.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/hls.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/image_transcode.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/image_validate.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/mp4.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/video_still.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/video_validate.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/websnap.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/presets/youtube.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/render_utils.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/render/schedule.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/rpc/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/rpc/legacy.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/rpc/media.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/rpc/tools.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/scripts/init_config +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/css/base_medialibui.css +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/css/base_widgets.css +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/css/jquery.jcrop.css +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/arrow-down-white.png +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/bg-body.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/cancel.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/icon-generic.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/icon-image.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/icon-media.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/icon-zip.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/loading.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/noimage.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/render_err.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/rendering.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/star_off.png +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/star_on.png +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/img/unknown.gif +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/caman.full.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/hammer.min.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/jquery.Jcrop.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/jquery.hammer.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/load-image.min.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/swiper.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/channel.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/discovery.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/errors.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/http.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/model.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/apiclient/schema.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/filestore.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/httplib2/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/httplib2/socks.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/httpstore.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/nullstore.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/appengine.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/client.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/crypt.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/file.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/gce.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/old_run.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/tools.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/util.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/rtmpstore.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/s3store.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/uritemplate/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/stores/youtubestore.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/base.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/instances.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/items.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/library.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_error.subject +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_error.to +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_error.txt +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_ready.subject +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_ready.to +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_ready.txt +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_render_error.subject +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_render_error.to +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_render_error.txt +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_validate_error.subject +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_validate_error.to +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/notify_validate_error.txt +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/smil +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/test.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/templates/medialib/testpicker.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/tests.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/urls.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/utils.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/views.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/channel.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/discovery.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/errors.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/http.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/model.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/apiclient/schema.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/httplib2/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/httplib2/socks.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/appengine.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/client.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/crypt.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/file.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/gce.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/old_run.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/tools.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/util.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/upload.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/medialib/youtube/uritemplate/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/client.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/eod.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/examples/eod_example.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/delete_gauge.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/delete_metric.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/generate_test_metrics.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/reset_weekly_metrics.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/management/commands/system_metric.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/migrations/0003_metrics_expires.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/migrations/0004_eodmetrics.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/periodic.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/providers/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/providers/aws.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/settings.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/metrics/utils.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/rpc/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/rpc/githooks.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/rpc/legacy.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/rpc/products.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/static/js/models_pushit.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/pushit/utils.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/.gitignore +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/RemoteEvents.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/arc4.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/cache.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/crypto/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/crypto/aes.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/crypto/privpub.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/crypto/util.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/datem.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/decorators.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/encryption.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/errors.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/extra/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/extra/json_metadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/fields.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/forms.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/helpers.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/joke.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/jwtoken.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/log.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/mail.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/mailman.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/management/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/management/commands/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/management/commands/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/cors.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/db_router.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/jwt.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/request.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/session.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/middleware/session_store.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/models/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/models/cacher.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/models/metadata.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/net.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/regexes.yaml +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/requestex.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/search.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/collection.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/csv.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/excel.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/json.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/legacy.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/localizers.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/model.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/profiler.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/response.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/serializers/util.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/settings_helper.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/ssl_check.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/static/lib/jquery.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/static/rest/app.css +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/static/rest/app.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/static/rest/rest.js +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/static/rest/rest.scss +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/templates/email/error.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/templates/email/error.subject +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/templates/rest_docs.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/templates/rest_html.html +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/ua.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/uberdict.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/url_docs.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/urls.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/rest/views.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/.gitignore +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/tests.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/sessionlog/views.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/periodic.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/transports/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/transports/email.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/transports/http.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/transports/s3.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/transports/sftp.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/transports/sms.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/taskqueue/worker.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/admin.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/decorators.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/migrations/0002_alter_sms_sid.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/models.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/phone_util.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/telephony/rpc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/migrations/0001_initial.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/migrations/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/models/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/models/faq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/models/page.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/models/revision.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/periodic.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/highlight.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/math.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/media.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/meta.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/task_list.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/renderers/mistune/toc.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/rpc/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/rpc/wiki.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/wiki/tq.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/README.md +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/client.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/connection.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/exceptions.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/redis.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/servers/__init__.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/servers/base.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/servers/django.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/servers/uwsgi.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/settings.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/utf8validator.py +0 -0
- {django_restit-4.2.78 → django_restit-4.2.80}/ws4redis/websocket.py +0 -0
@@ -73,6 +73,7 @@ class Event(JSONMetaData, rm.RestModel):
|
|
73
73
|
|
74
74
|
level = models.IntegerField(default=0, db_index=True)
|
75
75
|
category = models.CharField(max_length=124, db_index=True)
|
76
|
+
# code = models.IntegerField(default=0, db_index=True)
|
76
77
|
|
77
78
|
group = models.ForeignKey(
|
78
79
|
"account.Group", on_delete=models.SET_NULL,
|
@@ -47,5 +47,7 @@ class ServerOssecAlert(models.Model, rm.RestModel):
|
|
47
47
|
title = models.CharField(max_length=200, blank=True, null=True, default=None)
|
48
48
|
geoip = models.ForeignKey("location.GeoIP", blank=True, null=True, default=None, on_delete=models.DO_NOTHING)
|
49
49
|
|
50
|
+
metadata = None
|
51
|
+
|
50
52
|
def __str__(self):
|
51
53
|
return f'{self.hostname}: {self.title}'
|
@@ -0,0 +1,298 @@
|
|
1
|
+
from objict import objict
|
2
|
+
from datetime import datetime
|
3
|
+
import re
|
4
|
+
from .. import models as am
|
5
|
+
from location.models import GeoIP
|
6
|
+
|
7
|
+
IGNORE_RULES = [
|
8
|
+
"100020"
|
9
|
+
]
|
10
|
+
|
11
|
+
LEVEL_REMAP_BY_RULE = {
|
12
|
+
5402: 7,
|
13
|
+
5710: 5
|
14
|
+
}
|
15
|
+
|
16
|
+
NGINX_PARSE_PATTERN = re.compile(
|
17
|
+
r'(?P<src_ip>\d+\.\d+\.\d+\.\d+) - - \[(?P<http_time>.+?)\] '
|
18
|
+
r'(?P<http_method>\w+) (?P<http_url>.+?) (?P<http_protocol>[\w/.]+) '
|
19
|
+
r'(?P<http_status>\d+) (?P<http_bytes>\d+) (?P<http_referer>.+?) '
|
20
|
+
r'(?P<user_agent>.+?) (?P<http_elapsed>\d\.\d{3})'
|
21
|
+
)
|
22
|
+
|
23
|
+
def parse_nginx_line(line):
|
24
|
+
if "\n" in line:
|
25
|
+
for l in line.split('\n'):
|
26
|
+
match = NGINX_PARSE_PATTERN.match(l)
|
27
|
+
if match:
|
28
|
+
return match.groupdict()
|
29
|
+
return None
|
30
|
+
match = NGINX_PARSE_PATTERN.match(line)
|
31
|
+
if match:
|
32
|
+
return match.groupdict()
|
33
|
+
return None
|
34
|
+
|
35
|
+
|
36
|
+
def removeNonAscii(input_str):
|
37
|
+
"""Remove all non-ASCII characters and escaped byte sequences from the input string."""
|
38
|
+
# Remove escaped byte sequences
|
39
|
+
cleaned_str = re.sub(r'\\x[0-9a-fA-F]{2}', '', input_str)
|
40
|
+
# Remove non-ASCII characters
|
41
|
+
return ''.join(char for char in cleaned_str if 32 <= ord(char) < 128)
|
42
|
+
|
43
|
+
|
44
|
+
def extractURL(text):
|
45
|
+
match = re.search(r"(GET|POST|DELETE|PUT)\s+(https?://[^\s]+)\s+HTTP/\d\.\d", text)
|
46
|
+
if match:
|
47
|
+
return match.group(2)
|
48
|
+
return None
|
49
|
+
|
50
|
+
|
51
|
+
def extractDomain(text):
|
52
|
+
match = re.search(r"https?://([^/:]+)", text)
|
53
|
+
if match:
|
54
|
+
return match.group(1)
|
55
|
+
return None
|
56
|
+
|
57
|
+
|
58
|
+
def extractIP(text):
|
59
|
+
match = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", text)
|
60
|
+
if match:
|
61
|
+
return match.group(1)
|
62
|
+
return None
|
63
|
+
|
64
|
+
|
65
|
+
def extractUrlPath(text):
|
66
|
+
match = re.search(r"https?://[^/]+(/[^?]*)", text)
|
67
|
+
if match:
|
68
|
+
return match.group(1)
|
69
|
+
return None
|
70
|
+
|
71
|
+
|
72
|
+
def extractUserAgent(text):
|
73
|
+
# this only works if the referrer is '-'
|
74
|
+
match = re.search(r"' - (.+?) \d+\.\d+ \d+'", text)
|
75
|
+
if match:
|
76
|
+
return match.group(1)
|
77
|
+
return None
|
78
|
+
|
79
|
+
|
80
|
+
def extractMetaData(alert):
|
81
|
+
return parse_alert_metadata(alert)
|
82
|
+
|
83
|
+
|
84
|
+
DEFAULT_META_PATTERNS = {
|
85
|
+
"src_ip": re.compile(r"Src IP: (\S+)"),
|
86
|
+
"src_port": re.compile(r"Src Port: (\S+)"),
|
87
|
+
"user": re.compile(r"User: (\S+)"),
|
88
|
+
"path": re.compile(r"request: (\S+ \S+)"),
|
89
|
+
"http_server": re.compile(r"server: (\S+),"),
|
90
|
+
"http_host": re.compile(r"host: (\S+)"),
|
91
|
+
"http_referrer": re.compile(r"referrer: (\S+),"),
|
92
|
+
"client": re.compile(r"client: (\S+),"),
|
93
|
+
"upstream": re.compile(r"upstream: (\S+),")
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
def parse_alert_metadata(alert):
|
98
|
+
patterns = DEFAULT_META_PATTERNS
|
99
|
+
if alert.rule_id == "2501":
|
100
|
+
match = re.search(r'user (\w+) (\d+\.\d+\.\d+\.\d+) port (\d+)', alert.text)
|
101
|
+
if match:
|
102
|
+
return dict(username=match.group(1), src_ip=match.group(2), src_port=match.group(3))
|
103
|
+
elif alert.rule_id.startswith("311") or alert.rule_id in ["31516", "31508", "31516"]:
|
104
|
+
data = parse_nginx_line(alert.text)
|
105
|
+
if data:
|
106
|
+
return data
|
107
|
+
elif alert.rule_id in ["31301"]:
|
108
|
+
match = re.search(r'\((?P<error_code>\d+): (?P<error_message>.*?)\)', alert.text)
|
109
|
+
data = match_patterns(patterns, alert.text)
|
110
|
+
data["action"] = "error"
|
111
|
+
if match:
|
112
|
+
data.update(match.groupdict())
|
113
|
+
return data
|
114
|
+
elif alert.rule_id in ["31302", "31303"]:
|
115
|
+
match = re.search(r'\[(warn|crit|error)\].*?: (.*?),', alert.text)
|
116
|
+
data = match_patterns(patterns, alert.text)
|
117
|
+
|
118
|
+
if match:
|
119
|
+
data["action"] = match.group(1)
|
120
|
+
emsg = match.group(2)
|
121
|
+
if emsg[0] == "*":
|
122
|
+
emsg = emsg[emsg.find(' ')+1:]
|
123
|
+
data["error_message"] = emsg
|
124
|
+
return data
|
125
|
+
elif alert.rule_id == "551":
|
126
|
+
match = re.search(r"Integrity checksum changed for: '(\S+)'", alert.text)
|
127
|
+
if match:
|
128
|
+
return dict(filename=match.group(1), action="changed")
|
129
|
+
elif alert.rule_id == "554":
|
130
|
+
match = re.search(r"New file '(\S+)' added", alert.text)
|
131
|
+
if match:
|
132
|
+
return dict(filename=match.group(1), action="added")
|
133
|
+
elif alert.rule_id == "5402":
|
134
|
+
match = re.search(r'(?P<username>[\w-]+) : PWD=(?P<pwd>\S+) ; USER=(?P<user>\w+) ; COMMAND=(?P<command>.+)', alert.text)
|
135
|
+
if match:
|
136
|
+
return match.groupdict()
|
137
|
+
match = re.search(r'(?P<username>[\w-]+) : TTY=(?P<tty>\S+) ; PWD=(?P<pwd>\S+) ; USER=(?P<user>\w+) ; COMMAND=(?P<command>.+)', alert.text)
|
138
|
+
if match:
|
139
|
+
return match.groupdict()
|
140
|
+
elif alert.rule_id in ["5501", "5502"]:
|
141
|
+
match = re.search(r"session (?P<action>\S+) for user (?P<username>\S+)*", alert.text)
|
142
|
+
if match:
|
143
|
+
return match.groupdict()
|
144
|
+
elif alert.rule_id in ["5704", "5705"]:
|
145
|
+
match = re.search(r"(?P<src_ip>\d{1,3}(?:\.\d{1,3}){3}) port (?P<src_port>\d+)", alert.text)
|
146
|
+
if match:
|
147
|
+
return match.groupdict()
|
148
|
+
elif alert.rule_id == "5715":
|
149
|
+
match = re.search(r'Accepted publickey for (?P<username>\S+) from (?P<src_ip>\d+\.\d+\.\d+\.\d+) .*: (?P<ssh_key_type>\S+) (?P<ssh_signature>\S+)', alert.text)
|
150
|
+
if match:
|
151
|
+
return match.groupdict()
|
152
|
+
elif alert.rule_id == "2932":
|
153
|
+
match = re.search(r"Installed: (\S+)", alert.text)
|
154
|
+
if match:
|
155
|
+
return dict(package=match.group(1))
|
156
|
+
return match_patterns(patterns, alert.text)
|
157
|
+
|
158
|
+
def match_patterns(patterns, text):
|
159
|
+
# Search for matches in the text
|
160
|
+
return {key: pattern.search(text).group(1) for key, pattern in patterns.items() if pattern.search(text)}
|
161
|
+
|
162
|
+
|
163
|
+
def parse_alert_json(data):
|
164
|
+
try:
|
165
|
+
if isinstance(data, str):
|
166
|
+
data = objict.fromJSON(data.replace('\n', '\\n'))
|
167
|
+
except Exception:
|
168
|
+
data = objict.fromJSON(removeNonAscii(data))
|
169
|
+
for key in data:
|
170
|
+
data[key] = data[key].strip()
|
171
|
+
return data
|
172
|
+
|
173
|
+
|
174
|
+
def ignore_alert(alert):
|
175
|
+
if alert.rule_id in IGNORE_RULES:
|
176
|
+
return True
|
177
|
+
if alert.rule_id == "510" and "/dev/.mount/utab" in alert.text:
|
178
|
+
return True
|
179
|
+
return False
|
180
|
+
|
181
|
+
|
182
|
+
def parse_alert_id(details):
|
183
|
+
match = re.search(r"Alert (\d+\.\d+):", details)
|
184
|
+
if match:
|
185
|
+
return match.group(1)
|
186
|
+
return ""
|
187
|
+
|
188
|
+
|
189
|
+
def parse_rule_details(details):
|
190
|
+
alert_id = parse_alert_id(details)
|
191
|
+
rule_pattern = r"Rule: (\d+) \(level (\d+)\) -> '([^']+)'"
|
192
|
+
match = re.search(rule_pattern, details)
|
193
|
+
if match:
|
194
|
+
return objict(
|
195
|
+
rid=int(match.group(1)), level=int(match.group(2)),
|
196
|
+
title=match.group(3), alert_id=alert_id)
|
197
|
+
return objict(alert_id=alert_id)
|
198
|
+
|
199
|
+
|
200
|
+
def parse_when(alert):
|
201
|
+
return datetime.utcfromtimestamp(int(alert.alert_id[:alert.alert_id.find(".")]))
|
202
|
+
|
203
|
+
|
204
|
+
def truncate_str(text, length):
|
205
|
+
if len(text) > length:
|
206
|
+
text = text[:length]
|
207
|
+
text = text[:text.rfind(' ')] + "..."
|
208
|
+
return text
|
209
|
+
|
210
|
+
|
211
|
+
def update_by_rule(data, geoip=None):
|
212
|
+
if data.rule_id == "2501":
|
213
|
+
data.title = f"SSH Auth Attempt {data.username}@{data.hostname} from {data.src_ip}"
|
214
|
+
elif data.rule_id == "2503" and data.src_ip:
|
215
|
+
data.title = f"SSH Auth Blocked from {data.src_ip}"
|
216
|
+
elif data.rule_id == "31101" and data.http_status:
|
217
|
+
data.title = f"Web {data.http_status} {data.http_method} {data.http_url} from {data.src_ip}"
|
218
|
+
elif data.rule_id == "31104" and data.http_status:
|
219
|
+
data.title = f"Web Attack {data.http_status} {data.http_method} {data.http_url} from {data.src_ip}"
|
220
|
+
elif data.rule_id == "31111" and data.http_status:
|
221
|
+
if geoip and geoip.isp:
|
222
|
+
data.title = f"No referrer for .js - {data.http_status} {data.http_method} {data.http_url} from {data.src_ip}({geoip.isp})"
|
223
|
+
else:
|
224
|
+
data.title = f"No referrer for .js - {data.http_status} {data.http_method} {data.http_url} from {data.src_ip}"
|
225
|
+
elif data.rule_id in ["31151", "31152", "31153"] and data.http_status:
|
226
|
+
url = truncate_str(data.http_url, 50)
|
227
|
+
data.title = f"Suspected Web Scan {url} from {data.src_ip}"
|
228
|
+
elif data.rule_id == "31120" and data.http_status:
|
229
|
+
url = truncate_str(data.http_url, 50)
|
230
|
+
data.title = f"Web Error {data.http_status} {data.http_method} {url} from {data.src_ip}"
|
231
|
+
elif data.rule_id.startswith("311") and data.http_status:
|
232
|
+
url = truncate_str(data.http_url, 50)
|
233
|
+
data.title = f"Web {data.http_status} {data.http_method} {url} from {data.src_ip}"
|
234
|
+
elif data.rule_id in ["31301", "31302", "31303"] and data.error_message:
|
235
|
+
if data.upstream and "ws/events" in data.upstream:
|
236
|
+
data.title = f"Websocket Error: {data.error_message} on {data.hostname}"
|
237
|
+
else:
|
238
|
+
emsg = truncate_str(data.error_message, 50)
|
239
|
+
data.title = f"Nginx {data.action}: {emsg} from {data.src_ip}"
|
240
|
+
elif data.rule_id == "31516" and data.http_url:
|
241
|
+
url = truncate_str(data.http_url, 50)
|
242
|
+
data.title = f"Web Suspicious {data.http_status} {data.http_method} {url} from {data.src_ip}"
|
243
|
+
elif data.rule_id == "533":
|
244
|
+
data.title = f"Network Open Port Change Detected on {data.hostname}"
|
245
|
+
elif data.rule_id == "5402":
|
246
|
+
cmd = truncate_str(data.command, 50)
|
247
|
+
data.title = f"Sudo(user: {data.user}) executed '{cmd}' on {data.hostname}"
|
248
|
+
elif data.rule_id in ["551", "554"] and data.filename:
|
249
|
+
name = truncate_str(data.filename, 50)
|
250
|
+
data.title = f"File {data.action.capitalize()} on {data.hostname}: {name}"
|
251
|
+
elif data.rule_id in ["5501", "5502"]:
|
252
|
+
if "sudo" in data.text:
|
253
|
+
data.title = f"Server Login {data.action} via sudo on {data.hostname}"
|
254
|
+
else:
|
255
|
+
data.title = f"Server Login {data.action} on {data.hostname}"
|
256
|
+
elif data.rule_id == "5715":
|
257
|
+
data.title = f"SSH Login Detected: {data.username}@{data.hostname} from {data.src_ip}"
|
258
|
+
elif data.rule_id == "2932" and data.package:
|
259
|
+
package = truncate_str(data.package, 60)
|
260
|
+
data.title = f"Package Installed on {data.hostname}: {package}"
|
261
|
+
elif data.src_ip and data.src_ip not in data.title:
|
262
|
+
data.title = f"{data.title} Source IP: {data.src_ip}"
|
263
|
+
if len(data.title) > 199:
|
264
|
+
data.title = data.title[:199]
|
265
|
+
|
266
|
+
def parse_incoming_alert(data):
|
267
|
+
alert = parse_alert_json(data)
|
268
|
+
if ignore_alert(alert):
|
269
|
+
return None
|
270
|
+
alert.update(parse_rule_details(alert.text))
|
271
|
+
if alert.title is None:
|
272
|
+
return None
|
273
|
+
alert.update(parse_alert_metadata(alert))
|
274
|
+
if alert.src_ip in ["-", None] and alert.client:
|
275
|
+
alert.src_ip = alert.client
|
276
|
+
if alert.ext_ip in ["-", None]:
|
277
|
+
alert.ext_ip = alert.src_ip
|
278
|
+
update_by_rule(alert)
|
279
|
+
return alert
|
280
|
+
|
281
|
+
|
282
|
+
def parseAlert(request, data):
|
283
|
+
pdata = parse_incoming_alert(data)
|
284
|
+
if pdata is None:
|
285
|
+
return None
|
286
|
+
field_names = am.ServerOssecAlert.get_model_field_names()
|
287
|
+
soa = am.ServerOssecAlert(**{key:value for key, value in pdata.items() if key in field_names})
|
288
|
+
soa.when = parse_when(pdata)
|
289
|
+
soa.metadata = pdata
|
290
|
+
if soa.src_ip is not None and len(soa.src_ip) > 6 and soa.src_ip != "127.0.0.1":
|
291
|
+
soa.geoip = GeoIP.lookup(soa.src_ip)
|
292
|
+
update_by_rule(pdata, soa.geoip)
|
293
|
+
soa.title = pdata.title
|
294
|
+
soa.save()
|
295
|
+
return soa
|
296
|
+
|
297
|
+
|
298
|
+
|
@@ -61,6 +61,7 @@ def ossec_alert_creat_from_request(request):
|
|
61
61
|
if payload:
|
62
62
|
try:
|
63
63
|
# TODO make this a task (background it)
|
64
|
+
rh.log_error("parsing payload", payload)
|
64
65
|
od = ossec.parseAlert(request, payload)
|
65
66
|
# lets now create a local event
|
66
67
|
if od is not None:
|
@@ -78,14 +79,14 @@ def ossec_alert_creat_from_request(request):
|
|
78
79
|
elif od.level <= 3:
|
79
80
|
level = 8
|
80
81
|
metadata = od.toDict(graph="default")
|
81
|
-
metadata.update(
|
82
|
+
metadata.update(od.metadata)
|
82
83
|
# we reuse the ssh_sig because it is a text field to store urls
|
83
|
-
ssh_sig = metadata.get("ssh_sig", None)
|
84
|
-
if ssh_sig is not None and ssh_sig.startswith("http"):
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
84
|
+
# ssh_sig = metadata.get("ssh_sig", None)
|
85
|
+
# if ssh_sig is not None and ssh_sig.startswith("http"):
|
86
|
+
# metadata["url"] = ssh_sig
|
87
|
+
# metadata["domain"] = ossec.extractDomain(ssh_sig)
|
88
|
+
# metadata["path"] = ossec.extractUrlPath(ssh_sig)
|
89
|
+
# metadata.pop("ssh_sig")
|
89
90
|
if od.geoip:
|
90
91
|
metadata["country"] = od.geoip.country
|
91
92
|
metadata["city"] = od.geoip.city
|
@@ -103,7 +104,9 @@ def ossec_alert_creat_from_request(request):
|
|
103
104
|
"reporter_ip": od.src_ip,
|
104
105
|
"metadata": metadata
|
105
106
|
})
|
107
|
+
return rv.restStatus(request, True)
|
106
108
|
except Exception as err:
|
109
|
+
rh.log_exception()
|
107
110
|
stack = rh.getStackString()
|
108
111
|
# rh.log_exception("during ossec alert", payload)
|
109
112
|
metadata = dict(ip=request.ip, payload=payload)
|
@@ -115,6 +118,7 @@ def ossec_alert_creat_from_request(request):
|
|
115
118
|
"category": "ossec_error",
|
116
119
|
"metadata": metadata
|
117
120
|
})
|
121
|
+
rh.log_error("ossec alert", request.DATA.asDict())
|
118
122
|
return rv.restStatus(request, False, error="no alert data")
|
119
123
|
|
120
124
|
|
@@ -1718,6 +1718,10 @@ class RestModel(object):
|
|
1718
1718
|
def get_related_name_fields(cls):
|
1719
1719
|
return [f.related_name for f in cls._meta.related_objects]
|
1720
1720
|
|
1721
|
+
@classmethod
|
1722
|
+
def get_model_field_names(cls):
|
1723
|
+
return [f.name for f in cls._meta.get_fields()]
|
1724
|
+
|
1721
1725
|
@classmethod
|
1722
1726
|
def get_fk_model(cls, fieldname):
|
1723
1727
|
'''returns None if not foreignkey, otherswise the relevant model'''
|
@@ -1,227 +0,0 @@
|
|
1
|
-
from objict import objict
|
2
|
-
from datetime import datetime
|
3
|
-
import re
|
4
|
-
from .. import models as am
|
5
|
-
from location.models import GeoIP
|
6
|
-
|
7
|
-
IGNORE_RULES = [
|
8
|
-
"100020"
|
9
|
-
]
|
10
|
-
|
11
|
-
LEVEL_REMAP_BY_RULE = {
|
12
|
-
5402: 7,
|
13
|
-
5710: 5
|
14
|
-
}
|
15
|
-
|
16
|
-
|
17
|
-
def removeNonAscii(input_str):
|
18
|
-
"""Remove all non-ASCII characters and escaped byte sequences from the input string."""
|
19
|
-
# Remove escaped byte sequences
|
20
|
-
cleaned_str = re.sub(r'\\x[0-9a-fA-F]{2}', '', input_str)
|
21
|
-
# Remove non-ASCII characters
|
22
|
-
return ''.join(char for char in cleaned_str if 32 <= ord(char) < 128)
|
23
|
-
|
24
|
-
|
25
|
-
def extractURL(text):
|
26
|
-
match = re.search(r"GET\s+(https?://[^\s]+)\s+HTTP/\d\.\d", text)
|
27
|
-
if match:
|
28
|
-
return match.group(1)
|
29
|
-
return None
|
30
|
-
|
31
|
-
|
32
|
-
def extractDomain(text):
|
33
|
-
match = re.search(r"https?://([^/:]+)", text)
|
34
|
-
if match:
|
35
|
-
return match.group(1)
|
36
|
-
return None
|
37
|
-
|
38
|
-
|
39
|
-
def extractUrlPath(text):
|
40
|
-
match = re.search(r"https?://[^/]+(/[^?]*)", text)
|
41
|
-
if match:
|
42
|
-
return match.group(1)
|
43
|
-
return None
|
44
|
-
|
45
|
-
|
46
|
-
def extractMetaData(alert):
|
47
|
-
irule = int(alert.rule_id)
|
48
|
-
if irule in [31301, 31302, 31303]:
|
49
|
-
patterns = {
|
50
|
-
"src_ip": re.compile(r"Src IP: (\S+)"),
|
51
|
-
"path": re.compile(r"request: (\S+ \S+)"),
|
52
|
-
"http_server": re.compile(r"server: (\S+)"),
|
53
|
-
"http_host": re.compile(r"host: (\S+)"),
|
54
|
-
"http_referrer": re.compile(r"referrer: (\S+)")
|
55
|
-
}
|
56
|
-
# Search for matches in the text
|
57
|
-
return {key: pattern.search(alert.text).group(1) for key, pattern in patterns.items() if pattern.search(alert.text)}
|
58
|
-
return {}
|
59
|
-
|
60
|
-
|
61
|
-
def parseAlert(request, data):
|
62
|
-
# helpers.log_print(data)
|
63
|
-
try:
|
64
|
-
data = objict.fromJSON(data.replace('\n', '\\n'))
|
65
|
-
except Exception:
|
66
|
-
data = objict.fromJSON(removeNonAscii(data))
|
67
|
-
for key in data:
|
68
|
-
data[key] = data[key].strip()
|
69
|
-
|
70
|
-
if data.rule_id in IGNORE_RULES:
|
71
|
-
return None
|
72
|
-
if "test" in data.hostname and data.rule_id == "533":
|
73
|
-
# bug on test ossec falsely report 533 events
|
74
|
-
return None
|
75
|
-
if data.rule_id == "510" and "/dev/.mount/utab" in data.text:
|
76
|
-
return None
|
77
|
-
# we care not for this field for now
|
78
|
-
data.pop("logfile", None)
|
79
|
-
if not data.text:
|
80
|
-
raise Exception("invalid or missing json")
|
81
|
-
alert = am.ServerOssecAlert(**data)
|
82
|
-
alert.when = datetime.utcfromtimestamp(int(data.alert_id[:data.alert_id.find(".")]))
|
83
|
-
# now lets parse the title
|
84
|
-
title = alert.text[alert.text.find("Rule:") + 5:]
|
85
|
-
# level to int
|
86
|
-
level = title[title.find('(level') + 7:]
|
87
|
-
alert.level = int(level[:level.find(')')].strip())
|
88
|
-
title = title[:title.find('\n')].strip()
|
89
|
-
pos = title.find("->")
|
90
|
-
if pos > 0:
|
91
|
-
title = title[pos + 2:]
|
92
|
-
alert.title = title
|
93
|
-
if alert.title.startswith("'"):
|
94
|
-
alert.title = alert.title[1:-1]
|
95
|
-
|
96
|
-
if data.hostname == "test":
|
97
|
-
if data.rule_id == "31120" or "Web server" in title:
|
98
|
-
return None
|
99
|
-
|
100
|
-
# helpers.log_print(title, alert.title)
|
101
|
-
# source ip (normally public ip of host)
|
102
|
-
pos = alert.text.find("Src IP:")
|
103
|
-
if pos > 1:
|
104
|
-
src_ip = alert.text[alert.text.find("Src IP:") + 7:]
|
105
|
-
alert.src_ip = src_ip[:src_ip.find('\n')].strip()
|
106
|
-
|
107
|
-
irule = int(alert.rule_id)
|
108
|
-
if irule == 5710:
|
109
|
-
m = re.search(r"Invalid user (\S+) from (\S+)", data.text)
|
110
|
-
if m and m.groups():
|
111
|
-
alert.username = m.group(1)
|
112
|
-
alert.src_ip = m.group(2).strip()
|
113
|
-
alert.title = f"Attempt to login with invalid user: {alert.username}"
|
114
|
-
else:
|
115
|
-
m = re.search(r"Invalid user from (\S+)", data.text)
|
116
|
-
if m and m.groups():
|
117
|
-
alert.username = "(empty string)"
|
118
|
-
alert.src_ip = m.group(1).strip()
|
119
|
-
elif irule == 2932:
|
120
|
-
m = re.search(r"Installed: (\S+)", data.text)
|
121
|
-
if m and m.groups():
|
122
|
-
package = m.group(1)
|
123
|
-
alert.title = "Yum Package Installed: {}".format(package)
|
124
|
-
elif irule == 551:
|
125
|
-
# Integrity checksum changed for: '/etc/ld.so.cache'
|
126
|
-
m = re.search(r"Integrity checksum changed for: '(\S+)'", data.text)
|
127
|
-
if m and m.groups():
|
128
|
-
action = m.group(1)
|
129
|
-
alert.title = "File Changed: {}".format(action)
|
130
|
-
elif irule == 5715:
|
131
|
-
m = re.search(r"Accepted publickey for (\S+).*ssh2: ([^\n\r]*)", data.text)
|
132
|
-
if m and m.groups():
|
133
|
-
ssh_sig = m.group(2)
|
134
|
-
if " " in ssh_sig:
|
135
|
-
kind, ssh_sig = ssh_sig.split(' ')
|
136
|
-
alert.level = 8
|
137
|
-
alert.username = m.group(1)
|
138
|
-
alert.ssh_sig = ssh_sig
|
139
|
-
alert.ssh_kind = kind
|
140
|
-
alert.title = f"SSH LOGIN:{alert.username}@{alert.hostname} from {alert.src_ip}"
|
141
|
-
# member = findUserBySshSig(ssh_sig)
|
142
|
-
# if member:
|
143
|
-
# alert.title = "SSH LOGIN user: {}".format(member.username)
|
144
|
-
elif irule == 5501 or irule == 5502:
|
145
|
-
# pam_unix(sshd:session): session opened for user git by (uid=0)
|
146
|
-
m = re.search(r"session (\S+) for user (\S+)*", data.text)
|
147
|
-
if m and m.groups():
|
148
|
-
alert.action = m.group(1)
|
149
|
-
alert.username = m.group(2)
|
150
|
-
alert.title = f"session {alert.action} for user {alert.username}"
|
151
|
-
elif irule == 5402:
|
152
|
-
# TTY=pts/0 ; PWD=/opt/mm_protector ; USER=root ; COMMAND=/sbin/iptables -F
|
153
|
-
m = re.search(r"sudo(?:\[\d+\])?:\s*(\S+).*?COMMAND=([^\n\r]*)", data.text)
|
154
|
-
# m = re.search(r"sudo:\s*(\S+).*COMMAND=([^\n\r]*)", data.text)
|
155
|
-
if m and m.groups():
|
156
|
-
alert.username = m.group(1)
|
157
|
-
alert.title = "sudo {}".format(m.group(2)).replace("#040", " ")
|
158
|
-
alert.level = 7
|
159
|
-
elif irule == 5706:
|
160
|
-
m = re.search(r"identification string from (\S+) port (\S+)", data.text)
|
161
|
-
if m and m.groups():
|
162
|
-
alert.src_ip = m.group(1)
|
163
|
-
elif irule == 5702:
|
164
|
-
m = re.search(r"getaddrinfo for (\S+)", data.text)
|
165
|
-
if m and m.groups():
|
166
|
-
remote_host = m.group(1)
|
167
|
-
alert.title = f"Reverse lookup failed for '{remote_host}'"
|
168
|
-
elif irule == 554:
|
169
|
-
m = re.search(r"New file '(\S+)' added", data.text)
|
170
|
-
if m and m.groups():
|
171
|
-
remote_file = m.group(1)
|
172
|
-
alert.title = f"New file detected: '{remote_file}'"
|
173
|
-
elif irule == 31101:
|
174
|
-
m = re.search(r"(GET|POST|DELETE|PUT)\s+(http://[^\s]+)\s+HTTP/\d\.\d\s+(\d+)", data.text)
|
175
|
-
if m and m.groups():
|
176
|
-
code = m.group(3)
|
177
|
-
method = m.group(1)
|
178
|
-
request_path = m.group(2)
|
179
|
-
alert.title = f"HTTP {code}: {METHOD} {request_path}"
|
180
|
-
elif irule == 31104 or irule == 31516:
|
181
|
-
m = re.search(r"(GET|POST|DELETE|PUT)\s+(http://[^\s]+)\s+HTTP/\d\.\d\s+(\d+)", data.text)
|
182
|
-
if m and m.groups():
|
183
|
-
code = m.group(3)
|
184
|
-
method = m.group(1)
|
185
|
-
request_path = m.group(2)
|
186
|
-
kind = "Common"
|
187
|
-
if irule == 31516:
|
188
|
-
kind = "Suspect"
|
189
|
-
alert.title = f"{kind} Attack {code}: {METHOD} {request_path}"
|
190
|
-
elif irule in [31301, 31302, 31303]:
|
191
|
-
m = re.search(r"(\[error\]|\[crit\])[^\*]*\*\d*\s+(.*?),", data.text)
|
192
|
-
if m and len(m.groups()) >=2:
|
193
|
-
alert.title = error
|
194
|
-
elif irule == 100020:
|
195
|
-
m = re.search(r"\[(\S+)\]", data.text)
|
196
|
-
if m and m.groups():
|
197
|
-
alert.src_ip = m.group(1)
|
198
|
-
elif "web,accesslog," in data.text and "https:" in data.text:
|
199
|
-
alert.ssh_sig = extractURL(data.text)
|
200
|
-
if alert.ssh_sig:
|
201
|
-
alert.hostname = extractDomain(alert.ssh_sig)
|
202
|
-
|
203
|
-
if alert.ext_ip is None:
|
204
|
-
alert.ext_ip = alert.src_ip
|
205
|
-
if alert.src_ip is not None and len(alert.src_ip) > 6:
|
206
|
-
# lets do a lookup for the src
|
207
|
-
alert.geoip = GeoIP.lookup(alert.src_ip)
|
208
|
-
|
209
|
-
if irule == 31111:
|
210
|
-
url = alert.ssh_sig
|
211
|
-
hostname = alert.hostname
|
212
|
-
if url:
|
213
|
-
hostname = extractDomain(url)
|
214
|
-
if alert.geoip and alert.geoip.isp:
|
215
|
-
alert.title = f"Suspicious fetch of .js, {hostname} ISP: {alert.geoip.isp}"
|
216
|
-
else:
|
217
|
-
alert.title = f"Suspicious fetch of .js, {hostname}"
|
218
|
-
# finally here we change the alert level
|
219
|
-
if irule in LEVEL_REMAP_BY_RULE:
|
220
|
-
alert.level = LEVEL_REMAP_BY_RULE[irule]
|
221
|
-
if alert.title[0] in ["'", '"']:
|
222
|
-
alert.title = alert.title[1:-1]
|
223
|
-
if len(alert.title) > 80:
|
224
|
-
alert.title = alert.title[:80] + "..."
|
225
|
-
alert.save()
|
226
|
-
return alert
|
227
|
-
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0003_member_phone_number.py
RENAMED
File without changes
|
File without changes
|
{django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0005_member_auth_code_expires.py
RENAMED
File without changes
|
{django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0006_member_security_token.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0009_alter_member_phone_number.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.78 → django_restit-4.2.80}/account/migrations/0012_settings_settingsmetadata.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|