django-restit 4.2.174__tar.gz → 4.2.176__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.174 → django_restit-4.2.176}/PKG-INFO +1 -1
- django_restit-4.2.176/account/migrations/0023_authsession_method.py +18 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/member.py +42 -29
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/session.py +3 -2
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/auth.py +23 -12
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/oauth.py +16 -15
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/passkeys.py +1 -1
- {django_restit-4.2.174 → django_restit-4.2.176}/pyproject.toml +1 -1
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/__init__.py +1 -1
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/mail.py +7 -4
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/response.py +1 -1
- {django_restit-4.2.174 → django_restit-4.2.176}/LICENSE.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/fcm/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/fcm/legacy.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/fcm/v1.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0003_member_phone_number.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0005_member_auth_code_expires.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0006_member_security_token.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0009_alter_member_phone_number.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0010_delete_authtoken.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0011_authtoken.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0012_settings_settingsmetadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0013_memberdevice_ip.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0014_alter_notificationmemberrecord_member.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0015_memberdevice_buid.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0016_authsession_buid.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0017_rename_requires_topt_member_requires_totp.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0018_userpasskey.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0019_group_location.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0021_alter_cloudcredentials_group.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0022_alter_memberdevice_modified.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/device.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/feeds.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/group.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/legacy.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/membership.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/notify.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/passkeys.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/models/settings.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/oauth/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/oauth/google.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/passkeys/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/passkeys/core.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/periodic.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/device.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/group.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/member.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/notify.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/rpc/settings.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/settings.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/base.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/invite.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/plain/base.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/plain/invite.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/plain/reset_code.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/reset_code.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/simple/invite.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/simple/reset_code.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/account/templates/unsubscribed.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/README +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/cloudwatch.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/decorators.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/middleware.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/migrations/0002_alter_persistentlog_session.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/periodic.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/auditlog/urls.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/handlers.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/migrations/0002_alter_message_cc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/migrations/0003_attachment_content_type.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/migrations/0004_mailtemplate.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/migrations/0005_alter_mailbox_state.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/models/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/models/bounce.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/models/complaint.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/models/message.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/models/template.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/utils/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/utils/parsing.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/utils/render.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/inbox/utils/sending.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0002_event_component_event_component_id.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0003_rule_action.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0006_delete_eventmetadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0007_event_metadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0009_incident_reporter_ip.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0010_incident_category_incident_component_id.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0011_ticket.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0012_rule_match_by.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0013_rulecheck_is_required.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0014_event_group_alter_rulecheck_index.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0015_rule_title_template_alter_incident_state.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/0016_rule_notify_template.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/models/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/models/event.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/models/incident.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/models/ossec.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/models/rules.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/models/ticket.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/parsers/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/parsers/ossec.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/periodic.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/templates/email/incident_change.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/templates/email/incident_msg.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/templates/email/incident_new.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/templates/email/incident_plain.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/incident/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/geolocate.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/migrations/0003_address_postalcode_suffix.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/migrations/0004_remove_address_modified_by_address_group_and_more.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/models/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/models/address.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/models/ip.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/models/legacy.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/models/location.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/models/track.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/abstractapi.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/abuse.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/extremeip.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/geoplugin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/ipapi.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/ipinfo.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/iplookup/restit.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/location/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/location/google.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/timezones/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/timezones/google.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/providers/zillow.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/rpc/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/rpc/address.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/rpc/ip.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/rpc/location.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/location/rpc/track.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/caching.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/cvutil/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/cvutil/contours.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/cvutil/images.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/cvutil/misc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/cvutil/text.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/fixtures/initial_data.json +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/fixtures/medialib.json +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/fixtures/medialib_test_fixture.json +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/forms.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/migrations/0002_alter_mediaitemrendition_bytes.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/ocr.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/pdf.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/qrcode.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/anigif.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/ffmpeg.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/gifsicle.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/hls.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/mp4box.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/rtmp/Makefile +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/rtmp/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/rtmp/rtmp.i +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/rtmpdump.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/rtmpsink.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/video_getinfo.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/engines/websnap.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/exceptions.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/akamai.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/animated_thumbnail.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/ffmpeg.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/flv.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/hls.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/image_transcode.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/image_validate.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/mp4.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/video_still.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/video_validate.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/websnap.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/presets/youtube.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/render_utils.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/render/schedule.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/rpc/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/rpc/legacy.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/rpc/media.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/rpc/tools.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/scripts/init_config +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/css/base_medialibui.css +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/css/base_widgets.css +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/css/jquery.jcrop.css +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/arrow-down-white.png +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/bg-body.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/cancel.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/icon-generic.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/icon-image.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/icon-media.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/icon-zip.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/loading.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/noimage.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/render_err.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/rendering.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/star_off.png +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/star_on.png +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/img/unknown.gif +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/caman.full.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/hammer.min.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/jquery.Jcrop.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/jquery.hammer.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/load-image.min.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/swiper.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/channel.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/discovery.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/errors.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/http.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/model.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/apiclient/schema.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/filestore.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/httplib2/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/httplib2/socks.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/httpstore.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/nullstore.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/appengine.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/client.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/crypt.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/file.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/gce.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/old_run.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/tools.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/util.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/rtmpstore.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/s3.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/s3store.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/uritemplate/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/stores/youtubestore.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/base.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/instances.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/items.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/library.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_error.subject +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_error.to +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_error.txt +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_ready.subject +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_ready.to +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_ready.txt +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_render_error.subject +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_render_error.to +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_render_error.txt +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_validate_error.subject +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_validate_error.to +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/notify_validate_error.txt +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/smil +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/test.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/templates/medialib/testpicker.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/tests.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/urls.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/utils.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/views.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/channel.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/discovery.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/errors.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/http.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/model.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/apiclient/schema.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/httplib2/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/httplib2/socks.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/appengine.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/client.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/crypt.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/file.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/gce.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/old_run.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/tools.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/util.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/upload.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/medialib/youtube/uritemplate/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/client.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/eod.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/examples/eod_example.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/delete_gauge.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/delete_metric.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/generate_test_metrics.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/reset_weekly_metrics.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/management/commands/system_metric.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/migrations/0003_metrics_expires.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/migrations/0004_eodmetrics.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/periodic.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/providers/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/providers/aws.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/settings.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/metrics/utils.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/rpc/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/rpc/githooks.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/rpc/legacy.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/rpc/products.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/static/js/models_pushit.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/pushit/utils.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/.gitignore +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/RemoteEvents.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/arc4.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/cache.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/crypto/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/crypto/aes.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/crypto/privpub.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/crypto/util.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/datem.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/decorators.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/encryption.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/errors.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/extra/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/extra/hostinfo.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/extra/json_metadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/fields.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/forms.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/helpers.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/joke.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/jwtoken.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/log.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/mailman.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/management/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/management/commands/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/management/commands/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/cors.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/db_router.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/jwt.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/request.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/session.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/middleware/session_store.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/models/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/models/base.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/models/cacher.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/models/metadata.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/net.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/regexes.yaml +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/requestex.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/search.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/collection.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/csv.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/excel.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/json.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/legacy.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/localizers.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/model.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/profiler.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/serializers/util.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/service.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/settings_helper.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/ssl_check.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/static/lib/jquery.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/static/rest/app.css +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/static/rest/app.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/static/rest/rest.js +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/static/rest/rest.scss +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/templates/email/error.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/templates/email/error.subject +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/templates/rest_docs.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/templates/rest_html.html +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/ua.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/uberdict.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/url_docs.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/urls.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/rest/views.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/.gitignore +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/tests.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/sessionlog/views.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/periodic.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/transports/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/transports/email.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/transports/http.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/transports/s3.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/transports/sftp.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/transports/sms.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/taskqueue/worker.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/admin.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/decorators.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/migrations/0002_alter_sms_sid.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/models.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/phone_util.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/telephony/rpc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/migrations/0001_initial.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/migrations/0002_alter_pagemedia_entry.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/migrations/0003_page_perms.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/migrations/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/models/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/models/faq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/models/page.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/models/revision.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/periodic.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/highlight.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/math.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/media.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/meta.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/task_list.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/renderers/mistune/toc.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/rpc/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/rpc/wiki.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/wiki/tq.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/README.md +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/client.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/connection.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/exceptions.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/redis.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/servers/__init__.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/servers/base.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/servers/django.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/servers/uwsgi.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/settings.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/utf8validator.py +0 -0
- {django_restit-4.2.174 → django_restit-4.2.176}/ws4redis/websocket.py +0 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated by Django 4.2.18 on 2025-03-23 19:54
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
('account', '0022_alter_memberdevice_modified'),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AddField(
|
14
|
+
model_name='authsession',
|
15
|
+
name='method',
|
16
|
+
field=models.CharField(blank=True, db_index=True, default=None, max_length=127, null=True),
|
17
|
+
),
|
18
|
+
]
|
@@ -149,7 +149,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
149
149
|
display_name = models.CharField(max_length=64, blank=True, null=True, default=None)
|
150
150
|
picture = models.ForeignKey("medialib.MediaItem", blank=True, null=True, help_text="Profile picture", related_name='+', on_delete=models.CASCADE)
|
151
151
|
|
152
|
-
# we use this token to allow us to invalidate JWT tokens
|
152
|
+
# we use this token to allow us to invalidate JWT tokens
|
153
153
|
security_token = models.CharField(max_length=64, blank=True, null=True, default=None, db_index=True)
|
154
154
|
auth_code = models.CharField(max_length=64, blank=True, null=True, default=None, db_index=True)
|
155
155
|
auth_code_expires = models.DateTimeField(blank=True, null=True, default=None)
|
@@ -263,6 +263,24 @@ class Member(User, RestModel, MetaDataModel):
|
|
263
263
|
return self.has_usable_password()
|
264
264
|
return False
|
265
265
|
|
266
|
+
def getFailedLoginCount(self):
|
267
|
+
c = RemoteEvents.hget("users:failed:username", self.username)
|
268
|
+
if c is not None:
|
269
|
+
return int(c)
|
270
|
+
return c
|
271
|
+
|
272
|
+
@classmethod
|
273
|
+
def GetFailedLoginsForIP(cls, ip):
|
274
|
+
c = RemoteEvents.hget("users:failed:ip", ip)
|
275
|
+
if c is not None:
|
276
|
+
return int(c)
|
277
|
+
return c
|
278
|
+
|
279
|
+
@classmethod
|
280
|
+
def GetIPsWithFailedLoginAttempts(cls, threshold):
|
281
|
+
failed_ips = RemoteEvents.hgetall("users:failed:ip")
|
282
|
+
return {ip: int(count) for ip, count in failed_ips.items() if int(count) > threshold}
|
283
|
+
|
266
284
|
def recordFailedLogin(self, request):
|
267
285
|
c = RemoteEvents.hincrby("users:failed:username", self.username, 1)
|
268
286
|
if c >= settings.LOCK_PASSWORD_ATTEMPTS:
|
@@ -273,13 +291,15 @@ class Member(User, RestModel, MetaDataModel):
|
|
273
291
|
"account", f"incorrect password for {self.username}", level=8,
|
274
292
|
error_code=498,
|
275
293
|
request=request)
|
276
|
-
|
294
|
+
ic = RemoteEvents.hincrby("users:failed:ip", request.ip, 1)
|
295
|
+
return c
|
277
296
|
|
278
297
|
def recordSuccessLogin(self, request):
|
279
298
|
self.last_login = datetime.now()
|
280
299
|
self.save()
|
281
300
|
RemoteEvents.hdel("users:failed:username", self.username)
|
282
|
-
|
301
|
+
if request:
|
302
|
+
RemoteEvents.hdel("users:failed:ip", request.ip)
|
283
303
|
|
284
304
|
def hasPasswordExpired(self):
|
285
305
|
now = datetime.now()
|
@@ -288,38 +308,33 @@ class Member(User, RestModel, MetaDataModel):
|
|
288
308
|
self.save()
|
289
309
|
return now - self.password_changed > timedelta(days=settings.PASSWORD_EXPIRES_DAYS)
|
290
310
|
|
291
|
-
def login(self, password=None, request=None
|
292
|
-
if not self.is_active or self.is_blocked:
|
293
|
-
return False
|
294
|
-
# can force login
|
311
|
+
def login(self, password=None, request=None):
|
295
312
|
if not request:
|
296
313
|
request = rh.getActiveRequest()
|
314
|
+
if not self.is_active or self.is_blocked:
|
315
|
+
return False
|
297
316
|
if not self.checkPassword(password):
|
298
|
-
# invalid password
|
299
317
|
self.recordFailedLogin(request)
|
300
318
|
return False
|
301
|
-
|
302
|
-
self.recordSuccessLogin(request)
|
303
|
-
if use_jwt:
|
304
|
-
self.recordSuccessLogin(request)
|
305
|
-
self.locateByIP(request.ip)
|
306
|
-
return True
|
307
|
-
self.user_ptr.backend = 'django.contrib.auth.backends.ModelBackend'
|
308
|
-
auth_login(request, self.user_ptr)
|
309
|
-
self.locateByIP(request.ip)
|
319
|
+
self.authLogin(request)
|
310
320
|
return True
|
311
321
|
|
312
322
|
def loginNoPassword(self, request=None):
|
313
323
|
if not self.is_active or self.is_blocked:
|
314
324
|
return False
|
315
|
-
# can force login
|
316
325
|
if not request:
|
317
326
|
request = rh.getActiveRequest()
|
318
|
-
self.
|
319
|
-
auth_login(request, self.user_ptr)
|
320
|
-
self.locateByIP(request.ip)
|
327
|
+
self.authLogin(request)
|
321
328
|
return True
|
322
329
|
|
330
|
+
def authLogin(self, request, use_session=True):
|
331
|
+
if use_session:
|
332
|
+
self.user_ptr.backend = 'django.contrib.auth.backends.ModelBackend'
|
333
|
+
auth_login(request, self.user_ptr)
|
334
|
+
if request:
|
335
|
+
self.locateByIP(request.ip)
|
336
|
+
self.recordSuccessLogin(request)
|
337
|
+
|
323
338
|
def canLogin(self, request=None, throw_exception=True, using_password=True):
|
324
339
|
if not self.is_active:
|
325
340
|
self.log("login_blocked", F"account is not active {self.username}", request, method="login", level=31)
|
@@ -577,7 +592,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
577
592
|
SMS.send(phone, msg)
|
578
593
|
return True
|
579
594
|
|
580
|
-
def sendEmail(self, subject, body, attachments=[], do_async=True, template=None,
|
595
|
+
def sendEmail(self, subject, body, attachments=[], do_async=True, template=None,
|
581
596
|
context=None):
|
582
597
|
default_domain = self.getProperty("default_domain", settings.EMAIL_DEFAULT_DOMAIN)
|
583
598
|
from_email = rh.getFromEmailForHost(default_domain)
|
@@ -675,7 +690,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
675
690
|
allow_email = not self.email_disabled and valid_email and (force or via in ["all", "email"])
|
676
691
|
else:
|
677
692
|
allow_email = valid_email
|
678
|
-
|
693
|
+
|
679
694
|
if not allow_email and not allow_sms:
|
680
695
|
return False
|
681
696
|
|
@@ -796,7 +811,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
796
811
|
def block(self, reason, request=None):
|
797
812
|
if not request:
|
798
813
|
request = self.getActiveRequest()
|
799
|
-
|
814
|
+
self.auditLog(f"account blocked, {reason}", "blocked", level=5)
|
800
815
|
RemoteEvents.hset("users:blocked:username", self.username, time.time())
|
801
816
|
self.reportIncident(
|
802
817
|
"account", f"account '{self.username}' blocked: {reason}", level=2,
|
@@ -832,7 +847,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
832
847
|
|
833
848
|
# BEGIN REST CALLBACKS
|
834
849
|
def on_permission_change(self, key, value, old_value, category):
|
835
|
-
# called when a metadata.permissions field changes.. see django settings USER_METADATA_PROPERTIES
|
850
|
+
# called when a metadata.permissions field changes.. see django settings USER_METADATA_PROPERTIES
|
836
851
|
# we want to log both the person changing permissions
|
837
852
|
# and those being changed
|
838
853
|
request = RestModel.getActiveRequest()
|
@@ -865,7 +880,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
865
880
|
request = self.getActiveRequest()
|
866
881
|
if not request.member.is_superuser:
|
867
882
|
raise PermissionDeniedException("Permission Denied: attempting to super user")
|
868
|
-
self.is_superuser = int(value)
|
883
|
+
self.is_superuser = int(value)
|
869
884
|
|
870
885
|
def set_disable(self, value):
|
871
886
|
if value is not None and value in [1, '1', True, 'true']:
|
@@ -1219,7 +1234,7 @@ class Member(User, RestModel, MetaDataModel):
|
|
1219
1234
|
def authWS4RedisConnection(cls, auth_data):
|
1220
1235
|
"""
|
1221
1236
|
This method is used by the async/websocket service to authenticate.
|
1222
|
-
If the model can authenticate the connection it should return dict
|
1237
|
+
If the model can authenticate the connection it should return dict
|
1223
1238
|
with kind and pk of the model that is authenticaed
|
1224
1239
|
"""
|
1225
1240
|
from rest import UberDict
|
@@ -1338,5 +1353,3 @@ class AuthToken(models.Model, RestModel):
|
|
1338
1353
|
|
1339
1354
|
def __str__(self):
|
1340
1355
|
return "{o.member}: {o.secure_token}".format(o=self)
|
1341
|
-
|
1342
|
-
|
@@ -42,6 +42,7 @@ class AuthSession(models.Model, RestModel):
|
|
42
42
|
signature = models.CharField(max_length=127, db_index=True)
|
43
43
|
ip = models.CharField(max_length=127, null=True, blank=True, db_index=True)
|
44
44
|
buid = models.CharField(max_length=127, null=True, blank=True, default=None)
|
45
|
+
method = models.CharField(max_length=127, null=True, blank=True, db_index=True, default=None)
|
45
46
|
|
46
47
|
member = models.ForeignKey("account.Member", null=True, blank=True, related_name="auth_sessions", on_delete=models.CASCADE)
|
47
48
|
location = models.ForeignKey("location.GeoIP", related_name="auth_sessions", blank=True, null=True, default=None, on_delete=models.CASCADE)
|
@@ -72,8 +73,9 @@ class AuthSession(models.Model, RestModel):
|
|
72
73
|
return f"{self.member.username} - {self.ip} - {self.os} - {self.browser}"
|
73
74
|
|
74
75
|
@classmethod
|
75
|
-
def NewSession(cls, request):
|
76
|
+
def NewSession(cls, request, method="jwt"):
|
76
77
|
obj = cls(ip=request.ip, member=request.member, signature=request.signature)
|
78
|
+
obj.method = method
|
77
79
|
obj.user_agent = request.META.get('HTTP_USER_AGENT', None)
|
78
80
|
obj.last_activity = datetime.now()
|
79
81
|
obj.buid = request.POST.get("__buid__", request.GET.get("__buid__", None))
|
@@ -92,4 +94,3 @@ class AuthSession(models.Model, RestModel):
|
|
92
94
|
session.touch()
|
93
95
|
return session
|
94
96
|
return None
|
95
|
-
|
@@ -37,6 +37,7 @@ def member_login(request):
|
|
37
37
|
@rd.never_cache
|
38
38
|
def jwt_login(request):
|
39
39
|
# poor mans JWT, carried over
|
40
|
+
auth_method = "basic"
|
40
41
|
username = request.DATA.get('username', None)
|
41
42
|
if not username:
|
42
43
|
return rv.restPermissionDenied(request, "Password and/or Username is incorrect", error_code=422)
|
@@ -45,29 +46,31 @@ def jwt_login(request):
|
|
45
46
|
return rv.restPermissionDenied(request, error=f"Password and/or Username is incorrect for {username}", error_code=422)
|
46
47
|
auth_code = request.DATA.get(["auth_code", "code", "invite_token"], None)
|
47
48
|
if username and auth_code:
|
49
|
+
# this is typically used for OAUTH (final)
|
48
50
|
return member_login_uname_code(request, username, auth_code)
|
49
51
|
password = request.DATA.get('password', None)
|
50
52
|
member.canLogin(request) # throws exception if cannot login
|
51
53
|
if member.requires_totp or member.has_totp:
|
54
|
+
auth_method = "basic+totp"
|
52
55
|
resp = checkForTOTP(request, member)
|
53
56
|
if resp is not None:
|
54
57
|
return resp
|
55
|
-
if not member.login(request=request, password=password
|
58
|
+
if not member.login(request=request, password=password):
|
56
59
|
# we do not want permission denied catcher invoked as it is already handled in login method
|
57
60
|
return rv.restStatus(request, False, error=f"Invalid Credentials {username}", error_code=401)
|
58
|
-
return on_complete_jwt(request, member)
|
61
|
+
return on_complete_jwt(request, member, auth_method)
|
59
62
|
|
60
63
|
|
61
|
-
def on_complete_jwt(request, member):
|
64
|
+
def on_complete_jwt(request, member, method="basic"):
|
62
65
|
if member.security_token is None or member.security_token == JWT_KEY or member.force_single_session:
|
63
66
|
member.refreshSecurityToken()
|
64
67
|
|
65
68
|
member.log(
|
66
|
-
"jwt_login", "jwt login succesful",
|
69
|
+
"jwt_login", "jwt login succesful",
|
67
70
|
request, method="login", level=7)
|
68
71
|
|
69
72
|
device_id = request.DATA.get(["device_id", "deviceID"])
|
70
|
-
|
73
|
+
|
71
74
|
token = JWToken(
|
72
75
|
user_id=member.pk,
|
73
76
|
key=member.security_token,
|
@@ -80,13 +83,13 @@ def on_complete_jwt(request, member):
|
|
80
83
|
request.signature = token.session_id
|
81
84
|
request.device_id = device_id
|
82
85
|
request.buid = request.DATA.get("__buid__", None)
|
83
|
-
request.auth_session = am.AuthSession.NewSession(request)
|
86
|
+
request.auth_session = am.AuthSession.NewSession(request, method)
|
84
87
|
if bool(device_id):
|
85
88
|
am.MemberDevice.register(request, member, device_id)
|
86
|
-
|
89
|
+
|
87
90
|
request.jwt_token = token.access_token # this tells the middleware to store in cookie
|
88
91
|
return rv.restGet(
|
89
|
-
request,
|
92
|
+
request,
|
90
93
|
dict(
|
91
94
|
access=token.access_token,
|
92
95
|
refresh=token.refresh_token,
|
@@ -218,12 +221,13 @@ def member_login_uname_code(request, username, auth_code):
|
|
218
221
|
member.setPassword(password)
|
219
222
|
member.auth_code = None
|
220
223
|
member.auth_code_expires = None
|
221
|
-
member.
|
224
|
+
member.canLogin(request, using_password=False) # throws exception if cannot login
|
225
|
+
member.loginNoPassword(request)
|
222
226
|
member.save()
|
223
227
|
member.log("code_login", "code login", request, method="login", level=8)
|
224
|
-
if request.DATA.get("auth_method") == "basic":
|
228
|
+
if request.DATA.get("auth_method") == "basic" and ALLOW_BASIC_LOGIN:
|
225
229
|
return rv.restGet(request, dict(id=member.pk, session_key=request.session.session_key))
|
226
|
-
return on_complete_jwt(request, member)
|
230
|
+
return on_complete_jwt(request, member, "auth_code")
|
227
231
|
|
228
232
|
|
229
233
|
@rd.url(r'^logout$')
|
@@ -296,7 +300,7 @@ def get_member_from_request(request):
|
|
296
300
|
request.member = member
|
297
301
|
member.log("login_blocked", "account is locked out", request, method="login", level=31)
|
298
302
|
return member, rv.restPermissionDenied(request, error=f"{member.username} Account locked out", error_code=411)
|
299
|
-
return member, None
|
303
|
+
return member, None
|
300
304
|
|
301
305
|
|
302
306
|
@rd.urlPOST('forgot')
|
@@ -410,3 +414,10 @@ def totp_verify(request):
|
|
410
414
|
return rv.restStatus(request, True)
|
411
415
|
|
412
416
|
|
417
|
+
# time based one time passwords
|
418
|
+
@rd.urlPOST('security/ip/failed_logins')
|
419
|
+
@rd.login_required
|
420
|
+
def failed_logins_by_ip(request):
|
421
|
+
ips = am.Member.GetIPsWithFailedLoginAttempts(request.DATA.get("threshold", 10))
|
422
|
+
lst = [dict(ip=k, count=v) for k, v in ips.items()]
|
423
|
+
return rv.restList(request, lst)
|
@@ -20,37 +20,43 @@ def oauth_google_login(request):
|
|
20
20
|
state = request.DATA.get("state")
|
21
21
|
app_url = settings.DEFAULT_LOGIN_URL
|
22
22
|
|
23
|
-
rh.log_print("google/login", request.DATA.toDict(), request.session.get("state"))
|
23
|
+
# rh.log_print("google/login", request.DATA.toDict(), request.session.get("state"))
|
24
24
|
|
25
25
|
if state:
|
26
|
+
# this is where we should pull out the passed in state and get the proper URL
|
26
27
|
state = objict.fromJSON(rh.hexToString(state))
|
27
28
|
rh.log_print("state", state)
|
28
29
|
app_url = state.url
|
29
30
|
|
30
31
|
if not code:
|
31
32
|
params = urlencode({'error': error})
|
32
|
-
|
33
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
34
|
+
return redirect(f"{app_url}{separator}{params}")
|
33
35
|
|
34
|
-
redirect_uri = f"{
|
36
|
+
redirect_uri = f"{request.scheme}://{request.get_host()}/{REST_PREFIX}account/oauth/google/login"
|
35
37
|
auth_data = google.getAccessToken(code, redirect_uri)
|
36
38
|
if auth_data is None or auth_data.access_token is None:
|
37
39
|
params = urlencode({'error': "failed to get access token from google"})
|
38
|
-
|
40
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
41
|
+
return redirect(f"{app_url}{separator}{params}")
|
39
42
|
|
40
43
|
user_data = google.getUserInfo(auth_data.access_token)
|
41
44
|
if user_data is None:
|
42
45
|
params = urlencode({'error': "failed to get user data from google"})
|
43
|
-
|
46
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
47
|
+
return redirect(f"{app_url}{separator}{params}")
|
44
48
|
|
45
49
|
if not user_data.email:
|
46
50
|
params = urlencode({'error': "no email with account"})
|
47
|
-
|
51
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
52
|
+
return redirect(f"{app_url}{separator}{params}")
|
48
53
|
|
49
54
|
# TODO allow new accounts?
|
50
55
|
member = Member.objects.filter(email=user_data.email).last()
|
51
56
|
if member is None:
|
52
57
|
params = urlencode({'error': "user not found"})
|
53
|
-
|
58
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
59
|
+
return redirect(f"{app_url}{separator}{params}")
|
54
60
|
|
55
61
|
member.setProperties(auth_data, category="google_auth")
|
56
62
|
member.setProperties(user_data, category="google")
|
@@ -69,13 +75,8 @@ def oauth_google_login(request):
|
|
69
75
|
member.save()
|
70
76
|
member.auditLog("user succesfully authenticated with google", "google_oauth", level=17)
|
71
77
|
|
72
|
-
params = urlencode({'oauth_code': member.auth_code, "username":member.username})
|
78
|
+
params = urlencode({'oauth_code': member.auth_code, "username":member.username, "auth_method":"google_oauth"})
|
73
79
|
rurl = None
|
74
|
-
if
|
75
|
-
|
76
|
-
rurl = f"{app_url}{params}"
|
77
|
-
else:
|
78
|
-
rurl = f"{app_url}&{params}"
|
79
|
-
else:
|
80
|
-
rurl = f"{app_url}?{params}"
|
80
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
81
|
+
rurl = f"{app_url}{separator}{params}"
|
81
82
|
return redirect(rurl)
|
@@ -51,4 +51,4 @@ def rest_on_passkeys_auth_complete(request):
|
|
51
51
|
request.session.pop("fido2_state"),
|
52
52
|
request.session.pop("fido2_rp_id"))
|
53
53
|
# we now want to handle the JWT or basic login flow
|
54
|
-
return on_complete_jwt(request, uk.member)
|
54
|
+
return on_complete_jwt(request, uk.member, "passkey")
|
@@ -37,11 +37,16 @@ SES_REGION = settings.SES_REGION
|
|
37
37
|
EMAIL_METRICS = settings.get("EMAIL_METRICS", False)
|
38
38
|
|
39
39
|
|
40
|
-
def send(to, subject, body=None, attachments=[],
|
40
|
+
def send(to, subject, body=None, attachments=[],
|
41
41
|
from_email=settings.DEFAULT_FROM_EMAIL,
|
42
|
-
fail_silently=True, template=None,
|
42
|
+
fail_silently=True, template=None,
|
43
43
|
context=None, do_async=False, replyto=None):
|
44
44
|
# make sure to is list
|
45
|
+
if isinstance(to, str):
|
46
|
+
if "," in to:
|
47
|
+
to = [t.strip() for t in to.split(',')]
|
48
|
+
elif ";" in to:
|
49
|
+
to = [t.strip() for t in to.split(';')]
|
45
50
|
if not isinstance(to, (tuple, list)):
|
46
51
|
to = [to]
|
47
52
|
# if template lets render
|
@@ -254,5 +259,3 @@ def render_to_mail(name, context):
|
|
254
259
|
body = html_content
|
255
260
|
|
256
261
|
send(toaddrs, subject, body=body, from_email=fromaddr, do_async=True, replyto=replyto)
|
257
|
-
|
258
|
-
|
@@ -15,7 +15,7 @@ from . import csv
|
|
15
15
|
from . import excel
|
16
16
|
# from . import profiler
|
17
17
|
STATUS_ON_PERM_DENIED = settings.get("STATUS_ON_PERM_DENIED", 403)
|
18
|
-
REST_LIST_CACHE_COUNT = settings.get("REST_LIST_CACHE_COUNT",
|
18
|
+
REST_LIST_CACHE_COUNT = settings.get("REST_LIST_CACHE_COUNT", False)
|
19
19
|
|
20
20
|
|
21
21
|
def get_query_hash(queryset):
|
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.174 → django_restit-4.2.176}/account/migrations/0003_member_phone_number.py
RENAMED
File without changes
|
File without changes
|
{django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0005_member_auth_code_expires.py
RENAMED
File without changes
|
{django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0006_member_security_token.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0009_alter_member_phone_number.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0012_settings_settingsmetadata.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.174 → django_restit-4.2.176}/account/migrations/0015_memberdevice_buid.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
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.174 → django_restit-4.2.176}/account/templates/email/plain/reset_code.html
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.174 → django_restit-4.2.176}/account/templates/email/simple/reset_code.html
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|