├── chat
├── __init__.py
├── migrations
│ ├── __init__.py
│ ├── 0005_friends_accepted.py
│ ├── 0006_friends_note.py
│ ├── 0007_alter_friends_options_alter_keys_options.py
│ ├── 0004_alter_userprofile_user.py
│ ├── 0002_alter_friends_friend_delete_messages.py
│ └── 0003_remove_userprofile_email_userprofile_user.py
├── tests.py
├── apps.py
├── templates
│ └── chat
│ │ ├── messages.html
│ │ ├── waiting_room.html
│ │ └── FriendRequest.html
├── tools.py
├── urls.py
├── routing.py
├── admin.py
└── models.py
├── PrivatePing
├── __init__.py
├── settings
│ ├── __init__.py
│ ├── development.py
│ └── production.py
├── wsgi.py
├── urls.py
└── asgi.py
├── registration
├── __init__.py
├── migrations
│ ├── __init__.py
│ ├── 0003_alter_facts_options.py
│ ├── 0001_initial.py
│ ├── 0004_alter_user_type_id.py
│ └── 0002_user_type.py
├── templates
│ └── registration
│ │ ├── robots.txt
│ │ ├── iframe_base.html
│ │ ├── GenerateKeys.html
│ │ ├── AnonymousDirectLogin.html
│ │ ├── humans.txt
│ │ ├── Home.html
│ │ └── Base.html
├── tests.py
├── apps.py
├── admin.py
├── models.py
├── urls.py
├── middleware.py
└── tools.py
├── assets
├── images
│ ├── wait.gif
│ ├── user
│ │ └── login.gif
│ ├── user_image.jpg
│ ├── favicons
│ │ ├── favicon.ico
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── apple-touch-icon.png
│ │ ├── android-chrome-192x192.png
│ │ └── android-chrome-512x512.png
│ └── logo
│ │ └── png
│ │ ├── logo-black.png
│ │ ├── logo-color.png
│ │ ├── logo-white.png
│ │ └── logo-no-background.png
├── media
│ ├── sent.mp3
│ ├── delete.mp3
│ ├── received.mp3
│ └── notification.mp3
├── admin
│ ├── img
│ │ ├── LICENSE.gz
│ │ ├── README.txt.gz
│ │ ├── icon-no.svg.gz
│ │ ├── icon-yes.svg.gz
│ │ ├── search.svg.gz
│ │ ├── icon-alert.svg.gz
│ │ ├── icon-clock.svg.gz
│ │ ├── icon-addlink.svg.gz
│ │ ├── icon-calendar.svg.gz
│ │ ├── icon-hidelink.svg.gz
│ │ ├── icon-unknown.svg.gz
│ │ ├── icon-viewlink.svg.gz
│ │ ├── inline-delete.svg.gz
│ │ ├── sorting-icons.svg.gz
│ │ ├── tooltag-add.svg.gz
│ │ ├── calendar-icons.svg.gz
│ │ ├── icon-changelink.svg.gz
│ │ ├── icon-deletelink.svg.gz
│ │ ├── selector-icons.svg.gz
│ │ ├── LICENSE.2c54f4e1ca1c.gz
│ │ ├── gis
│ │ │ ├── move_vertex_on.svg.gz
│ │ │ ├── move_vertex_off.svg.gz
│ │ │ ├── move_vertex_off.7a23bf31ef8a.svg.gz
│ │ │ ├── move_vertex_on.0047eba25b67.svg.gz
│ │ │ ├── move_vertex_on.svg
│ │ │ ├── move_vertex_off.svg
│ │ │ ├── move_vertex_off.7a23bf31ef8a.svg
│ │ │ └── move_vertex_on.0047eba25b67.svg
│ │ ├── icon-unknown-alt.svg.gz
│ │ ├── tooltag-arrowright.svg.gz
│ │ ├── README.a70711a38d87.txt.gz
│ │ ├── icon-no.439e821418cd.svg.gz
│ │ ├── search.7cf54ff789c6.svg.gz
│ │ ├── icon-alert.034cc7d8a67f.svg.gz
│ │ ├── icon-clock.e1d4dfac3f2b.svg.gz
│ │ ├── icon-yes.d2f9f035226a.svg.gz
│ │ ├── icon-addlink.d519b3bab011.svg.gz
│ │ ├── icon-unknown.a18cb4398978.svg.gz
│ │ ├── tooltag-add.e59d620a9742.svg.gz
│ │ ├── calendar-icons.39b290681a8b.svg.gz
│ │ ├── icon-calendar.ac7aea671bea.svg.gz
│ │ ├── icon-changelink.18d2fd706348.svg.gz
│ │ ├── icon-deletelink.564ef9dc3854.svg.gz
│ │ ├── icon-hidelink.8d245a995e18.svg.gz
│ │ ├── icon-viewlink.41eb31f7826e.svg.gz
│ │ ├── inline-delete.fec1b761f254.svg.gz
│ │ ├── selector-icons.b4555096cea2.svg.gz
│ │ ├── sorting-icons.3a097b59f104.svg.gz
│ │ ├── icon-unknown-alt.81536e128bb6.svg.gz
│ │ ├── tooltag-arrowright.bbfb788a849e.svg.gz
│ │ ├── tooltag-arrowright.svg
│ │ ├── tooltag-arrowright.bbfb788a849e.svg
│ │ ├── README.txt
│ │ ├── icon-addlink.svg
│ │ ├── tooltag-add.svg
│ │ ├── README.a70711a38d87.txt
│ │ ├── tooltag-add.e59d620a9742.svg
│ │ ├── icon-addlink.d519b3bab011.svg
│ │ ├── icon-changelink.svg
│ │ ├── icon-changelink.18d2fd706348.svg
│ │ ├── icon-deletelink.svg
│ │ ├── icon-deletelink.564ef9dc3854.svg
│ │ ├── icon-yes.svg
│ │ ├── icon-yes.d2f9f035226a.svg
│ │ ├── search.svg
│ │ ├── search.7cf54ff789c6.svg
│ │ ├── icon-alert.svg
│ │ ├── icon-alert.034cc7d8a67f.svg
│ │ ├── icon-no.svg
│ │ ├── inline-delete.svg
│ │ ├── icon-no.439e821418cd.svg
│ │ ├── inline-delete.fec1b761f254.svg
│ │ ├── icon-viewlink.svg
│ │ ├── icon-viewlink.41eb31f7826e.svg
│ │ ├── icon-unknown.svg
│ │ ├── icon-unknown-alt.svg
│ │ ├── icon-unknown.a18cb4398978.svg
│ │ ├── icon-unknown-alt.81536e128bb6.svg
│ │ ├── icon-clock.svg
│ │ ├── icon-clock.e1d4dfac3f2b.svg
│ │ ├── icon-hidelink.svg
│ │ ├── icon-hidelink.8d245a995e18.svg
│ │ ├── icon-calendar.svg
│ │ ├── icon-calendar.ac7aea671bea.svg
│ │ ├── calendar-icons.svg
│ │ ├── LICENSE
│ │ ├── calendar-icons.39b290681a8b.svg
│ │ ├── LICENSE.2c54f4e1ca1c
│ │ ├── sorting-icons.svg
│ │ └── sorting-icons.3a097b59f104.svg
│ ├── fonts
│ │ ├── Roboto-Bold-webfont.woff
│ │ ├── Roboto-Light-webfont.woff
│ │ ├── Roboto-Regular-webfont.woff
│ │ └── README.txt
│ ├── js
│ │ ├── jquery.init.js
│ │ ├── popup_response.js
│ │ ├── vendor
│ │ │ ├── select2
│ │ │ │ ├── i18n
│ │ │ │ │ ├── zh-TW.js
│ │ │ │ │ ├── zh-CN.js
│ │ │ │ │ ├── ja.js
│ │ │ │ │ ├── az.js
│ │ │ │ │ ├── ko.js
│ │ │ │ │ ├── vi.js
│ │ │ │ │ ├── tk.js
│ │ │ │ │ ├── id.js
│ │ │ │ │ ├── tr.js
│ │ │ │ │ ├── ar.js
│ │ │ │ │ ├── th.js
│ │ │ │ │ ├── nb.js
│ │ │ │ │ ├── km.js
│ │ │ │ │ ├── sv.js
│ │ │ │ │ ├── fi.js
│ │ │ │ │ ├── is.js
│ │ │ │ │ ├── et.js
│ │ │ │ │ ├── hu.js
│ │ │ │ │ ├── ms.js
│ │ │ │ │ ├── ka.js
│ │ │ │ │ ├── bg.js
│ │ │ │ │ ├── da.js
│ │ │ │ │ ├── hy.js
│ │ │ │ │ ├── fa.js
│ │ │ │ │ ├── en.js
│ │ │ │ │ ├── hi.js
│ │ │ │ │ ├── he.js
│ │ │ │ │ ├── hr.js
│ │ │ │ │ ├── de.js
│ │ │ │ │ ├── af.js
│ │ │ │ │ ├── eu.js
│ │ │ │ │ ├── mk.js
│ │ │ │ │ ├── pt-BR.js
│ │ │ │ │ ├── pt.js
│ │ │ │ │ ├── bn.js
│ │ │ │ │ ├── lv.js
│ │ │ │ │ ├── ca.js
│ │ │ │ │ ├── ps.js
│ │ │ │ │ ├── sq.js
│ │ │ │ │ ├── it.js
│ │ │ │ │ ├── nl.js
│ │ │ │ │ ├── ne.js
│ │ │ │ │ ├── fr.js
│ │ │ │ │ ├── es.js
│ │ │ │ │ ├── gl.js
│ │ │ │ │ ├── sl.js
│ │ │ │ │ ├── ro.js
│ │ │ │ │ ├── lt.js
│ │ │ │ │ ├── pl.js
│ │ │ │ │ ├── el.js
│ │ │ │ │ ├── sr.js
│ │ │ │ │ ├── uk.js
│ │ │ │ │ ├── bs.js
│ │ │ │ │ ├── sr-Cyrl.js
│ │ │ │ │ ├── ru.js
│ │ │ │ │ ├── hsb.js
│ │ │ │ │ ├── dsb.js
│ │ │ │ │ ├── cs.js
│ │ │ │ │ └── sk.js
│ │ │ │ └── LICENSE.md
│ │ │ ├── jquery
│ │ │ │ └── LICENSE.txt
│ │ │ └── xregexp
│ │ │ │ └── LICENSE.txt
│ │ ├── prepopulate_init.js
│ │ ├── change_form.js
│ │ ├── cancel.js
│ │ ├── filters.js
│ │ ├── autocomplete.js
│ │ ├── prepopulate.js
│ │ ├── collapse.js
│ │ └── theme.js
│ └── css
│ │ ├── dashboard.css
│ │ ├── vendor
│ │ └── select2
│ │ │ └── LICENSE-SELECT2.md
│ │ ├── login.css
│ │ ├── responsive_rtl.css
│ │ └── dark_mode.css
├── fonts
│ ├── Mark Simonson - Proxima Nova Thin-webfont.eot
│ ├── Mark Simonson - Proxima Nova Thin-webfont.ttf
│ ├── Mark Simonson - Proxima Nova Thin-webfont.woff
│ ├── Mark Simonson - Proxima Nova Alt Bold-webfont.eot
│ ├── Mark Simonson - Proxima Nova Alt Bold-webfont.ttf
│ ├── Mark Simonson - Proxima Nova Semibold-webfont.eot
│ ├── Mark Simonson - Proxima Nova Semibold-webfont.ttf
│ ├── Mark Simonson - Proxima Nova Thin-webfont.woff2
│ ├── Mark Simonson - Proxima Nova Alt Black-webfont.ttf
│ ├── Mark Simonson - Proxima Nova Alt Black-webfont.woff
│ ├── Mark Simonson - Proxima Nova Alt Bold-webfont.woff
│ ├── Mark Simonson - Proxima Nova Alt Bold-webfont.woff2
│ ├── Mark Simonson - Proxima Nova ScOsf Thin-webfont.eot
│ ├── Mark Simonson - Proxima Nova ScOsf Thin-webfont.ttf
│ ├── Mark Simonson - Proxima Nova Semibold-webfont.woff2
│ ├── Mark Simonson - Proxima Nova Alt Black-webfont.woff2
│ ├── Mark Simonson - Proxima Nova Alt Regular-webfont.eot
│ ├── Mark Simonson - Proxima Nova Alt Regular-webfont.ttf
│ ├── Mark Simonson - Proxima Nova Alt Regular-webfont.woff
│ ├── Mark Simonson - Proxima Nova ScOsf Thin-webfont.woff
│ ├── Mark Simonson - Proxima Nova Alt Condensed Semibold-webfont.eot
│ ├── Mark Simonson - Proxima Nova Alt Condensed Semibold-webfont.ttf
│ └── fonts.min.css
├── css
│ ├── chat
│ │ ├── FriendRequest.css
│ │ ├── waiting_room.css
│ │ └── Base.css
│ ├── base_style.css
│ ├── chat.css
│ └── registration
│ │ ├── AnonymousDirectLogin.css
│ │ └── GenerateKeys.css
└── js
│ ├── registration
│ ├── registration_home.js
│ ├── AnonymousDirectLogin.js
│ ├── GenerateKeys.js
│ └── Login.js
│ ├── Base.js
│ └── chat
│ ├── waiting_room.js
│ └── chats.js
├── Procfile
├── app.json
├── .github
└── ISSUE_TEMPLATE
│ ├── feature_request.md
│ └── bug_report.md
├── manage.py
├── install.sh
├── LICENSE
├── requirements.txt
└── SECURITY.md
/chat/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/PrivatePing/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/chat/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/registration/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/registration/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/registration/templates/registration/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow:
--------------------------------------------------------------------------------
/chat/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/registration/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/assets/images/wait.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/wait.gif
--------------------------------------------------------------------------------
/assets/media/sent.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/media/sent.mp3
--------------------------------------------------------------------------------
/assets/media/delete.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/media/delete.mp3
--------------------------------------------------------------------------------
/assets/admin/img/LICENSE.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/LICENSE.gz
--------------------------------------------------------------------------------
/assets/media/received.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/media/received.mp3
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: bin/start-pgbouncer uvicorn PrivatePing.asgi:application --host 0.0.0.0 --port $PORT --log-level debug
--------------------------------------------------------------------------------
/assets/images/user/login.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/user/login.gif
--------------------------------------------------------------------------------
/assets/images/user_image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/user_image.jpg
--------------------------------------------------------------------------------
/assets/media/notification.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/media/notification.mp3
--------------------------------------------------------------------------------
/chat/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class ChatConfig(AppConfig):
5 | name = 'chat'
6 |
--------------------------------------------------------------------------------
/assets/admin/img/README.txt.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/README.txt.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-no.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-no.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-yes.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-yes.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/search.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/search.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-alert.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-alert.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-clock.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-clock.svg.gz
--------------------------------------------------------------------------------
/assets/images/favicons/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/favicons/favicon.ico
--------------------------------------------------------------------------------
/assets/admin/img/icon-addlink.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-addlink.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-calendar.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-calendar.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-hidelink.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-hidelink.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-unknown.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-viewlink.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-viewlink.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/inline-delete.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/inline-delete.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/sorting-icons.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/sorting-icons.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-add.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/tooltag-add.svg.gz
--------------------------------------------------------------------------------
/assets/images/logo/png/logo-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/logo/png/logo-black.png
--------------------------------------------------------------------------------
/assets/images/logo/png/logo-color.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/logo/png/logo-color.png
--------------------------------------------------------------------------------
/assets/images/logo/png/logo-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/logo/png/logo-white.png
--------------------------------------------------------------------------------
/assets/admin/img/calendar-icons.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/calendar-icons.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-changelink.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-changelink.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-deletelink.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-deletelink.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/selector-icons.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/selector-icons.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/LICENSE.2c54f4e1ca1c.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/LICENSE.2c54f4e1ca1c.gz
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_on.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/gis/move_vertex_on.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown-alt.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-unknown-alt.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-arrowright.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/tooltag-arrowright.svg.gz
--------------------------------------------------------------------------------
/assets/images/favicons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/favicons/favicon-16x16.png
--------------------------------------------------------------------------------
/assets/images/favicons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/favicons/favicon-32x32.png
--------------------------------------------------------------------------------
/assets/admin/fonts/Roboto-Bold-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/fonts/Roboto-Bold-webfont.woff
--------------------------------------------------------------------------------
/assets/admin/fonts/Roboto-Light-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/fonts/Roboto-Light-webfont.woff
--------------------------------------------------------------------------------
/assets/admin/img/README.a70711a38d87.txt.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/README.a70711a38d87.txt.gz
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_off.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/gis/move_vertex_off.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-no.439e821418cd.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-no.439e821418cd.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/search.7cf54ff789c6.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/search.7cf54ff789c6.svg.gz
--------------------------------------------------------------------------------
/assets/images/favicons/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/favicons/apple-touch-icon.png
--------------------------------------------------------------------------------
/registration/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class RegistrationConfig(AppConfig):
5 | name = 'registration'
6 |
7 |
--------------------------------------------------------------------------------
/assets/admin/fonts/Roboto-Regular-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/fonts/Roboto-Regular-webfont.woff
--------------------------------------------------------------------------------
/assets/admin/img/icon-alert.034cc7d8a67f.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-alert.034cc7d8a67f.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-clock.e1d4dfac3f2b.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-clock.e1d4dfac3f2b.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-yes.d2f9f035226a.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-yes.d2f9f035226a.svg.gz
--------------------------------------------------------------------------------
/assets/images/logo/png/logo-no-background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/logo/png/logo-no-background.png
--------------------------------------------------------------------------------
/assets/admin/img/icon-addlink.d519b3bab011.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-addlink.d519b3bab011.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown.a18cb4398978.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-unknown.a18cb4398978.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-add.e59d620a9742.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/tooltag-add.e59d620a9742.svg.gz
--------------------------------------------------------------------------------
/assets/images/favicons/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/favicons/android-chrome-192x192.png
--------------------------------------------------------------------------------
/assets/images/favicons/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/images/favicons/android-chrome-512x512.png
--------------------------------------------------------------------------------
/assets/admin/img/calendar-icons.39b290681a8b.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/calendar-icons.39b290681a8b.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-calendar.ac7aea671bea.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-calendar.ac7aea671bea.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-changelink.18d2fd706348.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-changelink.18d2fd706348.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-deletelink.564ef9dc3854.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-deletelink.564ef9dc3854.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-hidelink.8d245a995e18.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-hidelink.8d245a995e18.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-viewlink.41eb31f7826e.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-viewlink.41eb31f7826e.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/inline-delete.fec1b761f254.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/inline-delete.fec1b761f254.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/selector-icons.b4555096cea2.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/selector-icons.b4555096cea2.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/sorting-icons.3a097b59f104.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/sorting-icons.3a097b59f104.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown-alt.81536e128bb6.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/icon-unknown-alt.81536e128bb6.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_on.0047eba25b67.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/gis/move_vertex_on.0047eba25b67.svg.gz
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-arrowright.bbfb788a849e.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/admin/img/tooltag-arrowright.bbfb788a849e.svg.gz
--------------------------------------------------------------------------------
/PrivatePing/settings/__init__.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | if os.environ.get('DJANGO_ENV') == 'production':
4 | from .production import *
5 | else:
6 | from .development import *
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Semibold-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Semibold-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Semibold-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Semibold-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Thin-webfont.woff2
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Black-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Black-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Black-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Black-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Bold-webfont.woff2
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova ScOsf Thin-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova ScOsf Thin-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova ScOsf Thin-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova ScOsf Thin-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Semibold-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Semibold-webfont.woff2
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Black-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Black-webfont.woff2
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Regular-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Regular-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Regular-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Regular-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Regular-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Regular-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova ScOsf Thin-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova ScOsf Thin-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Condensed Semibold-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Condensed Semibold-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/Mark Simonson - Proxima Nova Alt Condensed Semibold-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/princekhunt/privateping/HEAD/assets/fonts/Mark Simonson - Proxima Nova Alt Condensed Semibold-webfont.ttf
--------------------------------------------------------------------------------
/PrivatePing/wsgi.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | from django.core.wsgi import get_wsgi_application
4 |
5 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PrivatePing.settings')
6 |
7 | application = get_wsgi_application()
8 |
--------------------------------------------------------------------------------
/assets/admin/fonts/README.txt:
--------------------------------------------------------------------------------
1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto
2 | WOFF files extracted using https://github.com/majodev/google-webfonts-helper
3 | Weights used in this project: Light (300), Regular (400), Bold (700)
4 |
--------------------------------------------------------------------------------
/registration/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from unfold.admin import ModelAdmin
4 |
5 | from .models import facts
6 |
7 | @admin.register(facts)
8 | class factsAdmin(ModelAdmin):
9 | list_display = ('fact',)
10 | search_fields = ('fact',)
11 |
--------------------------------------------------------------------------------
/chat/templates/chat/messages.html:
--------------------------------------------------------------------------------
1 | {% extends 'chat/chats.html' %}
2 | {% load static %}
3 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-arrowright.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-arrowright.bbfb788a849e.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/README.txt:
--------------------------------------------------------------------------------
1 | All icons are taken from Font Awesome (http://fontawesome.io/) project.
2 | The Font Awesome font is licensed under the SIL OFL 1.1:
3 | - https://scripts.sil.org/OFL
4 |
5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
7 | in current folder).
8 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-addlink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/README.a70711a38d87.txt:
--------------------------------------------------------------------------------
1 | All icons are taken from Font Awesome (http://fontawesome.io/) project.
2 | The Font Awesome font is licensed under the SIL OFL 1.1:
3 | - https://scripts.sil.org/OFL
4 |
5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
7 | in current folder).
8 |
--------------------------------------------------------------------------------
/assets/admin/img/tooltag-add.e59d620a9742.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-addlink.d519b3bab011.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/js/jquery.init.js:
--------------------------------------------------------------------------------
1 | /*global jQuery:false*/
2 | 'use strict';
3 | /* Puts the included jQuery into our own namespace using noConflict and passing
4 | * it 'true'. This ensures that the included jQuery doesn't pollute the global
5 | * namespace (i.e. this preserves pre-existing values for both window.$ and
6 | * window.jQuery).
7 | */
8 | window.django = {jQuery: jQuery.noConflict(true)};
9 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-changelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-changelink.18d2fd706348.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-deletelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/css/chat/FriendRequest.css:
--------------------------------------------------------------------------------
1 | #request-text {
2 | margin-top: 15rem;
3 | font-size: 2rem;
4 | color: #050d55;
5 | font-weight: bold;
6 | font-family: 'Proxima Nova', Georgia, sans-serif;
7 | text-align: center;
8 | }
9 |
10 | .request-button{
11 | /* increase size of button */
12 | padding: 20px 25px;
13 | border-radius: 12px;
14 | }
15 |
16 | i.size {
17 | font-size: 100px;
18 | }
--------------------------------------------------------------------------------
/assets/admin/img/icon-deletelink.564ef9dc3854.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-yes.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/registration/migrations/0003_alter_facts_options.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-24 19:02
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('registration', '0002_user_type'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterModelOptions(
14 | name='facts',
15 | options={'verbose_name_plural': 'Facts'},
16 | ),
17 | ]
18 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Heroku CI",
3 | "description": "Configuration file for Heroku CI",
4 | "env": {
5 | "CI": "true"
6 | },
7 | "buildpacks": [
8 | {
9 | "url": "heroku/python"
10 | }
11 | ],
12 | "scripts": {
13 | "test": "python manage.py test"
14 | },
15 | "formation": {
16 | "web": {
17 | "quantity": 1,
18 | "size": "standard-1X"
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/assets/admin/img/icon-yes.d2f9f035226a.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/js/registration/registration_home.js:
--------------------------------------------------------------------------------
1 | document.getElementById("Maincontent").style.display = "none";
2 | document.getElementById("credits").style.display = "none";
3 |
4 | // Hide the loader when the page is fully loaded
5 | window.addEventListener("load", function () {
6 | $("#pageloader").fadeOut();
7 | $("#Maincontent").delay(500).fadeIn();
8 | $("#credits").delay(500).fadeIn();
9 |
10 | });
11 | parent.document.title = "PrivatePing: A secure messaging Application";
--------------------------------------------------------------------------------
/assets/admin/img/search.7cf54ff789c6.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/chat/migrations/0005_friends_accepted.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-25 06:43
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('chat', '0004_alter_userprofile_user'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddField(
14 | model_name='friends',
15 | name='accepted',
16 | field=models.BooleanField(default=False),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/chat/migrations/0006_friends_note.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-26 10:43
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('chat', '0005_friends_accepted'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddField(
14 | model_name='friends',
15 | name='note',
16 | field=models.CharField(blank=True, default='', max_length=100),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-alert.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/chat/tools.py:
--------------------------------------------------------------------------------
1 | from .models import UserProfile
2 | from .models import Friends
3 |
4 | def getFriendsList(id):
5 | try:
6 | user = UserProfile.objects.get(id=id)
7 | friends = Friends.objects.filter(user=user)
8 | friend_list = []
9 | for i in friends:
10 | friend_list.append(i)
11 | return friend_list
12 | except:
13 | return []
14 |
15 |
16 | def getUserId(username):
17 | use = UserProfile.objects.get(username=username)
18 | id = use.id
19 | return id
20 |
--------------------------------------------------------------------------------
/PrivatePing/urls.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from django.urls import path, include
3 | from registration import views as rv
4 | from .settings import SECRET_ADMIN_URL
5 |
6 | # customize admin site
7 | admin.site.site_header = 'PrivatePing Admin'
8 | admin.site.site_title = 'PriavtePing Admin Dashboard'
9 | admin.site.index_title = 'PrivatePing Admin'
10 |
11 | urlpatterns = [
12 | path(SECRET_ADMIN_URL + 'admin/', admin.site.urls),
13 | path("", include("registration.urls")),
14 | path("", include("chat.urls")),
15 | ]
--------------------------------------------------------------------------------
/assets/admin/img/icon-alert.034cc7d8a67f.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/registration/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-02-24 11:20
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 | initial = True
8 |
9 | dependencies = []
10 |
11 | operations = [
12 | migrations.CreateModel(
13 | name="facts",
14 | fields=[
15 | ("id", models.AutoField(primary_key=True, serialize=False)),
16 | ("fact", models.CharField(max_length=255)),
17 | ],
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/registration/migrations/0004_alter_user_type_id.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-06-24 04:58
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('registration', '0003_alter_facts_options'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name='user_type',
15 | name='id',
16 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-no.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/js/Base.js:
--------------------------------------------------------------------------------
1 | // Disable right-click
2 | document.addEventListener('contextmenu', (e) => e.preventDefault());
3 |
4 | function ctrlShiftKey(e, keyCode) {
5 | return e.ctrlKey && e.shiftKey && e.keyCode === keyCode.charCodeAt(0);
6 | }
7 |
8 | document.onkeydown = (e) => {
9 | // Disable F12, Ctrl + Shift + I, Ctrl + Shift + J, Ctrl + U
10 | if (
11 | event.keyCode === 123 ||
12 | ctrlShiftKey(e, 'I') ||
13 | ctrlShiftKey(e, 'J') ||
14 | ctrlShiftKey(e, 'C') ||
15 | (e.ctrlKey && e.keyCode === 'U'.charCodeAt(0))
16 | )
17 | return false;
18 | };
19 |
--------------------------------------------------------------------------------
/registration/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 | from django.contrib.auth.models import User
3 |
4 | class facts(models.Model):
5 | id = models.AutoField(primary_key=True)
6 | fact = models.CharField(max_length=255)
7 |
8 | def __str__(self):
9 | return self.fact
10 |
11 | class Meta:
12 | verbose_name_plural = "Facts"
13 |
14 | class user_type(models.Model):
15 |
16 | user = models.OneToOneField(User, on_delete=models.CASCADE)
17 | type = models.CharField(max_length=255)
18 |
19 | def __str__(self):
20 | return self.type
--------------------------------------------------------------------------------
/assets/admin/img/inline-delete.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/PrivatePing/asgi.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | import django
4 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PrivatePing.settings')
5 | django.setup()
6 |
7 | from django.core.asgi import get_asgi_application
8 | from channels.routing import ProtocolTypeRouter, URLRouter
9 | from chat.routing import websocket_urlpatterns
10 | from channels.auth import AuthMiddlewareStack
11 |
12 | application = ProtocolTypeRouter({
13 |
14 | "websocket": AuthMiddlewareStack(
15 | URLRouter(
16 | websocket_urlpatterns
17 | )
18 | ),
19 | "http": get_asgi_application()
20 | })
--------------------------------------------------------------------------------
/assets/admin/img/icon-no.439e821418cd.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/css/dashboard.css:
--------------------------------------------------------------------------------
1 | /* DASHBOARD */
2 | .dashboard td, .dashboard th {
3 | word-break: break-word;
4 | }
5 |
6 | .dashboard .module table th {
7 | width: 100%;
8 | }
9 |
10 | .dashboard .module table td {
11 | white-space: nowrap;
12 | }
13 |
14 | .dashboard .module table td a {
15 | display: block;
16 | padding-right: .6em;
17 | }
18 |
19 | /* RECENT ACTIONS MODULE */
20 |
21 | .module ul.actionlist {
22 | margin-left: 0;
23 | }
24 |
25 | ul.actionlist li {
26 | list-style-type: none;
27 | overflow: hidden;
28 | text-overflow: ellipsis;
29 | }
30 |
--------------------------------------------------------------------------------
/assets/admin/img/inline-delete.fec1b761f254.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-viewlink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/registration/templates/registration/iframe_base.html:
--------------------------------------------------------------------------------
1 | {% extends "registration/Base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 |
PrivatePing: A secure messaging Application
7 |
8 |
9 |
10 |
11 |
13 |
14 | {% endblock %}
--------------------------------------------------------------------------------
/assets/admin/img/icon-viewlink.41eb31f7826e.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/chat/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import path, include
2 | from . import views
3 | from django.urls import re_path
4 |
5 | app_name = "chat"
6 |
7 | urlpatterns = [
8 | path("dashboard", views.index, name="dashboard"),
9 | path("addfriend/", views.addFriend, name="addFriend"),
10 | path("delete_friend", views.deleteFriend, name="deleteFriend"),
11 | path("chat/", views.chat, name="chat"),
12 | path("request", views.FriendRequest, name="FriendRequest"),
13 | path('waiting-room', views.waiting_room, name="waiting-room"),
14 | path('api/room', views.room, name='room'),
15 |
16 | ]
--------------------------------------------------------------------------------
/registration/templates/registration/GenerateKeys.html:
--------------------------------------------------------------------------------
1 | {% extends "registration/Base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 | PrivatePing - Securing Session
7 |
8 |
9 |
10 |
11 |
12 |
13 |
Generating Secure Keypair...
14 |
15 |
16 |
17 |
18 | {% endblock %}
--------------------------------------------------------------------------------
/chat/migrations/0007_alter_friends_options_alter_keys_options.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-06-24 04:58
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('chat', '0006_friends_note'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterModelOptions(
14 | name='friends',
15 | options={'verbose_name_plural': 'Friends'},
16 | ),
17 | migrations.AlterModelOptions(
18 | name='keys',
19 | options={'verbose_name_plural': 'Keys'},
20 | ),
21 | ]
22 |
--------------------------------------------------------------------------------
/chat/routing.py:
--------------------------------------------------------------------------------
1 | from django.urls import re_path as url
2 | from chat.consumers import *
3 |
4 | websocket_urlpatterns = [
5 |
6 | # Checks the status ( typing/not typing) of the user
7 | url('ws/chat/currentstatus/', ChatConsumerCurrentStatus.as_asgi()),
8 |
9 | # Check the status (online/offline) of the user
10 | url('ws/chat/status/', ChatConsumerStatus.as_asgi()),
11 |
12 | # Handle the communication between the users
13 | url('ws/chat/', ChatConsumer.as_asgi()),
14 |
15 | # Notifies a user, if any user is waiting for a chat
16 | url('ws/notify/', ChatConsumerNotify.as_asgi()),
17 | ]
--------------------------------------------------------------------------------
/assets/admin/js/popup_response.js:
--------------------------------------------------------------------------------
1 | /*global opener */
2 | 'use strict';
3 | {
4 | const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse);
5 | switch(initData.action) {
6 | case 'change':
7 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value);
8 | break;
9 | case 'delete':
10 | opener.dismissDeleteRelatedObjectPopup(window, initData.value);
11 | break;
12 | default:
13 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj);
14 | break;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/zh-TW.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/chat/templates/chat/waiting_room.html:
--------------------------------------------------------------------------------
1 | {% extends "chat/Base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 |
7 |
Waiting for {{friend}} to connect
8 |
9 |
15 |
16 |
17 |
18 | {% endblock %}
--------------------------------------------------------------------------------
/assets/admin/js/prepopulate_init.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const $ = django.jQuery;
4 | const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields');
5 | $.each(fields, function(index, field) {
6 | $(
7 | '.empty-form .form-row .field-' + field.name +
8 | ', .empty-form.form-row .field-' + field.name +
9 | ', .empty-form .form-row.field-' + field.name
10 | ).addClass('prepopulated_field');
11 | $(field.id).data('dependency_list', field.dependency_list).prepopulate(
12 | field.dependency_ids, field.maxLength, field.allowUnicode
13 | );
14 | });
15 | }
16 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown.a18cb4398978.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-unknown-alt.81536e128bb6.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/js/change_form.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'];
4 | const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName;
5 | if (modelName) {
6 | const form = document.getElementById(modelName + '_form');
7 | for (const element of form.elements) {
8 | // HTMLElement.offsetParent returns null when the element is not
9 | // rendered.
10 | if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) {
11 | element.focus();
12 | break;
13 | }
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/zh-CN.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ja.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/az.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PrivatePing.settings')
9 | try:
10 | from django.core.management import execute_from_command_line
11 | except ImportError as exc:
12 | raise ImportError(
13 | "Couldn't import Django. Are you sure it's installed and "
14 | "available on your PYTHONPATH environment variable? Did you "
15 | "forget to activate a virtual environment?"
16 | ) from exc
17 | execute_from_command_line(sys.argv)
18 |
19 |
20 | if __name__ == '__main__':
21 | main()
22 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-clock.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ko.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/img/icon-clock.e1d4dfac3f2b.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/vi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/tk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/chat/migrations/0004_alter_userprofile_user.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-24 19:02
2 |
3 | import django.db.models.deletion
4 | from django.conf import settings
5 | from django.db import migrations, models
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | ('chat', '0003_remove_userprofile_email_userprofile_user'),
12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13 | ]
14 |
15 | operations = [
16 | migrations.AlterField(
17 | model_name='userprofile',
18 | name='user',
19 | field=models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
20 | ),
21 | ]
22 |
--------------------------------------------------------------------------------
/chat/migrations/0002_alter_friends_friend_delete_messages.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-05 10:21
2 |
3 | import django.db.models.deletion
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 | dependencies = [
9 | ("chat", "0001_initial"),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name="friends",
15 | name="friend",
16 | field=models.ForeignKey(
17 | on_delete=django.db.models.deletion.CASCADE,
18 | related_name="friend",
19 | to="chat.userprofile",
20 | ),
21 | ),
22 | migrations.DeleteModel(
23 | name="Messages",
24 | ),
25 | ]
26 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/id.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/tr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ar.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/th.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/nb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/km.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/sv.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/img/icon-hidelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/fi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/is.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/img/icon-hidelink.8d245a995e18.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/et.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/hu.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ms.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ka.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/bg.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/da.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/hy.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/fa.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها میتوانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجهای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/en.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/hi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/he.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/hr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/de.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/af.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/eu.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/mk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/pt-BR.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/pt.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/bn.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/lv.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/chat/migrations/0003_remove_userprofile_email_userprofile_user.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-24 19:02
2 |
3 | import django.db.models.deletion
4 | from django.conf import settings
5 | from django.db import migrations, models
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | ('chat', '0002_alter_friends_friend_delete_messages'),
12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13 | ]
14 |
15 | operations = [
16 | migrations.RemoveField(
17 | model_name='userprofile',
18 | name='email',
19 | ),
20 | migrations.AddField(
21 | model_name='userprofile',
22 | name='user',
23 | field=models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
24 | ),
25 | ]
26 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ca.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ps.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/sq.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/it.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/nl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ne.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/fr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/es.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/gl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/sl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/registration/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import path
2 | from . import views
3 | from django.views.generic.base import TemplateView
4 |
5 | app_name = "registration"
6 |
7 | urlpatterns = [
8 | path("", views.Base, name="base"),
9 | path("home", views.Home, name="home"),
10 | path("humans.txt", TemplateView.as_view(template_name="registration/humans.txt", content_type="text/plain")),
11 | path("robots.txt", TemplateView.as_view(template_name="registration/robots.txt", content_type="text/plain")),
12 | path("signup/", views.Signup, name="register"),
13 | path("login/", views.Login, name="login"),
14 | path("AnonymousDirectLogin", views.AnonymousDirectLogin, name="anonymous_direct_login"),
15 | path("logout/", views.Logout, name="logout"),
16 | path("generate_keys/", views.GenerateKeys, name="generate_keys"),
17 | path("api/check_username/", views.UsernameCheck, name="username_check"),
18 |
19 | ]
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ro.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/lt.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/pl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/registration/templates/registration/AnonymousDirectLogin.html:
--------------------------------------------------------------------------------
1 | {% extends "registration/Base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 | PrivatePing - Anonymous Direct Login
7 |
8 |
9 |
10 |
22 |
23 |
24 | {% endblock %}
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/el.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/sr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/uk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/bs.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/sr-Cyrl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/ru.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/hsb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/dsb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/assets/admin/js/cancel.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | // Call function fn when the DOM is loaded and ready. If it is already
4 | // loaded, call the function now.
5 | // http://youmightnotneedjquery.com/#ready
6 | function ready(fn) {
7 | if (document.readyState !== 'loading') {
8 | fn();
9 | } else {
10 | document.addEventListener('DOMContentLoaded', fn);
11 | }
12 | }
13 |
14 | ready(function() {
15 | function handleClick(event) {
16 | event.preventDefault();
17 | const params = new URLSearchParams(window.location.search);
18 | if (params.has('_popup')) {
19 | window.close(); // Close the popup.
20 | } else {
21 | window.history.back(); // Otherwise, go back.
22 | }
23 | }
24 |
25 | document.querySelectorAll('.cancel-link').forEach(function(el) {
26 | el.addEventListener('click', handleClick);
27 | });
28 | });
29 | }
30 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | #check if python3 is installed
4 | if ! [ -x "$(command -v python3)" ]; then
5 | echo 'Error: python3 is not installed.' >&2
6 | exit 1
7 | fi
8 |
9 | #check if pip3 is installed
10 | if ! [ -x "$(command -v pip3)" ]; then
11 | echo 'Error: pip3 is not installed.' >&2
12 | exit 1
13 | fi
14 |
15 | #install virtualenv
16 | pip3 install virtualenv
17 |
18 | #create virtual environment
19 | python3 -m venv venv
20 |
21 | #activate virtual environment
22 | source venv/bin/activate
23 |
24 | #install requirements
25 | pip3 install -r requirements.txt
26 |
27 | #create .env file in PrivatePing/settings
28 | echo "SECRET_KEY='*$j@tpltfyblml&*1d+n9t@il^0xef4=bvdu&!7r=zvoq$a19g'" > PrivatePing/settings/.env
29 | echo "SECRET_ADMIN_URL=''" >> PrivatePing/settings/.env
30 | echo "HCAPTCHA_SITEKEY='10000000-ffff-ffff-ffff-000000000001'" >> PrivatePing/settings/.env
31 | echo "HCAPTCHA_SECRET='0x0000000000000000000000000000000000000000'" >> PrivatePing/settings/.env
32 | #run migrations
33 | python3 manage.py migrate
34 |
35 | #run server
36 | python3 manage.py runserver
37 |
--------------------------------------------------------------------------------
/assets/admin/js/filters.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Persist changelist filters state (collapsed/expanded).
3 | */
4 | 'use strict';
5 | {
6 | // Init filters.
7 | let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState'));
8 |
9 | if (!filters) {
10 | filters = {};
11 | }
12 |
13 | Object.entries(filters).forEach(([key, value]) => {
14 | const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`);
15 |
16 | // Check if the filter is present, it could be from other view.
17 | if (detailElement) {
18 | value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open');
19 | }
20 | });
21 |
22 | // Save filter state when clicks.
23 | const details = document.querySelectorAll('details');
24 | details.forEach(detail => {
25 | detail.addEventListener('toggle', event => {
26 | filters[`${event.target.dataset.filterTitle}`] = detail.open;
27 | sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters));
28 | });
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_on.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-calendar.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_off.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Prince Khunt
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/admin/img/gis/move_vertex_on.0047eba25b67.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/admin/img/icon-calendar.ac7aea671bea.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/assets/admin/img/calendar-icons.svg:
--------------------------------------------------------------------------------
1 |
15 |
--------------------------------------------------------------------------------
/assets/admin/img/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Code Charm Ltd
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/assets/admin/img/calendar-icons.39b290681a8b.svg:
--------------------------------------------------------------------------------
1 |
15 |
--------------------------------------------------------------------------------
/assets/admin/img/LICENSE.2c54f4e1ca1c:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Code Charm Ltd
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/assets/admin/img/sorting-icons.svg:
--------------------------------------------------------------------------------
1 |
20 |
--------------------------------------------------------------------------------
/assets/admin/img/sorting-icons.3a097b59f104.svg:
--------------------------------------------------------------------------------
1 |
20 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/jquery/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/assets/admin/js/autocomplete.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const $ = django.jQuery;
4 |
5 | $.fn.djangoAdminSelect2 = function() {
6 | $.each(this, function(i, element) {
7 | $(element).select2({
8 | ajax: {
9 | data: (params) => {
10 | return {
11 | term: params.term,
12 | page: params.page,
13 | app_label: element.dataset.appLabel,
14 | model_name: element.dataset.modelName,
15 | field_name: element.dataset.fieldName
16 | };
17 | }
18 | }
19 | });
20 | });
21 | return this;
22 | };
23 |
24 | $(function() {
25 | // Initialize all autocomplete widgets except the one in the template
26 | // form used when a new formset is added.
27 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
28 | });
29 |
30 | document.addEventListener('formset:added', (event) => {
31 | $(event.target).find('.admin-autocomplete').djangoAdminSelect2();
32 | });
33 | }
34 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/xregexp/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License
2 |
3 | Copyright (c) 2007-present Steven Levithan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/cs.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/assets/admin/css/vendor/select2/LICENSE-SELECT2.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/admin/css/login.css:
--------------------------------------------------------------------------------
1 | /* LOGIN FORM */
2 |
3 | .login {
4 | background: var(--darkened-bg);
5 | height: auto;
6 | }
7 |
8 | .login #header {
9 | height: auto;
10 | padding: 15px 16px;
11 | justify-content: center;
12 | }
13 |
14 | .login #header h1 {
15 | font-size: 1.125rem;
16 | margin: 0;
17 | }
18 |
19 | .login #header h1 a {
20 | color: var(--header-link-color);
21 | }
22 |
23 | .login #content {
24 | padding: 20px 20px 0;
25 | }
26 |
27 | .login #container {
28 | background: var(--body-bg);
29 | border: 1px solid var(--hairline-color);
30 | border-radius: 4px;
31 | overflow: hidden;
32 | width: 28em;
33 | min-width: 300px;
34 | margin: 100px auto;
35 | height: auto;
36 | }
37 |
38 | .login .form-row {
39 | padding: 4px 0;
40 | }
41 |
42 | .login .form-row label {
43 | display: block;
44 | line-height: 2em;
45 | }
46 |
47 | .login .form-row #id_username, .login .form-row #id_password {
48 | padding: 8px;
49 | width: 100%;
50 | box-sizing: border-box;
51 | }
52 |
53 | .login .submit-row {
54 | padding: 1em 0 0 0;
55 | margin: 0;
56 | text-align: center;
57 | }
58 |
59 | .login .password-reset-link {
60 | text-align: center;
61 | }
62 |
--------------------------------------------------------------------------------
/registration/migrations/0002_user_type.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0.2 on 2024-03-01 03:37
2 |
3 | import django.db.models.deletion
4 | from django.conf import settings
5 | from django.db import migrations, models
6 |
7 |
8 | class Migration(migrations.Migration):
9 | dependencies = [
10 | ("registration", "0001_initial"),
11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12 | ]
13 |
14 | operations = [
15 | migrations.CreateModel(
16 | name="user_type",
17 | fields=[
18 | (
19 | "id",
20 | models.AutoField(
21 | auto_created=True,
22 | primary_key=True,
23 | serialize=False,
24 | verbose_name="ID",
25 | ),
26 | ),
27 | ("type", models.CharField(max_length=255)),
28 | (
29 | "user",
30 | models.OneToOneField(
31 | on_delete=django.db.models.deletion.CASCADE,
32 | to=settings.AUTH_USER_MODEL,
33 | ),
34 | ),
35 | ],
36 | ),
37 | ]
38 |
--------------------------------------------------------------------------------
/assets/admin/js/vendor/select2/i18n/sk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/PrivatePing/settings/development.py:
--------------------------------------------------------------------------------
1 | from .base import *
2 | import environ
3 |
4 | LOGGING = {
5 | 'version': 1,
6 | 'disable_existing_loggers': False,
7 | 'handlers': {
8 | 'console': {
9 | 'class': 'logging.StreamHandler',
10 | },
11 | },
12 | 'loggers': {
13 | 'django': {
14 | 'handlers': ['console'],
15 | 'level': 'INFO',
16 | },
17 | },
18 | }
19 |
20 | env = environ.Env()
21 | environ.Env.read_env()
22 |
23 | SECRET_KEY = env('SECRET_KEY')
24 | SECRET_ADMIN_URL = env('SECRET_ADMIN_URL')
25 |
26 | HCAPTCHA_SITEKEY = env('HCAPTCHA_SITEKEY')
27 | HCAPTCHA_SECRET = env('HCAPTCHA_SECRET')
28 |
29 | ALLOWED_HOSTS = ['localhost']
30 | DEBUG = True
31 |
32 | CHANNEL_LAYERS = {
33 | "default": {
34 | "BACKEND": "channels.layers.InMemoryChannelLayer",
35 | }
36 | }
37 |
38 | DATABASES = {
39 | 'default': {
40 | 'ENGINE': 'django.db.backends.sqlite3',
41 | 'NAME': BASE_DIR / 'db.sqlite3',
42 | }
43 | }
44 |
45 | STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
46 |
47 | DOMAIN = "http://localhost:8000"
48 |
49 | CSRF_TRUSTED_ORIGINS = ["http://localhost:8000"]
50 |
51 | STATICFILES_DIRS = [
52 | BASE_DIR / '../assets/'
53 | ]
--------------------------------------------------------------------------------
/registration/middleware.py:
--------------------------------------------------------------------------------
1 | from django.http import HttpResponseForbidden
2 | from PrivatePing.settings import DOMAIN
3 |
4 | class AllowDesktopOnlyMiddleware:
5 | def __init__(self, get_response):
6 | self.get_response = get_response
7 |
8 | def __call__(self, request):
9 |
10 | if request.user_agent.is_mobile or request.user_agent.is_tablet:
11 | allows = ["/", "/home", "/robots.txt", "/humans.txt", "/favicon.ico"]
12 | if not request.path in allows:
13 | return HttpResponseForbidden("Sorry, PrivatePing works only on desktop. Please use a desktop to get the best experience!
")
14 | else:
15 | return self.get_response(request)
16 |
17 | response = self.get_response(request)
18 | return response
19 |
20 | class FrameOptionsMiddleware:
21 | def __init__(self, get_response):
22 | self.get_response = get_response
23 |
24 | def __call__(self, request):
25 | response = self.get_response(request)
26 | response["X-Frame-Options"] = "ALLOW-FROM " + DOMAIN
27 | response["Content-Security-Policy"] = "frame-ancestors " + DOMAIN
28 | response["X-Content-Security-Policy"] = "frame-ancestors " + DOMAIN
29 | response["Referrer-Policy"] = "same-origin"
30 |
31 | return response
--------------------------------------------------------------------------------
/chat/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
3 | from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
4 | from django.contrib.auth.models import User, Group
5 |
6 | from .models import UserProfile, Friends, Keys
7 |
8 | from unfold.admin import ModelAdmin
9 |
10 | admin.site.unregister(User)
11 | admin.site.unregister(Group)
12 |
13 |
14 | @admin.register(User)
15 | class UserAdmin(BaseUserAdmin, ModelAdmin):
16 | pass
17 |
18 |
19 | @admin.register(Group)
20 | class GroupAdmin(BaseGroupAdmin, ModelAdmin):
21 | pass
22 |
23 | @admin.register(UserProfile)
24 | class UserProfileAdmin(ModelAdmin):
25 | list_display = ('username', 'name', 'online', 'online_for')
26 | search_fields = ('username', 'name')
27 | list_filter = ('online', 'online_for')
28 | autocomplete_fields = ['user']
29 |
30 | @admin.register(Friends)
31 | class FriendsAdmin(ModelAdmin):
32 | list_display = ['user', 'friend', 'accepted']
33 | autocomplete_fields = ['user', 'friend']
34 | search_fields = ['user__username', 'friend__username']
35 | list_filter = ['accepted']
36 |
37 | @admin.register(Keys)
38 | class KeysAdmin(ModelAdmin):
39 | list_display = ['user', 'public_key']
40 | search_fields = ['user__username']
41 | autocomplete_fields = ['user']
42 |
43 |
44 | admin.site.site_header = "PrivatePing Admin"
45 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | asgiref==3.7.2
2 | async-timeout==4.0.3
3 | attrs==23.2.0
4 | autobahn==23.6.2
5 | Automat==22.10.0
6 | certifi==2024.2.2
7 | cffi==1.16.0
8 | channels==3.0.4
9 | channels-redis==4.2.0
10 | charset-normalizer==3.3.2
11 | click==8.1.7
12 | constantly==23.10.4
13 | cryptography==42.0.5
14 | daphne==3.0.2
15 | dj-database-url==2.1.0
16 | Django==5.0.2
17 | django-environ==0.11.2
18 | django-hCaptcha==0.2.0
19 | django-heroku==0.3.1
20 | django-preventconcurrentlogins==0.8.2
21 | django-rest-framework==0.1.0
22 | django-unfold==0.34.0
23 | django-user-agents==0.4.0
24 | djangorestframework==3.14.0
25 | h11==0.14.0
26 | hyperlink==21.0.0
27 | idna==3.6
28 | incremental==22.10.0
29 | msgpack==1.0.8
30 | oauthlib==3.2.2
31 | psycopg2==2.9.9
32 | psycopg2-binary==2.9.9
33 | pyasn1==0.5.1
34 | pyasn1-modules==0.3.0
35 | pycparser==2.21
36 | pyOpenSSL==24.0.0
37 | pytz==2024.1
38 | redis==5.0.2
39 | requests==2.31.0
40 | requests-oauthlib==1.3.1
41 | sentry-sdk==1.40.6
42 | service-identity==24.1.0
43 | setuptools==71.1.0
44 | six==1.16.0
45 | sqlparse==0.4.4
46 | Twisted==24.3.0
47 | txaio==23.1.1
48 | typing_extensions==4.10.0
49 | ua-parser==0.18.0
50 | urllib3==2.2.1
51 | user-agents==2.2.0
52 | uvicorn==0.27.1
53 | whitenoise==6.6.0
54 | wsproto==1.2.0
55 | psycopg2-binary==2.9.9
56 | sentry-sdk==1.40.6
57 | django_heroku==0.3.1
58 | dj-database-url==2.1.0
59 | django-hCaptcha==0.2.0
60 | django-unfold==0.34.0
61 | zope.interface==6.2
--------------------------------------------------------------------------------
/registration/templates/registration/humans.txt:
--------------------------------------------------------------------------------
1 | /* PROJECT */
2 | - Project Name: PrivatePing
3 | - Description: A secure messaging platform for private communication.
4 |
5 | /* TEAM */
6 | Project Lead: Prince Khunt [https://www.linkedin.com/in/princekhunt/]
7 |
8 | Developers: Prince Khunt [https://www.linkedin.com/in/princekhunt/], Viraj Bhingradiya [https://www.linkedin.com/in/viraj-bhingradiya-720b39216]
9 |
10 | Contributors:
11 | Prince Khunt [https://github.com/princekhunt],
12 | Sniper marube [https://github.com/snipher-marube],
13 | Mayuresh Dharwadkar [https://github.com/Mayureshd-18],
14 | Sudarshan kakde [https://github.com/sudarshankakde],
15 | Umashri V Meti [https://github.com/MetiUmashri],
16 | Keshav Dev Sharma [https://github.com/HWKDS],
17 | Yash Singhal [https://github.com/mryashsinghal],
18 | Merajul Arefin [https://github.com/j0ker70],
19 | Priyanshu Sahoo [https://github.com/Priyanshu2631],
20 | VIraj1211 [https://github.com/Bidu1211],
21 | Ashish Kumar [https://github.com/ashish0kumar]
22 | and You?
23 |
24 | /* SITE */
25 | - Website: https://privateping.apps.princekhunt.com
26 | - GitHub: https://github.com/princekhunt/privateping
27 | - License: MIT License
28 |
29 | /* THANKS */
30 | Thanks to all the developers and contributors who made this website possible.
31 |
32 | /* NOTES */
33 | - Contributions are welcome! Check out our GitHub repository for more information.
34 | - Feel free to reach out if you'd like to be added to the contributors list!
--------------------------------------------------------------------------------
/assets/css/chat/waiting_room.css:
--------------------------------------------------------------------------------
1 | .loader {
2 | width: 48px;
3 | height: 48px;
4 | border-radius: 50%;
5 | display: inline-block;
6 | position: relative;
7 | border: 3px solid;
8 | border-color: #002c76 #002c76 transparent;
9 | box-sizing: border-box;
10 | animation: rotation 0.7s linear infinite;
11 | }
12 | .loader::after {
13 | content: '';
14 | box-sizing: border-box;
15 | position: absolute;
16 | left: 0;
17 | right: 0;
18 | top: 0;
19 | bottom: 0;
20 | margin: auto;
21 | border: 3px solid;
22 | border-color: transparent #0080bf #0080bf;
23 | width: 24px;
24 | height: 24px;
25 | border-radius: 50%;
26 | animation: rotationBack 0.3s linear infinite;
27 | transform-origin: center center;
28 | }
29 |
30 | #loader-position{
31 | margin-top: 2rem;
32 | margin-left: 50%;
33 | }
34 |
35 | #waiting_text{
36 | margin-top: 15rem;
37 | font-size: 2rem;
38 | color: #050d55;
39 | font-weight: bold;
40 | font-family: 'Proxima Nova', Georgia, sans-serif;
41 | text-align: center;
42 | }
43 |
44 | @keyframes rotation {
45 | 0% {
46 | transform: rotate(0deg);
47 | }
48 | 100% {
49 | transform: rotate(360deg);
50 | }
51 | }
52 |
53 | @keyframes rotationBack {
54 | 0% {
55 | transform: rotate(0deg);
56 | }
57 | 100% {
58 | transform: rotate(-360deg);
59 | }
60 | }
61 |
62 | .back-btn{
63 | margin-top:5rem;
64 | border-radius: 50%;
65 | opacity: 0.8;
66 | }
--------------------------------------------------------------------------------
/chat/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 | from django.contrib.auth.models import User
3 |
4 | class UserProfile(models.Model):
5 |
6 | id = models.AutoField(primary_key=True, unique=True, editable=False, blank=True)
7 | user = models.OneToOneField(User, on_delete=models.CASCADE, default=None, null=True, blank=True)
8 | name = models.CharField(max_length=25)
9 | username = models.CharField(max_length=20, unique=True)
10 | online = models.IntegerField(default=0)
11 | online_for = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
12 |
13 | def __str__(self):
14 | return f"{self.username}"
15 |
16 |
17 | class Friends(models.Model):
18 |
19 | id = models.AutoField(primary_key=True, unique=True, editable=False, blank=True)
20 | user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
21 | friend = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="friend")
22 | note = models.CharField(max_length=100, blank=True, default="")
23 | accepted = models.BooleanField(default=False)
24 |
25 | class Meta:
26 | verbose_name_plural = "Friends"
27 |
28 | def __str__(self):
29 | return f"{self.user} - {self.friend}"
30 |
31 |
32 | #Store E2EE keys
33 | class Keys(models.Model):
34 | id = models.AutoField(primary_key=True, unique=True, editable=False, blank=True)
35 | user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
36 | public_key = models.TextField()
37 |
38 | class Meta:
39 | verbose_name_plural = "Keys"
40 |
41 | def __str__(self):
42 | return f"{self.user}"
--------------------------------------------------------------------------------
/assets/admin/js/prepopulate.js:
--------------------------------------------------------------------------------
1 | /*global URLify*/
2 | 'use strict';
3 | {
4 | const $ = django.jQuery;
5 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) {
6 | /*
7 | Depends on urlify.js
8 | Populates a selected field with the values of the dependent fields,
9 | URLifies and shortens the string.
10 | dependencies - array of dependent fields ids
11 | maxLength - maximum length of the URLify'd string
12 | allowUnicode - Unicode support of the URLify'd string
13 | */
14 | return this.each(function() {
15 | const prepopulatedField = $(this);
16 |
17 | const populate = function() {
18 | // Bail if the field's value has been changed by the user
19 | if (prepopulatedField.data('_changed')) {
20 | return;
21 | }
22 |
23 | const values = [];
24 | $.each(dependencies, function(i, field) {
25 | field = $(field);
26 | if (field.val().length > 0) {
27 | values.push(field.val());
28 | }
29 | });
30 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode));
31 | };
32 |
33 | prepopulatedField.data('_changed', false);
34 | prepopulatedField.on('change', function() {
35 | prepopulatedField.data('_changed', true);
36 | });
37 |
38 | if (!prepopulatedField.val()) {
39 | $(dependencies.join(',')).on('keyup change focus', populate);
40 | }
41 | });
42 | };
43 | }
44 |
--------------------------------------------------------------------------------
/PrivatePing/settings/production.py:
--------------------------------------------------------------------------------
1 | from .base import *
2 | import os
3 | import sentry_sdk
4 | import dj_database_url
5 | import django_heroku
6 |
7 | django_heroku.settings(locals())
8 |
9 | DEBUG = False
10 |
11 | SECRET_KEY = os.environ.get('SECRET_KEY')
12 | SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
13 | ALLOWED_HOSTS = ['privateping.apps.princekhunt.com']
14 | SECRET_ADMIN_URL = os.environ.get('SECRET_ADMIN_URL')
15 |
16 | #hcaptcha config
17 | HCAPTCHA_SITEKEY = os.environ.get('HCAPTCHA_SITEKEY')
18 | HCAPTCHA_SECRET = os.environ.get('HCAPTCHA_SECRET')
19 |
20 | #security config
21 | SECURE_HSTS_SECONDS = 60
22 | SECURE_HSTS_INCLUDE_SUBDOMAINS = True
23 | SECURE_SSL_REDIRECT = True
24 | SESSION_COOKIE_SECURE = True
25 | CSRF_COOKIE_SECURE = True
26 | SECURE_BROWSER_XSS_FILTER = True
27 | SECURE_HSTS_PRELOAD = True
28 |
29 | #sentry config
30 | SENTRY_DSN = os.environ.get('SENTRY_DSN')
31 | sentry_sdk.init(
32 | dsn=SENTRY_DSN,
33 | enable_tracing=True,
34 | )
35 |
36 | #channels config
37 | CHANNEL_LAYERS = {
38 | "default": {
39 | "BACKEND": "channels_redis.core.RedisChannelLayer",
40 | "CONFIG": {
41 | "hosts": [os.environ.get('REDIS_URL')],
42 | "symmetric_encryption_keys": [SECRET_KEY],
43 | },
44 | }
45 | }
46 |
47 | #database config
48 | DATABASES = {}
49 | DATABASES['default'] = dj_database_url.config(conn_max_age=600)
50 | DATABASES['default']['CONN_MAX_AGE'] = 60
51 |
52 | STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
53 |
54 | STATICFILES_DIRS = [
55 | BASE_DIR / '../assets/static'
56 | ]
57 | STATIC_ROOT = BASE_DIR / '../assets/'
58 |
59 | DISABLE_SERVER_SIDE_CURSORS = True
60 |
61 | DOMAIN = "https://privateping.apps.princekhunt.com"
--------------------------------------------------------------------------------
/registration/tools.py:
--------------------------------------------------------------------------------
1 | import random
2 | from django.contrib.auth.models import User
3 |
4 | objects_list = [
5 | "pear", "plum", "kiwi", "fig", "lime", "mango", "peach", "date", "grape", "melon",
6 | "mint", "iris", "fern", "jade", "zest", "opal", "ruby", "gold", "silk", "amber",
7 | "teal", "dove", "mist", "dusk", "dawn", "tide", "frost", "beam", "coil", "moss",
8 | "bark", "wing", "leaf", "clay", "salt", "sand", "wave", "pearl", "coral", "shell",
9 | "star", "moon", "sun", "sky", "cloud", "rain", "wind", "fire", "snow", "ice",
10 | "stone", "earth", "tree", "river", "lake", "ocean", "pond", "brook", "spring",
11 | "stream", "creek", "mountain", "valley", "canyon", "desert", "meadow"
12 | ]
13 |
14 | verbs_list = [
15 | "jumping", "singing", "playing", "swimming", "reading", "walking", "talking",
16 | "cooking", "running", "skipping", "leaping", "kicking", "flipping", "spinning",
17 | "diving", "racing", "darting", "climbing", "sprinting", "crawling", "swaying",
18 | "pushing", "pulling", "tossing", "throwing", "catching", "hopping", "skipping",
19 | "jogging", "pacing", "bolting", "chasing", "gliding", "sliding", "surfing",
20 | "skating", "rolling", "swinging", "shooting", "bouncing", "floating", "drifting",
21 | "wandering", "searching", "sneaking", "digging", "lifting", "grabbing", "hugging",
22 | "kissing", "bowing", "waving", "nodding", "pointing", "flexing", "kicking", "punching",
23 | "slapping"
24 | ]
25 |
26 | def generate_username():
27 | random.shuffle(verbs_list)
28 | random.shuffle(objects_list)
29 |
30 | while True:
31 | username = f"{verbs_list.pop()}{objects_list.pop()}"
32 |
33 | if not User.objects.filter(username=username).exists():
34 | return username
--------------------------------------------------------------------------------
/assets/js/registration/AnonymousDirectLogin.js:
--------------------------------------------------------------------------------
1 | // Get cookie
2 | function getCookie(name) {
3 | var cookieValue = null;
4 | if (document.cookie && document.cookie !== "") {
5 | var cookies = document.cookie.split(";");
6 | for (var i = 0; i < cookies.length; i++) {
7 | var cookie = cookies[i].trim();
8 | // Does this cookie string begin with the name we want?
9 | if (cookie.substring(0, name.length + 1) === (name + "=")) {
10 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
11 | break;
12 | }
13 | }
14 | }
15 | return cookieValue;
16 | }
17 |
18 | var RequestSent = false;
19 | setInterval(() => {
20 | //convert to JSON
21 | var formData = $("#anonymous-direct-login-form").serializeArray().reduce(function(obj, item) {
22 | obj[item.name] = item.value;
23 | return obj;
24 | }, {});
25 |
26 | //check the length of h-captcha-response
27 | if(formData['h-captcha-response'].length < 1){
28 | return;
29 | }
30 | if(RequestSent){
31 | return;
32 | }
33 | RequestSent = true;
34 | $.ajax({
35 | type: "POST",
36 | url: $("#anonymous-direct-login-form").attr('action'),
37 | data: $("#anonymous-direct-login-form").serialize(),
38 | success: function(data) {
39 | if (data.status === "ok") {
40 | $('#processing').text('Anonymously logging you in...');
41 | window.location.href = data.redirect;
42 |
43 | }
44 | },
45 | error: function(xhr, status, error) {
46 | console.error("An error occurred:", error);
47 | alert("An error occurred. Please try again.");
48 | }
49 | });
50 | }, 1000);
51 |
52 |
53 | parent.document.title = "PrivatePing - Anonymous Direct Login";
54 |
--------------------------------------------------------------------------------
/assets/admin/js/collapse.js:
--------------------------------------------------------------------------------
1 | /*global gettext*/
2 | 'use strict';
3 | {
4 | window.addEventListener('load', function() {
5 | // Add anchor tag for Show/Hide link
6 | const fieldsets = document.querySelectorAll('fieldset.collapse');
7 | for (const [i, elem] of fieldsets.entries()) {
8 | // Don't hide if fields in this fieldset have errors
9 | if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) {
10 | elem.classList.add('collapsed');
11 | const h2 = elem.querySelector('h2');
12 | const link = document.createElement('a');
13 | link.id = 'fieldsetcollapser' + i;
14 | link.className = 'collapse-toggle';
15 | link.href = '#';
16 | link.textContent = gettext('Show');
17 | h2.appendChild(document.createTextNode(' ('));
18 | h2.appendChild(link);
19 | h2.appendChild(document.createTextNode(')'));
20 | }
21 | }
22 | // Add toggle to hide/show anchor tag
23 | const toggleFunc = function(ev) {
24 | if (ev.target.matches('.collapse-toggle')) {
25 | ev.preventDefault();
26 | ev.stopPropagation();
27 | const fieldset = ev.target.closest('fieldset');
28 | if (fieldset.classList.contains('collapsed')) {
29 | // Show
30 | ev.target.textContent = gettext('Hide');
31 | fieldset.classList.remove('collapsed');
32 | } else {
33 | // Hide
34 | ev.target.textContent = gettext('Show');
35 | fieldset.classList.add('collapsed');
36 | }
37 | }
38 | };
39 | document.querySelectorAll('fieldset.module').forEach(function(el) {
40 | el.addEventListener('click', toggleFunc);
41 | });
42 | });
43 | }
44 |
--------------------------------------------------------------------------------
/registration/templates/registration/Home.html:
--------------------------------------------------------------------------------
1 | {% extends "registration/Base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 |
7 |
8 | PrivatePing: A secure messaging Application
9 |
10 |
11 |
12 |
13 |
14 |
15 |

16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | Do you know?
25 |
26 |
{{fact}}
27 |
37 |
38 |
39 |
40 |
53 | {% endblock %}
--------------------------------------------------------------------------------
/assets/css/base_style.css:
--------------------------------------------------------------------------------
1 | .p, h1, h2, h3, h4, h5, h6, small{
2 | font-family: 'Proxima Nova', Georgia, sans-serif;
3 | }
4 |
5 | .sidenav{
6 | height: 100%;
7 | width: 320px;
8 | position: fixed;
9 | top: 0;
10 | left: 0;
11 | z-index: 20;
12 | background: linear-gradient(to bottom, #0084c2 0%, #00428e 50%, #002871 100%);
13 | padding-top: 20px;
14 | }
15 |
16 | .sidenav a{
17 | text-decoration: none;
18 | padding: 6px 8px 6px 16px;
19 | font-size: 24px;
20 | display: block;
21 | color: #000;
22 | }
23 |
24 |
25 | .main{
26 | z-index: 10;
27 | overflow: hidden;
28 | margin-left: 320px;
29 | padding: 0px 10px;
30 | }
31 |
32 |
33 | .dropbtn {
34 | background-color: #4CAF50;
35 | color: white;
36 | padding: 16px;
37 | font-size: 16px;
38 | border: none;
39 | cursor: pointer;
40 | }
41 |
42 | .dropbtn:hover, .dropbtn:focus {
43 | background-color: #3e8e41;
44 | }
45 |
46 | #myInput {
47 | box-sizing: border-box;
48 | background-image: url("{% static 'images/searchicon.png' %}");
49 | background-position: 14px 12px;
50 | background-repeat: no-repeat;
51 | font-size: 16px;
52 | padding: 14px 20px 12px 45px;
53 | border: none;
54 | border-bottom: 1px solid #ddd;
55 | }
56 |
57 | #myInput:focus {outline: 3px solid #ddd;}
58 |
59 | .dropdown {
60 | z-index: 10;
61 | float: right;
62 | position: relative;
63 | display: inline-block;
64 | margin-right: 8px;
65 | margin-bottom: 8px;
66 | }
67 |
68 | .dropdown-content {
69 | display: none;
70 | position: absolute;
71 | background-color: #f6f6f6;
72 | min-width: 230px;
73 | overflow: auto;
74 | border: 1px solid #ddd;
75 | z-index: 20;
76 | }
77 |
78 | .dropdown-content a {
79 | z-index: 10;
80 | color: black;
81 | padding: 12px 16px;
82 | text-decoration: none;
83 | display: block;
84 | z-index: 20;
85 | }
86 |
87 | .dropdown a:hover {background-color: #ddd;}
88 |
89 | .show {display: block;}
90 |
91 |
92 | .blurred {
93 | filter: blur(10px);
94 | transition: filter 0.3s ease-in-out;
95 | }
--------------------------------------------------------------------------------
/assets/admin/js/theme.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | window.addEventListener('load', function(e) {
4 |
5 | function setTheme(mode) {
6 | if (mode !== "light" && mode !== "dark" && mode !== "auto") {
7 | console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
8 | mode = "auto";
9 | }
10 | document.documentElement.dataset.theme = mode;
11 | localStorage.setItem("theme", mode);
12 | }
13 |
14 | function cycleTheme() {
15 | const currentTheme = localStorage.getItem("theme") || "auto";
16 | const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
17 |
18 | if (prefersDark) {
19 | // Auto (dark) -> Light -> Dark
20 | if (currentTheme === "auto") {
21 | setTheme("light");
22 | } else if (currentTheme === "light") {
23 | setTheme("dark");
24 | } else {
25 | setTheme("auto");
26 | }
27 | } else {
28 | // Auto (light) -> Dark -> Light
29 | if (currentTheme === "auto") {
30 | setTheme("dark");
31 | } else if (currentTheme === "dark") {
32 | setTheme("light");
33 | } else {
34 | setTheme("auto");
35 | }
36 | }
37 | }
38 |
39 | function initTheme() {
40 | // set theme defined in localStorage if there is one, or fallback to auto mode
41 | const currentTheme = localStorage.getItem("theme");
42 | currentTheme ? setTheme(currentTheme) : setTheme("auto");
43 | }
44 |
45 | function setupTheme() {
46 | // Attach event handlers for toggling themes
47 | const buttons = document.getElementsByClassName("theme-toggle");
48 | Array.from(buttons).forEach((btn) => {
49 | btn.addEventListener("click", cycleTheme);
50 | });
51 | initTheme();
52 | }
53 |
54 | setupTheme();
55 | });
56 | }
57 |
--------------------------------------------------------------------------------
/assets/js/chat/waiting_room.js:
--------------------------------------------------------------------------------
1 | function escapeHtml(text) {
2 | return text.replace(//g, ">");
3 | }
4 |
5 | $(document).ready(function(){
6 | function getUrlParameter(name) {
7 | name = escapeHtml(name);
8 | name = name.replace(/\[/g, '\\[').replace(/\]/g, '\\]');
9 | var regex = new RegExp('[\\?&]' + name + '=([^]*)');
10 | var results = regex.exec(location.search);
11 | return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
12 |
13 | };
14 |
15 | function checkUserStatus(userID){
16 | $.ajax({
17 | url: 'api/room',
18 | method: 'GET',
19 | data: { user: userID }, // Pass the user ID along with the request
20 | success: function(response){
21 | if(response.status == true){
22 | window.location.href = 'chat/' + userID;
23 | // You can perform any action here, such as enabling chat UI
24 | }
25 | },
26 | error: function(){
27 | // You can handle errors here
28 | }
29 | });
30 | }
31 |
32 | // Extract user ID from URL parameter
33 | var userID = getUrlParameter('user');
34 |
35 | // Call the function initially when the page loads
36 | if(userID){
37 | checkUserStatus(userID);
38 | }
39 |
40 | // Set interval to periodically check user status
41 | setInterval(function(){
42 | if(userID){
43 | checkUserStatus(userID);
44 | }
45 | }, 1000); // Check every 1 seconds, adjust as needed
46 | });
47 |
48 | // Add dots to waiting text
49 | var text = document.getElementById("waiting_text");
50 | var old = document.getElementById("waiting_text").innerHTML;
51 | var dots = 0;
52 | var dots_interval = setInterval(function () {
53 | if (dots < 3) {
54 | text.innerHTML += ".";
55 | dots++;
56 | } else {
57 | document.getElementById("waiting_text").innerHTML = old;
58 | dots = 0;
59 | }
60 | }, 500);
61 |
62 |
63 |
64 |
65 | //goback
66 | function goback(){
67 | window.history.back();
68 |
69 | }
--------------------------------------------------------------------------------
/assets/admin/css/responsive_rtl.css:
--------------------------------------------------------------------------------
1 | /* TABLETS */
2 |
3 | @media (max-width: 1024px) {
4 | [dir="rtl"] .colMS {
5 | margin-right: 0;
6 | }
7 |
8 | [dir="rtl"] #user-tools {
9 | text-align: right;
10 | }
11 |
12 | [dir="rtl"] #changelist .actions label {
13 | padding-left: 10px;
14 | padding-right: 0;
15 | }
16 |
17 | [dir="rtl"] #changelist .actions select {
18 | margin-left: 0;
19 | margin-right: 15px;
20 | }
21 |
22 | [dir="rtl"] .change-list .filtered .results,
23 | [dir="rtl"] .change-list .filtered .paginator,
24 | [dir="rtl"] .filtered #toolbar,
25 | [dir="rtl"] .filtered div.xfull,
26 | [dir="rtl"] .filtered .actions,
27 | [dir="rtl"] #changelist-filter {
28 | margin-left: 0;
29 | }
30 |
31 | [dir="rtl"] .inline-group ul.tools a.add,
32 | [dir="rtl"] .inline-group div.add-row a,
33 | [dir="rtl"] .inline-group .tabular tr.add-row td a {
34 | padding: 8px 26px 8px 10px;
35 | background-position: calc(100% - 8px) 9px;
36 | }
37 |
38 | [dir="rtl"] .related-widget-wrapper-link + .selector {
39 | margin-right: 0;
40 | margin-left: 15px;
41 | }
42 |
43 | [dir="rtl"] .selector .selector-filter label {
44 | margin-right: 0;
45 | margin-left: 8px;
46 | }
47 |
48 | [dir="rtl"] .object-tools li {
49 | float: right;
50 | }
51 |
52 | [dir="rtl"] .object-tools li + li {
53 | margin-left: 0;
54 | margin-right: 15px;
55 | }
56 |
57 | [dir="rtl"] .dashboard .module table td a {
58 | padding-left: 0;
59 | padding-right: 16px;
60 | }
61 | }
62 |
63 | /* MOBILE */
64 |
65 | @media (max-width: 767px) {
66 | [dir="rtl"] .aligned .related-lookup,
67 | [dir="rtl"] .aligned .datetimeshortcuts {
68 | margin-left: 0;
69 | margin-right: 15px;
70 | }
71 |
72 | [dir="rtl"] .aligned ul,
73 | [dir="rtl"] form .aligned ul.errorlist {
74 | margin-right: 0;
75 | }
76 |
77 | [dir="rtl"] #changelist-filter {
78 | margin-left: 0;
79 | margin-right: 0;
80 | }
81 | [dir="rtl"] .aligned .vCheckboxLabel {
82 | padding: 1px 5px 0 0;
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/registration/templates/registration/Base.html:
--------------------------------------------------------------------------------
1 | {% load static %}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
12 |
13 |
15 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
28 |
30 |
31 |
32 |
33 |
34 | {% block content %}{% endblock %}
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/assets/js/registration/GenerateKeys.js:
--------------------------------------------------------------------------------
1 | function getCookie(name) {
2 | var cookieValue = null;
3 | if (document.cookie && document.cookie !== "") {
4 | var cookies = document.cookie.split(";");
5 | for (var i = 0; i < cookies.length; i++) {
6 | var cookie = cookies[i].trim();
7 | // Does this cookie string begin with the name we want?
8 | if (cookie.substring(0, name.length + 1) === name + "=") {
9 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
10 | break;
11 | }
12 | }
13 | }
14 | return cookieValue;
15 | }
16 |
17 | async function generateKeys() {
18 | const { publicKey, privateKey } = await window.crypto.subtle.generateKey(
19 | {
20 | name: "RSA-OAEP",
21 | modulusLength: 2048, // can be 1024, 2048, or 4096
22 | publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
23 | hash: { name: "SHA-256" }, // can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
24 | },
25 | true, // whether the key is extractable (i.e. can be used in exportKey)
26 | ["encrypt", "decrypt"] // can be any combination of "encrypt" and "decrypt"
27 | );
28 | return { publicKey, privateKey };
29 | }
30 |
31 | async function main() {
32 | const { publicKey, privateKey } = await generateKeys();
33 | //save private key in local storage
34 | const privateKeyExported = await window.crypto.subtle.exportKey(
35 | "jwk",
36 | privateKey
37 | );
38 |
39 | localStorage.setItem("privateKey", JSON.stringify(privateKeyExported));
40 | //make a post request of the public key to the server
41 | const publicKeyExported = await window.crypto.subtle.exportKey(
42 | "jwk",
43 | publicKey
44 | );
45 |
46 | //combine the public key in one string
47 | const publicKeyString = JSON.stringify(publicKeyExported);
48 |
49 | //ajax post request
50 | $.ajax({
51 | type: "POST",
52 | url: "",
53 | data: {
54 | csrfmiddlewaretoken: getCookie("csrftoken"),
55 | public_key: publicKeyString,
56 | success: true,
57 | },
58 | success: function (data) {
59 | window.location = data.redirect;
60 | },
61 | });
62 | }
63 |
64 | main();
65 |
66 | if (typeof parent !== 'undefined' && parent.document) {
67 | parent.document.title = "PrivatePing - Securing Session";
68 | }
--------------------------------------------------------------------------------
/assets/css/chat.css:
--------------------------------------------------------------------------------
1 | .container {
2 | border: 2px solid #dedede;
3 | background-color: #e5e5ea;
4 | border-radius: 0px 15px 15px 15px;
5 | padding: 10px;
6 | margin: 10px;
7 | overflow: hidden;
8 |
9 | /* make the box at left side */
10 | float: left;
11 | clear: both;
12 | margin-left: 10px;
13 | margin-right: 10px;
14 | margin-top: 10px;
15 | margin-bottom: 10px;
16 | }
17 |
18 | .container-darker {
19 | /*max-height: 120px;*/
20 | /* make color bluish */
21 | -webkit-border-radius: 15px;
22 | -moz-border-radius: 15px;
23 | border-radius: 15px 15px 0px 15px;
24 | color: #fff;
25 |
26 | background-color: #1289fe;
27 | padding: 10px;
28 | margin: 10px;
29 | overflow: hidden;
30 |
31 | /* make the box at right side */
32 | float: right;
33 | clear: both;
34 | margin-left: 10px;
35 | margin-right: 10px;
36 | margin-top: 10px;
37 | margin-bottom: 10px;
38 | }
39 |
40 | .container::after {
41 | content: "";
42 | clear: both;
43 | display: table;
44 | -webkit-box-shadow: 5px 5px 2px #dedede;
45 | -moz-box-shadow: 5px 5px 2px #dedede;
46 | box-shadow: 5px 5px 2px #dedede;
47 | }
48 |
49 | .container img {
50 | float: left;
51 | max-width: 60px;
52 | margin-right: 20px;
53 | border-radius: 50%;
54 | }
55 |
56 | .container img.right {
57 | float: right;
58 | margin-left: 20px;
59 | margin-right: 0;
60 | }
61 |
62 | .time-right {
63 | float: right;
64 | color: #aaa;
65 | }
66 |
67 | .time-left {
68 | float: left;
69 | color: #999;
70 | }
71 |
72 | .messages {
73 | height: 500px;
74 | /*width: 1200px;*/
75 | border: thick solid #000;
76 | border-width: 2px;
77 | margin-top: 16px;
78 | overflow-y: auto;
79 | }
80 |
81 | #msg_field {
82 | margin-left: 24px;
83 | margin-top: 16px;
84 | width: 850px;
85 | }
86 |
87 | .container-darker::after {
88 | content: "";
89 | clear: both;
90 | display: table;
91 | -webkit-box-shadow: 5px 5px 2px #dedede;
92 | -moz-box-shadow: 5px 5px 2px #dedede;
93 | box-shadow: 5px 5px 2px #dedede;
94 | }
95 |
96 | .container-darker img {
97 | float: left;
98 | max-width: 60px;
99 | margin-right: 20px;
100 | border-radius: 50%;
101 | }
102 |
103 | .container-darker img.right {
104 | float: right;
105 | margin-left: 20px;
106 | margin-right: 0;
107 | }
108 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Reporting a Vulnerability
4 |
5 | At PrivatePing, we take security seriously. If you believe you have found a security vulnerability in our project, we encourage you to let us know right away. We appreciate your efforts and will do our best to address the issue promptly.
6 |
7 | To report a security vulnerability, please send an email to [info[at]princekhunt.com](mailto:info@princekhunt.com) with the following details:
8 |
9 | - Description of the vulnerability
10 | - Steps to reproduce the vulnerability
11 | - Any additional information or context that may be helpful
12 |
13 | We kindly request that you refrain from publicly disclosing the vulnerability until we have had an opportunity to address it.
14 |
15 | ## Response Timeline
16 |
17 | Upon receiving a security vulnerability report, we will strive to follow these general timelines:
18 |
19 | - **Acknowledgment**: We will acknowledge your report within 48 hours of receiving it.
20 | - **Investigation**: Our team will investigate and validate the vulnerability's presence within the project. This process may take some time depending on the complexity of the issue.
21 | - **Resolution**: Once validated, we will work diligently to develop and test a fix for the vulnerability.
22 | - **Disclosure**: We will coordinate with you regarding the public disclosure of the vulnerability. Generally, we aim to release a fix and disclose the vulnerability within 30 days of initial report, provided it does not require additional coordination with third-party vendors or dependencies.
23 |
24 | ## Scope
25 |
26 | This security policy applies to vulnerabilities discovered in ([PrivatePing's GitHub repository](https://github.com/princekhunt/privateping)).
27 |
28 | Please note that this policy does not cover security vulnerabilities in third-party dependencies. If you believe a vulnerability exists in a third-party dependency used by PrivatePing, please follow responsible disclosure practices and report it directly to the maintainers of the affected project.
29 |
30 | ## Reward
31 |
32 | As a token of our appreciation for responsibly disclosing security vulnerabilities, we may offer rewards or acknowledgments to individuals who report valid vulnerabilities. The nature and extent of any reward will be determined at our discretion.
33 |
34 | We greatly value your assistance in helping us maintain the security of PrivatePing. Thank you for your contributions to the safety and integrity of our project.
35 |
--------------------------------------------------------------------------------
/assets/js/chat/chats.js:
--------------------------------------------------------------------------------
1 | const socketProtocol_3 = (window.location.protocol === 'https:') ? 'wss' : 'ws';
2 |
3 | const socket_3 = new WebSocket(socketProtocol_3 + "://" + window.location.host + '/ws/chat/status/');
4 | socket_3.onopen = function (e) {
5 | socket_3.send(JSON.stringify({
6 | 'check': 'livestatus',
7 | 'for': getUserName(),
8 | }));
9 | };
10 |
11 | //keep checking if user is online
12 | setInterval(function () {
13 | socket_3.send(JSON.stringify({
14 | 'check': 'livestatus',
15 | 'for': getUserName(),
16 | }));
17 | }, 3000);
18 |
19 | var count = 0;
20 | socket_3.addEventListener('message', function (e) {
21 | const data = JSON.parse(e.data);
22 | if (data.status == 'offline') {
23 | if (count >= 3) {
24 | Swal.fire({
25 | icon: "error",
26 | title: "Oops...",
27 | confirmButtonColor: "#003d89",
28 | text: "User disconnected, Navigating you to home page!",
29 | }).then(function(){
30 | parent.location.href = "/";
31 |
32 | });
33 | }
34 | else {
35 | count++;
36 | }
37 | }
38 | else {
39 | count = 0;
40 | }
41 | });
42 |
43 | //Do not send empty messages
44 | if(document.getElementById("msg_field").value == ""){
45 | document.getElementById("send_btn").disabled = true;
46 | }
47 | else{
48 | document.getElementById("send_btn").disabled = false;
49 | }
50 |
51 | document.getElementById("msg_field").addEventListener("input", function(){
52 | if(document.getElementById("msg_field").value == ""){
53 | document.getElementById("send_btn").disabled = true;
54 | }
55 | else{
56 | document.getElementById("send_btn").disabled = false;
57 | }
58 | });
59 |
60 | Swal.fire({
61 | title: "Creating a secure room!",
62 | text: "Please wait while we connect you.",
63 | confirmButtonColor: "#003d89",
64 | icon: "info"
65 | });
66 | document.getElementById("msg_field").disabled = true;
67 | document.getElementById("send_btn").disabled = true;
68 |
69 | function trashmessages(){
70 | //play sound
71 | var audio = new Audio('/static/media/delete.mp3');
72 | audio.play();
73 |
74 | //Remove all messages whose id is ChatMessage
75 | var chatMessages = document.querySelectorAll('#ChatMessage');
76 |
77 | // Iterate through each element and remove it
78 | chatMessages.forEach(function(element) {
79 | element.remove();
80 | });
81 |
82 | }
--------------------------------------------------------------------------------
/assets/js/registration/Login.js:
--------------------------------------------------------------------------------
1 | document.getElementById("username").focus();
2 | document
3 | .getElementById("username-button")
4 | .addEventListener("click", function (event) {
5 | event.preventDefault();
6 | const username = document.getElementById("username").value.trim();
7 | if (username == "") {
8 | document.getElementById("err_mssg").innerHTML = "username is required!";
9 | return false
10 | }
11 | else {
12 | document.getElementById("err_mssg").innerHTML = "";
13 | document.getElementById("username-form").style.transform =
14 | "translateX(-400%)";
15 | document.getElementById("username-form").style.transition =
16 | "transform 0.5s ease-in-out";
17 | setTimeout(function () {
18 | document.getElementById("username-form").style.display = "none";
19 | document.getElementById("password-field").style.display = "flex";
20 | document.getElementById("password-field").style.transform = "translateX(300%)";
21 | document.getElementById("password-field").style.transition = "transform 0.4s ease-in-out ";
22 | setTimeout(function () {
23 | document.getElementById("password-field").style.transform = "translateX(0%)";
24 | document.getElementById("password").focus();
25 | }, 200);
26 | }, 400);
27 | }});
28 |
29 | //form submit
30 |
31 | //make enter button as submit button
32 | document.getElementById("password").addEventListener("keyup", function (event) {
33 | event.preventDefault();
34 | if (event.keyCode === 13) {
35 | document.getElementById("login-button").click();
36 | }
37 | });
38 |
39 |
40 | function FormProcessing() {
41 | event.preventDefault();
42 | document.getElementById("LoginForm").style.display = "none";
43 | document.getElementById("processing").innerHTML = "Logging you in...";
44 |
45 | document.getElementById("LoginForm").submit();
46 | }
47 |
48 | var login_button = document.getElementById("login-button");
49 | login_button.addEventListener("click", FormProcessing);
50 | login_button.addEventListener("submit", FormProcessing);
51 |
52 |
53 | // Hide the loader when the page is fully loader
54 | document.getElementById("Maincontent").style.display = "none";
55 |
56 | window.addEventListener("load", function () {
57 | $("#pageloader").fadeOut();
58 | $("#Maincontent").delay(500).fadeIn();
59 | });
60 |
61 | //goback
62 | function goback(){
63 | window.history.back();
64 |
65 | }
66 |
67 | parent.document.title = "PrivatePing - Login";
--------------------------------------------------------------------------------
/chat/templates/chat/FriendRequest.html:
--------------------------------------------------------------------------------
1 | {% extends "chat/Base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 |
7 |
You have received friend request from: {{RequestFrom}}
8 | {% if note %}
9 | Request Note: {{note}}
10 | {% endif %}
11 |
12 |
13 | Accept
14 |
15 |
16 |
17 |
18 | Reject
19 |
20 |
21 |
68 |
69 |
70 |
71 | {% endblock %}
--------------------------------------------------------------------------------
/assets/css/registration/AnonymousDirectLogin.css:
--------------------------------------------------------------------------------
1 | body,
2 | html {
3 | height: 100%;
4 | margin: 0;
5 | display: flex;
6 | justify-content: center;
7 | align-items: center;
8 | background-color: #fff;
9 | font-family: 'proxima_nova_ltthin', Georgia, sans-serif;
10 | }
11 |
12 | #login-container {
13 | text-align: center;
14 | display: flex;
15 | flex-direction: column;
16 | align-items: center;
17 | }
18 |
19 | #anonymous-direct-login-form {
20 | display: flex;
21 | flex-direction: column;
22 | align-items: center;
23 | gap: 10px;
24 | }
25 |
26 | .DirectLoginLoader {
27 | animation: rotate 1s infinite;
28 | height: 100px; /* Increased height */
29 | width: 100px; /* Increased width */
30 | margin-bottom: 20px; /* Add margin to separate from the text */
31 | }
32 |
33 | .DirectLoginLoader:before,
34 | .DirectLoginLoader:after {
35 | border-radius: 50%;
36 | content: "";
37 | display: block;
38 | height: 40px; /* Increased height */
39 | width: 40px; /* Increased width */
40 | }
41 |
42 | .DirectLoginLoader:before {
43 | animation: ball1 1s infinite;
44 | background-color: #000;
45 | box-shadow: 60px 0 0 #007bff; /* Adjusted box-shadow */
46 | }
47 |
48 | .DirectLoginLoader:after {
49 | animation: ball2 1s infinite;
50 | background-color: #007bff;
51 | box-shadow: 60px 0 0 #000; /* Adjusted box-shadow */
52 | }
53 |
54 | @keyframes rotate {
55 | 0% {
56 | transform: rotate(0deg) scale(0.8);
57 | }
58 | 50% {
59 | transform: rotate(360deg) scale(1.2);
60 | }
61 | 100% {
62 | transform: rotate(720deg) scale(0.8);
63 | }
64 | }
65 |
66 | @keyframes ball1 {
67 | 0% {
68 | box-shadow: 60px 0 0 #007bff; /* Adjusted box-shadow */
69 | }
70 | 50% {
71 | box-shadow: 0 0 0 #007bff;
72 | margin-bottom: 0;
73 | transform: translate(30px, 30px); /* Adjusted translation */
74 | }
75 | 100% {
76 | box-shadow: 60px 0 0 #007bff; /* Adjusted box-shadow */
77 | margin-bottom: 20px; /* Adjusted margin */
78 | }
79 | }
80 |
81 | @keyframes ball2 {
82 | 0% {
83 | box-shadow: 60px 0 0 #000; /* Adjusted box-shadow */
84 | }
85 | 50% {
86 | box-shadow: 0 0 0 #000;
87 | margin-top: -40px; /* Adjusted margin */
88 | transform: translate(30px, 30px); /* Adjusted translation */
89 | }
90 | 100% {
91 | box-shadow: 60px 0 0 #000; /* Adjusted box-shadow */
92 | margin-top: 0; /* Adjusted margin */
93 | }
94 | }
95 |
96 | .captcha-container{
97 | margin-top: 2rem;
98 | }
99 |
100 | .processing-text{
101 | text-align: center;
102 | }
--------------------------------------------------------------------------------
/assets/css/chat/Base.css:
--------------------------------------------------------------------------------
1 | .p, h1, h2, h3, h4, h5, h6, small{
2 | font-family: 'Proxima Nova', Georgia, sans-serif;
3 | }
4 |
5 | .circle-icon {
6 | background: #badcf3;
7 | padding: 20px;
8 | border-radius: 60%;
9 | }
10 |
11 | /* Show only navbar, nothing else on mobile device */
12 |
13 | @media (max-width: 768px) {
14 | .main {
15 | display: none;
16 | }
17 | }
18 |
19 | /* make the navbar full sized in mobile device */
20 | @media (max-width: 768px) {
21 | .sidenav {
22 | width: 100%;
23 | }
24 | /* replace menubar button with add friend icon */
25 | .dropdown {
26 | display: none;
27 | }
28 |
29 | .mobile-menu {
30 | display: flex;
31 | justify-content: space-between;
32 | padding: 0 10px;
33 | }
34 | /* hide mobile menu in all those devices, which are not mobile */
35 | @media (max-width: 768px) {
36 | .mobile-menu {
37 | display: inline;
38 | }
39 | }
40 |
41 | @media (min-width: 600px) {
42 | .mobile-menu {
43 | display: none;
44 | }
45 | }
46 | }
47 |
48 | .text-center {
49 | text-align: center;
50 | }
51 |
52 | .greet{
53 | margin-top: 15vh;
54 | text-align: center;
55 | }
56 |
57 | .greet-tagline{
58 | margin-top: 25vh;
59 | text-align: center
60 | }
61 |
62 | .built-credit{
63 | margin-top: 43vh;
64 | text-align: center
65 | }
66 |
67 | .add-user-input {
68 | width: 100%;
69 | padding: 12px 15px;
70 | margin-bottom: 15px;
71 | border: 1px solid #ddd;
72 | border-radius: 25px;
73 | box-sizing: border-box;
74 | transition: border-color 0.3s ease, box-shadow 0.3s ease;
75 | font-size: 14px;
76 | background-color: #fff;
77 | }
78 |
79 | .add-user-input:focus {
80 | border-color: #007bff;
81 | box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
82 | outline: none;
83 | }
84 |
85 | small {
86 | display: block;
87 | margin-bottom: 5px;
88 | color: #888;
89 | }
90 |
91 | textarea.add-user-input {
92 | height: 100px;
93 | resize: vertical;
94 | }
95 |
96 | #adduserbutton {
97 | width: 100%;
98 | padding: 12px 15px;
99 | border: none;
100 | border-radius: 25px;
101 | background-color: #007bff;
102 | color: #fff;
103 | font-size: 16px;
104 | font-weight: bold;
105 | cursor: pointer;
106 | transition: background-color 0.3s ease, box-shadow 0.3s ease;
107 | }
108 |
109 | #adduserbutton:hover {
110 | background-color: #0056b3;
111 | box-shadow: 0 2px 5px rgba(0, 91, 179, 0.3);
112 | }
113 |
114 | .top-nav-header{
115 | color: rgb(180, 237, 232);
116 | padding-left: 7vh;
117 | display: block-content;
118 | text-align: center;
119 | }
120 |
121 | .top-nav-list{
122 | border: none;
123 | background-color: transparent;
124 | }
125 |
126 | #delete-friend{
127 | padding: 1.8rem 0rem 0rem 0rem;
128 | color: rgb(255, 91, 91);
129 | cursor: pointer;
130 | }
131 | #profile-link{
132 | text-decoration: underline;
133 | cursor: pointer;
134 | }
--------------------------------------------------------------------------------
/assets/css/registration/GenerateKeys.css:
--------------------------------------------------------------------------------
1 | body,
2 | html {
3 | height: 100%;
4 | margin: 0;
5 | display: flex;
6 | justify-content: center;
7 | align-items: center;
8 | background-color: #fff;
9 | font-family: 'proxima_nova_ltthin', Georgia, sans-serif;
10 | }
11 |
12 | #login-container {
13 | text-align: center;
14 | }
15 |
16 | #login-form {
17 | display: flex;
18 | flex-direction: column;
19 | align-items: center;
20 | gap: 10px;
21 | }
22 |
23 | .input-container {
24 | position: relative;
25 | overflow: hidden; /* Ensures the overflow is hidden for animation */
26 | }
27 |
28 | .input-field {
29 | width: 250px;
30 | padding: 10px;
31 | border: 1px solid #ccc;
32 | border-radius: 5px;
33 | outline: none;
34 | transition: transform 0.5s ease; /* Define the transition property */
35 | }
36 |
37 | .login-button {
38 | position: absolute;
39 | top: 50%;
40 | right: 0;
41 | transform: translateY(-50%);
42 | width: 50px;
43 | height: 100%;
44 | padding: 0;
45 | border: none;
46 | border-radius: 0 5px 5px 0;
47 | background-color: #007bff;
48 | color: white;
49 | cursor: pointer;
50 | font-size: 24px;
51 | line-height: 1;
52 | display: flex;
53 | justify-content: center;
54 | align-items: center;
55 | }
56 |
57 | .login-button:hover {
58 | background-color: #0056b3;
59 | }
60 |
61 | .login-button:active {
62 | background-color: #004080;
63 | }
64 | #password-field {
65 | display: none;
66 | }
67 |
68 | #password-field.active {
69 | display: block;
70 | }
71 |
72 | #password-button {
73 | display: none;
74 | }
75 |
76 | #password-button.active {
77 | display: block;
78 | }
79 |
80 | .loader {
81 | width: 64px;
82 | height: 44px;
83 | position: relative;
84 | border: 5px solid #000000;
85 | border-radius: 8px;
86 | }
87 | .loader::before {
88 | content: "";
89 | position: absolute;
90 | border: 5px solid #000000;
91 | width: 32px;
92 | height: 28px;
93 | border-radius: 50% 50% 0 0;
94 | left: 50%;
95 | top: 0;
96 | transform: translate(-50%, -100%);
97 | }
98 | .loader::after {
99 | content: "";
100 | position: absolute;
101 | transform: translate(-50%, -50%);
102 | left: 50%;
103 | top: 50%;
104 | width: 8px;
105 | height: 8px;
106 | border-radius: 50%;
107 | background-color: #000000;
108 | box-shadow: 16px 0 #000, -16px 0 #000;
109 | animation: flash 0.4s ease-out infinite alternate;
110 | }
111 |
112 | @keyframes flash {
113 | 0% {
114 | background-color: rgba(255, 255, 255, 0.25);
115 | box-shadow: 16px 0 rgba(255, 255, 255, 0.25), -16px 0 rgb(0, 0, 0);
116 | }
117 | 50% {
118 | background-color: rgb(0, 0, 0);
119 | box-shadow: 16px 0 rgba(255, 255, 255, 0.25),
120 | -16px 0 rgba(255, 255, 255, 0.25);
121 | }
122 | 100% {
123 | background-color: rgba(255, 255, 255, 0.25);
124 | box-shadow: 16px 0 rgb(0, 0, 0), -16px 0 rgba(255, 255, 255, 0.25);
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/assets/fonts/fonts.min.css:
--------------------------------------------------------------------------------
1 | @font-face{font-family:proxima_nova_altblack;src:url('Mark Simonson - Proxima Nova Alt Black-webfont.eot');src:url('Mark Simonson - Proxima Nova Alt Black-webfont.eot?#iefix') format('embedded-opentype'),url('Mark Simonson - Proxima Nova Alt Black-webfont.woff2') format('woff2'),url('Mark Simonson - Proxima Nova Alt Black-webfont.woff') format('woff'),url('Mark Simonson - Proxima Nova Alt Black-webfont.ttf') format('truetype'),url('Mark Simonson - Proxima Nova Alt Black-webfont.svg#proxima_nova_altblack') format('svg');font-weight:400;font-style:normal}@font-face{font-family:proxima_nova_altbold;src:url('Mark Simonson - Proxima Nova Alt Bold-webfont.eot');src:url('Mark Simonson - Proxima Nova Alt Bold-webfont.eot?#iefix') format('embedded-opentype'),url('Mark Simonson - Proxima Nova Alt Bold-webfont.woff2') format('woff2'),url('Mark Simonson - Proxima Nova Alt Bold-webfont.woff') format('woff'),url('Mark Simonson - Proxima Nova Alt Bold-webfont.ttf') format('truetype'),url('Mark Simonson - Proxima Nova Alt Bold-webfont.svg#proxima_nova_altbold') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Proxima Nova';src:url('Mark Simonson - Proxima Nova Alt Regular-webfont.eot');src:url('Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix') format('embedded-opentype'),url('Mark Simonson - Proxima Nova Alt Regular-webfont.woff2') format('woff2'),url('Mark Simonson - Proxima Nova Alt Regular-webfont.woff') format('woff'),url('Mark Simonson - Proxima Nova Alt Regular-webfont.ttf') format('truetype'),url('Mark Simonson - Proxima Nova Alt Regular-webfont.svg#proxima_nova_altregular') format('svg');font-weight:400;font-style:normal}@font-face{font-family:proxima_nova_scosfthin;src:url('Mark Simonson - Proxima Nova ScOsf Thin-webfont.eot');src:url('Mark Simonson - Proxima Nova ScOsf Thin-webfont.eot?#iefix') format('embedded-opentype'),url('Mark Simonson - Proxima Nova ScOsf Thin-webfont.woff2') format('woff2'),url('Mark Simonson - Proxima Nova ScOsf Thin-webfont.woff') format('woff'),url('Mark Simonson - Proxima Nova ScOsf Thin-webfont.ttf') format('truetype'),url('Mark Simonson - Proxima Nova ScOsf Thin-webfont.svg#proxima_nova_scosfthin') format('svg');font-weight:400;font-style:normal}@font-face{font-family:proxima_nova_ltsemibold;src:url('Mark Simonson - Proxima Nova Semibold-webfont.eot');src:url('Mark Simonson - Proxima Nova Semibold-webfont.eot?#iefix') format('embedded-opentype'),url('Mark Simonson - Proxima Nova Semibold-webfont.woff2') format('woff2'),url('Mark Simonson - Proxima Nova Semibold-webfont.woff') format('woff'),url('Mark Simonson - Proxima Nova Semibold-webfont.ttf') format('truetype'),url('Mark Simonson - Proxima Nova Semibold-webfont.svg#proxima_nova_ltsemibold') format('svg');font-weight:400;font-style:normal}@font-face{font-family:proxima_nova_ltthin;src:url('Mark Simonson - Proxima Nova Thin-webfont.eot');src:url('Mark Simonson - Proxima Nova Thin-webfont.eot?#iefix') format('embedded-opentype'),url('Mark Simonson - Proxima Nova Thin-webfont.woff2') format('woff2'),url('Mark Simonson - Proxima Nova Thin-webfont.woff') format('woff'),url('Mark Simonson - Proxima Nova Thin-webfont.ttf') format('truetype'),url('Mark Simonson - Proxima Nova Thin-webfont.svg#proxima_nova_ltthin') format('svg');font-weight:400;font-style:normal}
2 |
--------------------------------------------------------------------------------
/assets/admin/css/dark_mode.css:
--------------------------------------------------------------------------------
1 | @media (prefers-color-scheme: dark) {
2 | :root {
3 | --primary: #264b5d;
4 | --primary-fg: #f7f7f7;
5 |
6 | --body-fg: #eeeeee;
7 | --body-bg: #121212;
8 | --body-quiet-color: #e0e0e0;
9 | --body-loud-color: #ffffff;
10 |
11 | --breadcrumbs-link-fg: #e0e0e0;
12 | --breadcrumbs-bg: var(--primary);
13 |
14 | --link-fg: #81d4fa;
15 | --link-hover-color: #4ac1f7;
16 | --link-selected-fg: #6f94c6;
17 |
18 | --hairline-color: #272727;
19 | --border-color: #353535;
20 |
21 | --error-fg: #e35f5f;
22 | --message-success-bg: #006b1b;
23 | --message-warning-bg: #583305;
24 | --message-error-bg: #570808;
25 |
26 | --darkened-bg: #212121;
27 | --selected-bg: #1b1b1b;
28 | --selected-row: #00363a;
29 |
30 | --close-button-bg: #333333;
31 | --close-button-hover-bg: #666666;
32 | }
33 | }
34 |
35 |
36 | html[data-theme="dark"] {
37 | --primary: #264b5d;
38 | --primary-fg: #f7f7f7;
39 |
40 | --body-fg: #eeeeee;
41 | --body-bg: #121212;
42 | --body-quiet-color: #e0e0e0;
43 | --body-loud-color: #ffffff;
44 |
45 | --breadcrumbs-link-fg: #e0e0e0;
46 | --breadcrumbs-bg: var(--primary);
47 |
48 | --link-fg: #81d4fa;
49 | --link-hover-color: #4ac1f7;
50 | --link-selected-fg: #6f94c6;
51 |
52 | --hairline-color: #272727;
53 | --border-color: #353535;
54 |
55 | --error-fg: #e35f5f;
56 | --message-success-bg: #006b1b;
57 | --message-warning-bg: #583305;
58 | --message-error-bg: #570808;
59 |
60 | --darkened-bg: #212121;
61 | --selected-bg: #1b1b1b;
62 | --selected-row: #00363a;
63 |
64 | --close-button-bg: #333333;
65 | --close-button-hover-bg: #666666;
66 | }
67 |
68 | /* THEME SWITCH */
69 | .theme-toggle {
70 | cursor: pointer;
71 | border: none;
72 | padding: 0;
73 | background: transparent;
74 | vertical-align: middle;
75 | margin-inline-start: 5px;
76 | margin-top: -1px;
77 | }
78 |
79 | .theme-toggle svg {
80 | vertical-align: middle;
81 | height: 1rem;
82 | width: 1rem;
83 | display: none;
84 | }
85 |
86 | /*
87 | Fully hide screen reader text so we only show the one matching the current
88 | theme.
89 | */
90 | .theme-toggle .visually-hidden {
91 | display: none;
92 | }
93 |
94 | html[data-theme="auto"] .theme-toggle .theme-label-when-auto {
95 | display: block;
96 | }
97 |
98 | html[data-theme="dark"] .theme-toggle .theme-label-when-dark {
99 | display: block;
100 | }
101 |
102 | html[data-theme="light"] .theme-toggle .theme-label-when-light {
103 | display: block;
104 | }
105 |
106 | /* ICONS */
107 | .theme-toggle svg.theme-icon-when-auto,
108 | .theme-toggle svg.theme-icon-when-dark,
109 | .theme-toggle svg.theme-icon-when-light {
110 | fill: var(--header-link-color);
111 | color: var(--header-bg);
112 | }
113 |
114 | html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto {
115 | display: block;
116 | }
117 |
118 | html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark {
119 | display: block;
120 | }
121 |
122 | html[data-theme="light"] .theme-toggle svg.theme-icon-when-light {
123 | display: block;
124 | }
125 |
--------------------------------------------------------------------------------