diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..9c97744 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,53 @@ +name: Build Docker image + +on: + push: +# branches: +# - 'master' + tags: + - 'v*' + pull_request: + branches: + - 'master' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - # Check out repository + name: Checkout + uses: actions/checkout@v3 + - # Set up QEMU for multiarch support + name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - # Set up Docker BuildX for Docker image building + name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + - # Set proper tags + name: Docker metadata + id: docker_meta # you'll use this in the next step + uses: docker/metadata-action@v3 + with: + images: bilde2910/hauk + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern=v{{version}} + type=semver,pattern=stable-{{major}}.x + - # Log in to Docker Hub + name: Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - # Build and push + name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + platforms: linux/amd64,linux/arm/v7,linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.docker_meta.outputs.tags }} + labels: ${{ steps.docker_meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile index fb015cb..20b370e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ COPY frontend/ /var/www/html/ COPY docker/start.sh . RUN apt-get update && \ - apt-get install -y memcached libmemcached-dev zlib1g-dev libldap2-dev && \ + apt-get install -y memcached libmemcached-dev zlib1g-dev libldap2-dev libssl-dev && \ pecl install memcached && \ docker-php-ext-enable memcached && \ docker-php-ext-configure ldap --with-libdir=lib/*-linux-gnu*/ && \ diff --git a/README.md b/README.md index 976f0d9..8839672 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ phone, and you're good to go! to install Hauk in, for example `/var/www/html`. Follow the instructions given by the install script. Make sure to set a secure hashed password and edit your site's domain in the configuration file after installation. -3. Start the web server and make sure Memcached or Redis is running. +3. Start the web server and make sure Memcached or Redis is running and + [properly configured and firewalled](https://github.com/bilde2910/Hauk/wiki/FAQ#how-do-i-securely-configure-memcachedredis). 4. Install the companion Android app (from your favourite store linked above) on your phone and enter your server's settings. @@ -50,7 +51,8 @@ files manually. in your web root, for example `/var/www/html`. 3. Modify `include/config.php` to your liking. Make sure to set a secure hashed password and edit your site's domain in this file. -4. Start the web server and make sure Memcached or Redis is running. +4. Start the web server and make sure Memcached or Redis is running and + [properly configured and firewalled](https://github.com/bilde2910/Hauk/wiki/FAQ#how-do-i-securely-configure-memcachedredis). 5. Install the companion Android app (from your favourite store linked above) on your phone and enter your server's settings. @@ -126,6 +128,22 @@ server { } ``` +## Upgrading to newer versions + +Hauk is versioned according to [Semantic Versioning 2.0.0](https://semver.org/). Any update that is **not a major update** is guaranteed to be without breaking changes, and you can keep the same configuration file for the updated release. + +- Major updates add breaking changes that either require manual intervention, or breaks backward compatibility. Update instructions for major versions will be listed in the release notes, as well as either this README or in the wiki. To date there have been no major updates. +- Minor updates add functionality, but does not break backward compatibility. You can still use an older client on a newer server, or a newer client on an older server, though some functionality may be missing. This will be dynamically detected by the client and server, which could e.g. lead to some UI elements being disabled in the app, or a notification made if a user tries to use new functionality that the other endpoint does not support. +- Patch updates are primarily bugfixes. + +Aside from certain major changes, you can keep your configuration file. New options may have been added to the config, but these will have sane defaults applied automatically. If you wish to change any new options, you can either reconfigure Hauk from the new config.php template, or copy and paste the relevant options from the new template to your existing file and change the appropriate values. + +Installations done using either the installer (`install.sh`) or via manual file copy can be upgraded simply by pulling the latest version of this repository and running the installer again, or overwriting the installation with the new files. + +Installations done via distribution-specific packages will be updated to the latest version by your package manager. + +Docker installations will be updated whenever you pull the image. If you're using Docker, you can reserve yourself from receiving major updates (which may contain breaking changes) by using the `stable-*` tag instead of `latest`. If you use a specific versioned tag, your installation will be locked at that specific version and you will not receive feature updates or bugfixes unless you manually change the tag and pull. + ## Demo server If you'd like to see what Hauk can do, download the app and insert connection details for the demo server: diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml index 674414f..305e2ab 100644 --- a/android/.idea/gradle.xml +++ b/android/.idea/gradle.xml @@ -4,17 +4,17 @@ diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/android/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml index 82fb904..541f4e0 100644 --- a/android/.idea/misc.xml +++ b/android/.idea/misc.xml @@ -5,7 +5,7 @@ - + diff --git a/android/.idea/runConfigurations.xml b/android/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/android/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 99e0fd1..3006434 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,14 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 33 defaultConfig { applicationId "info.varden.hauk" - minSdkVersion 23 - targetSdkVersion 29 - versionCode 13 - versionName "1.6.1" + minSdkVersion 24 + targetSdkVersion 33 + versionCode 14 + versionName "1.6.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -17,14 +16,15 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + namespace 'info.varden.hauk' } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.preference:preference:1.1.0' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.2.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.preference:preference:1.2.1' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test:runner:1.5.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index cc2d97f..9b7e159 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ package="info.varden.hauk"> + @@ -30,7 +31,9 @@ android:name=".ui.MainActivity" android:launchMode="singleTop" android:screenOrientation="portrait" - android:theme="@style/HomeTheme"> + android:windowSoftInputMode="stateHidden" + android:theme="@style/HomeTheme" + android:exported="true"> diff --git a/android/app/src/main/java/info/varden/hauk/Constants.java b/android/app/src/main/java/info/varden/hauk/Constants.java index 8990d4c..a6909af 100644 --- a/android/app/src/main/java/info/varden/hauk/Constants.java +++ b/android/app/src/main/java/info/varden/hauk/Constants.java @@ -47,6 +47,7 @@ public enum Constants { public static final Preference PREF_ALLOW_ADOPTION = new Preference.Boolean("allowAdoption", true); public static final Preference PREF_NIGHT_MODE = new Preference.Enum<>("nightMode", NightModeStyle.FOLLOW_SYSTEM); public static final Preference PREF_CONFIRM_STOP = new Preference.Boolean("confirmStop", true); + public static final Preference PREF_HIDE_LOGO = new Preference.Boolean("hideLogo", false); @Deprecated // Use PREF_SERVER_ENCRYPTED instead public static final Preference PREF_SERVER = new Preference.String("server", ""); diff --git a/android/app/src/main/java/info/varden/hauk/notify/Receiver.java b/android/app/src/main/java/info/varden/hauk/notify/Receiver.java index 5d55ab5..30d425d 100644 --- a/android/app/src/main/java/info/varden/hauk/notify/Receiver.java +++ b/android/app/src/main/java/info/varden/hauk/notify/Receiver.java @@ -56,6 +56,6 @@ final class Receiver { // the intent. intent.putExtra(Constants.EXTRA_BROADCAST_RECEIVER_REGISTRY_INDEX, ReceiverDataRegistry.register(this.data)); - return PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + return PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } } diff --git a/android/app/src/main/java/info/varden/hauk/notify/ReopenIntent.java b/android/app/src/main/java/info/varden/hauk/notify/ReopenIntent.java index 629dbfc..86f257f 100644 --- a/android/app/src/main/java/info/varden/hauk/notify/ReopenIntent.java +++ b/android/app/src/main/java/info/varden/hauk/notify/ReopenIntent.java @@ -32,6 +32,6 @@ final class ReopenIntent { PendingIntent toPending() { Intent intent = new Intent(this.ctx, this.activity); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - return PendingIntent.getActivity(this.ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + return PendingIntent.getActivity(this.ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } } diff --git a/android/app/src/main/java/info/varden/hauk/ui/MainActivity.java b/android/app/src/main/java/info/varden/hauk/ui/MainActivity.java index 0e9c30f..6d20112 100644 --- a/android/app/src/main/java/info/varden/hauk/ui/MainActivity.java +++ b/android/app/src/main/java/info/varden/hauk/ui/MainActivity.java @@ -163,6 +163,15 @@ public final class MainActivity extends AppCompatActivity { super.onDestroy(); } + @Override + protected void onResume() { + super.onResume(); + + // Set app logo visibility. + PreferenceManager prefs = new PreferenceManager(this); + findViewById(R.id.imgLogo).setVisibility(prefs.get(Constants.PREF_HIDE_LOGO) ? View.GONE : View.VISIBLE); + } + /** * On-tap handler for the "start sharing" and "stop sharing" button. */ @@ -332,6 +341,8 @@ public final class MainActivity extends AppCompatActivity { // Set night mode preference. AppCompatDelegate.setDefaultNightMode(prefs.get(Constants.PREF_NIGHT_MODE).resolve()); + // Set app logo visibility. + findViewById(R.id.imgLogo).setVisibility(prefs.get(Constants.PREF_HIDE_LOGO) ? View.GONE : View.VISIBLE); } /** diff --git a/android/app/src/main/res/drawable/ic_image.xml b/android/app/src/main/res/drawable/ic_image.xml new file mode 100644 index 0000000..b9622b1 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_image.xml @@ -0,0 +1,10 @@ + + + + diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 5329027..d64333d 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -32,6 +32,7 @@ Crear un nuevo link de seguimiento Parar de compartir [%s] Empezar a compartir + La duración configurada no es válida. Elija una duración diferente. + Aún no has configurado un backend. Ingresa los detalles de tu servidor backend en la configuración y vuelva a intentarlo. + Los servicios de ubicación están desactivados. Habilite los servicios de ubicación de alta precisión para compartir su ubicación. + Se requiere permisos de ubicación para usar esta aplicación. + La URL del servidor no es válida. + Ajustes erroneos + Creando nuevo enlace compartido… + Creando enlace + Aprobando %s… + Aprobando + Resolviendo nombre del proxy… + Conectado con Hauk… + Conectando + Hauk está compartiendo tu localización con %s + Dejar de compartir + Enlace copiado de Hauk + Copiar enlace + No mostrar de nuevo + Descartar + Abrir ajustes + Crear + No + + OK + Compartir ID/URL: + Compartir grupo (host) + Unir a un enlace existente + No se puede acceder al servidor + Ubicación compartida activada! + Ubicación compartida desactivada \ No newline at end of file diff --git a/android/app/src/main/res/values-nb-rNO/strings.xml b/android/app/src/main/res/values-nb-rNO/strings.xml index 9dd2bd7..828e95f 100644 --- a/android/app/src/main/res/values-nb-rNO/strings.xml +++ b/android/app/src/main/res/values-nb-rNO/strings.xml @@ -160,4 +160,7 @@ Fall tilbake til nettverksposisjon hvis GNSS er utilgjengelig i (sekunder) Ingen aktive delinger Venter på posisjon… + Vis Hauk-logoen på appens startside + Skjul Hauk-logoen fra appens startside + Skjul logoen på forsiden \ No newline at end of file diff --git a/android/app/src/main/res/values-nl/strings.xml b/android/app/src/main/res/values-nl/strings.xml index 4de8003..2d2f744 100644 --- a/android/app/src/main/res/values-nl/strings.xml +++ b/android/app/src/main/res/values-nl/strings.xml @@ -34,8 +34,8 @@ Locatie delen actief! UW GROEP PIN: Deling adoptatie - Een bestaande deling adopteren - U kunt een bestaande individuele locatiedeling toevoegen aan deze groepsdeling. Voer daarvoor alstublieft de URL of deel ID van de locatie in die u wilt adopteren (bijvoorbeeld %s\?XXXX-XXXX) en wijs een bijnaam toe aan deze locatiedeling. + Een sessie van een andere gebruiker adopteren + U kunt een bestaande individuele locatiedeling toevoegen aan deze groepsdeling. Voer daarvoor alstublieft de URL of deel ID van de persoon in die u wilt adopteren (bijvoorbeeld %s\?XXXX-XXXX) en wijs een bijnaam toe aan deze persoon. Creëer nieuwe deel link U kunt meerdere links creëren waarmee uw locatie bekeken kan worden. Elke link kan individueel uitgezet worden, om op elk moment precieze controle te hebben over wie uw locatie kan zien. \n @@ -70,12 +70,12 @@ Toestemming vereist Link gecreëerd Deze app vereist toegang tot uw locatie om te functioneren, maar deze toestemming is nog niet verleend. Sta alstublieft het volgende toestemmingsverzoek toe, en klik daarna op de startknop om het opnieuw te proberen. - Hauk staat u toe om locatiedelingssessies aan te maken voor uzelf alsook voor een groep. Als iemand een groepsdeling aanmaakt, krijgen zij een groepscode die anderen kunnen gebruiken om aan de groepssessie deel te nemen. -\n -\nMaar de persoon die de groep aanmaakt, krijgt ook een optie om een al bestaande deling toe te voegen aan de groep. Dit proces heet \"adoptie\". -\n -\nU kunt zelf bepalen of anderen uw locatiedeling mogen toevoegen aan een groep of niet middels deze checkbox. -\n + Hauk staat u toe om locatiedelingssessies aan te maken voor uzelf alsook voor een groep. Als iemand een groepsdeling aanmaakt, krijgen zij een groepscode die anderen kunnen gebruiken om aan de groepssessie deel te nemen. +\n +\nMaar de persoon die de groep aanmaakt, krijgt ook een optie om anderen die reeds hun locatie delen toe te voegen aan de groep. Dit proces heet \"adoptie\". +\n +\nU kunt zelf bepalen of anderen uw locatiedeling mogen toevoegen aan een groep of niet middels deze checkbox. +\n \nAls u deze optie aanzet en uw locatie deelt met vrienden of iemand die zijn locatie ook wilt delen, dan kunnen zij een groep aanmaken en uw locatie toevoegen aan de groep. Dan kunnen jullie elkaar op dezelfde gedeelde kaart zien. Dit is bijvoorbeeld handig als u aan het rijden bent, omdat u dan niet zelf uw telefoon hoeft te gebruiken om aan een groep deel te nemen. Agressieve batterijbesparingen Hauwei @@ -97,7 +97,7 @@ \nWilt u deze sessie hervatten\? Toestaan dat anderen mij aan een groep mogen toevoegen De ingevoerde server URL is ongeldig. - Een nieuwe link is succesvol aangemaakt voor uw locatiedeling! klik op de deel knop om de publiek bekijkbare URL voor uw deling te kopiëren. + Een nieuwe link is succesvol aangemaakt voor uw locatiedeling! Klik op de deel knop om de publiek bekijkbare URL voor uw nieuwe deling te kopiëren. Momenteel actieve links Neem deel aan een groepsdeling Wachten op initiële GNSS fix… @@ -148,4 +148,16 @@ weet je zeker dat je wilt stoppen met het delen van je locatie\? Stoppen met delen\? Zoeken naar locatie… + Vraag niet om een bevestiging bij het stoppen van de locatiedeling + Vraag voor bevestinging wanneer een locatiedeling in de app wordt gestopt + Bevestig voor het stoppen van de locatiedelin + Rapporteer een probleem + Broncode + App versie + Over Hauk + Terugvallen op locatiebepaling via netwerk wanneer GNSS niet beschikbaar is (seconden) + Minimale afstand tussen updates (in meters) + Je moet eerst een nickname instellen voordat je lid kan worden van een groep. Stel een nickname is en probeer het opnieuw. + De opgegeven duratie is ongeldig. Geef een nieuwe duratie op. + Niet opnieuw tonen \ No newline at end of file diff --git a/android/app/src/main/res/values-nn/strings.xml b/android/app/src/main/res/values-nn/strings.xml index 51fb636..c9ce259 100644 --- a/android/app/src/main/res/values-nn/strings.xml +++ b/android/app/src/main/res/values-nn/strings.xml @@ -148,7 +148,7 @@ Appversjon Om Hauk Ikkje be om stadfesting når du stoppar delingar i appen - Be om stadfesting når du stoppar delingar i *appen + Be om stadfesting når du stoppar delingar i appen Stadfest før delingar blir avslutta Minste avstand mellom oppdateringar (meter) Du må stilla inn eit kallenamn før du kan bli med i delingsgruppar. Ver vennleg og vel eit kallenamn og prøv igjen. @@ -160,4 +160,7 @@ Fall tilbake til nettverksposisjon viss GNSS er utilgjengeleg i (sekund) Ingen aktive delinger Ventar på posisjon… + Vis Hauk-logoen på appens startside + Skjul Hauk-logoen frå appens startside + Skjul logoen på framsida \ No newline at end of file diff --git a/android/app/src/main/res/values-pl/strings.xml b/android/app/src/main/res/values-pl/strings.xml index 1a464a1..18a69d9 100644 --- a/android/app/src/main/res/values-pl/strings.xml +++ b/android/app/src/main/res/values-pl/strings.xml @@ -2,7 +2,7 @@ Podaj ten PIN osobom, które mają dołączyć do grupy PIN TWOJEJ GRUPY: - Udostępnianie lokalizacji jest włączone! + Udostępnianie lokalizacji jest aktywne! Oczekiwanie na dokładną lokalizację… Oczekiwanie na sygnał GPS… Udostępnianie lokalizacji jest wyłączone @@ -11,7 +11,7 @@ minut Dołącz do grupy Stwórz grupę - Jedynie moja lokalizacja + Tylko moja lokalizacja Udostępnianie grupowe (członek) Udostępnianie grupowe (gospodarz) Tylko twoja lokalizacja @@ -24,13 +24,13 @@ PIN grupy: Pseudonim: (Co to znaczy\?) - Pozwalam innym na dołączenie mnie do swojej grupy + Pozwól innym na dołączenie siebie do swojej grupy Tryb udostępniania: - Okres aktualizacji pozycji (s): + Interwał między aktualizacjami pozycji (s) Czas udostępniania: Hasło URL serwera - Otwarte oprogramowanie do udostępniania lokalizacji + Otwartoźródłowe oprogramowanie do udostępniania lokalizacji Link został utworzony Potrzebne pozwolenie Ta aplikacja potrzebuje dostępu do twojej lokalizacji, a nie zostało ono udzielone. Udziel pozwolenia i spróbuj ponownie rozpocząć udostępnianie. @@ -40,7 +40,7 @@ Błąd połączenia Błąd serwera Pozwolenie na lokalizację jest wymagane do korzystania z tej aplikacji. - Serwer nie ma zainstalowanych aktualizacji + Wersja Hauk na serwerze jest przestarzała Połączono Dodano %s do twojej grupy! Wznów sesję @@ -49,7 +49,7 @@ ID/URL sesji: Udostępnij Dołącz osobę do grupy - Oszczędzanie baterii + Agresywne oszczędzanie baterii Huawei OnePlus Xiaomi @@ -69,7 +69,8 @@ Łączenie z Hauk… Dołączanie do grupy Dołączanie osoby do grupy - Jeśli udostępniasz swoją lokalizację więcej niż jednej osobie na raz, to warto utworzyć kilka linków, każdy dla jednej osoby. Tym sposobem można wyłączać pojedyncze linki, aby wyłączyć udostępnianie konkretnym osobom. + Jeśli udostępniasz swoją lokalizację więcej niż jednej osobie na raz, to warto utworzyć kilka linków, każdy dla jednej osoby. +\nTym sposobem można wyłączać pojedyncze linki, aby wyłączyć udostępnianie konkretnym osobom. Dołączanie %s do grupy… Wprowadzony URL serwera jest nieprawidłowy. Usługi lokalizacyjne są obecnie wyłączone. Włącz lokalizację w swoim urządzeniu aby korzystać z aplikacji. @@ -77,5 +78,87 @@ Serwer zwrócił odpowiedź o kodzie HTTP %s! Podany serwer nie wspiera udostępniania grupowego. Ta funkcja jest dostępna od wersji %s, a obecna wersja serwera to %s. Sposób udostępniania zostanie zmieniony na udostępnianie indywidualne. Udostępnianie aktualizacji jest aktywne! Skorzystaj z przycisku \"Udostępnij\", aby udostępnić komuś swoją lokalizację. - Udostępnianie podjęty + Dołączono do grupy + Ustawienia + Prośba autoryzacji rozgłoszenia + Hauk pozwala na tworzenie jednoosobowych sesji udostępniania, jak i sesji dla więcej niż jednej osoby jednocześnie. Jeśli ktoś utworzy grupowe udostępnianie, dostaje kod który pozwala na dołączenie innych osób do grupy. +\n +\nOsoba która tworzy grupę ma także opcję dodania wszystkich aktualnie udostępniających lokalizację do swojej grupy. Proces ten nazywany jest adopcją lub dołączaniem do grupy. +\n +\nMożesz decydować czy chcesz pozwolić na dołączanie siebie do swoich grup zaznaczając to pole. +\n +\nJeśli włączysz tą opcję, udostępnisz swoją lokalizację grupie przyjaciół i ktoś będzie chciał również udostępnić swoją lokalizację, może stworzyć grupę i dodać cię do swojej mapy - oboje będziecie widoczni na jednej mapie. Funkcja ta jest użyteczna jeśli przykładowo prowadzisz samochów i nie możesz używać swojego telefonu. Dołączanie do grupy (adopcja) nie wymaga żadnej interakcji z twojej strony. + Czy chcesz zezwolić w przyszłości na tworzenie sesji z rozgłoszeń o tym identyfikatorze\? + Hauk otrzymał i zablokował próbę utworzenia nowej sesji udostępniania ze źródła które identyfikuje się jako + Adres IP skonfigurowanego proxy ($s) nie może zostać rozwiązany! + Rozwiązywanie adresu proxy… + Dołączanie do grupy + Zgłoś problem + Kod źródłowy + Wersja aplikacji + O Hauk + Pokaż logo Hauk na górze głównego ekranu + Ukryj logo Hauk z głównego ekranu + Ukryj logo na głównym ekranie + Nie pytaj przed zatrzymaniem sesji udostępniania + Potwierdź przed zatrzymaniem sesji udostępniania + Potwierdź przed zatrzymaniem udostępniania + Nigdy + Zawsze + Gdy włączone jest osczędzanie baterii + Zgodnie z ustawieniami systemowymi + Tryb nocny + Wygląd + Wyłącz walidację \"Trust anchor\" oraz nazwy hosta dla hostów TOR .onion (niezalecane) + Wyłącz walidację \"Trust anchor\" dla hostów TOR .onion (niezalecane) + Zawsze weryfikuj certyfikaty (zalecane) + Weryfikacja certyfikatu HTTPS + Użyj lokalizacji sieciowej gdy GPS jest niedostępny przez (s) + Limit czasu połączenia (s) + Port proxy + Adres proxy + SOCKS 4/5 + HTTP + Nie używaj proxy + System (domyślne) + Proxy + Hasło szyfrowania + Wyłącz szyfrowanie + Włącz szyfrowanie + Chroń udostępnianie hasłem + <losowo generowane> + Preferowane ID + Minimalna przebyta odległość pomiędzy aktualizacjami (m) + <opcjonalny> + Nazwa użytkownika + Dotknij aby edytować + Połączenie + Ustawienia + Śledź moją aktualną lokalizację na Hauk! + Udostępnij link Hauk przez + "Wygląda na to, że uzywasz urządzenia %s. Te urządzenia mają włączone oszczędzanie baterii, które mogą uniemożliwić Hauk wysyłanie aktualizacji lokalizacji w tle. +\n +\nZalecane jest, żeby wyłączyć oszczędzanie baterii dla aplikacji Hauk, aby aplikacja nagle nie przestała działać. +\n +\nTa wiadomość nie będzie wyświetlana ponownie." + Nowy link został pomyślnie utworzony. Kliknij przycisk udostępniania aby go skopiować. + Masz niezakończoną sesję: +\nAktywnych linków: %d +\nCzas wygaśnięcia: %s +\n +\nChciałbyś wznowić tą sesję\? + "Podany serwer nie wspiera szyfrowania. Ta funkcja jest dostępna od wersji %s, a obecna wersja serwera to %s. Szyfrowanie zostanie wyłączone." + Wystąpił błąd podczas rozwiązywania nazwy hosta proxy: %s + Musisz ustawić pseudonim zanim dołączysz do grupy. Ustaw pseudonim i spróbuj ponownie. + Wprowadzony czas udostępniania jest nieprawidłowe. Proszę wprowadzić poprawny czas. + Nie skonfigurowano danych serwera. Proszę wprowadzić dane serwera w ustawieniach i spróbować ponownie. + Nie pokazuj ponownie + Możesz dołączyć istniejącą sesję udostępniania lokalizacji do tej grupy. Proszę wkleić adres lub ID udostępnianej osoby którą chciałbyś dołączyć (np. %s\?XXXX-XXXX) i przypisz pseudonim do tej osoby. + Brak aktywnych linków + Czy jesteś pewien, że chcesz usunąć ten link\? + Zatrzymać udostępnianie\? + Czy jesteś pewien, że chcesz zatrzymać udostępnianie\? + Błąd serwera + Szukanie lokalizacji… + Zezwól na adopcję: \ No newline at end of file diff --git a/android/app/src/main/res/values-ro/strings.xml b/android/app/src/main/res/values-ro/strings.xml index 33c352c..a99a749 100644 --- a/android/app/src/main/res/values-ro/strings.xml +++ b/android/app/src/main/res/values-ro/strings.xml @@ -160,4 +160,7 @@ Folosește localizarea de rețea dacă cea GNSS este indisponibilă timp de (secunde) Nici o adresă activă Se caută locația… + Logoul Hauk va fi afișat în partea de sus a ecranului principal + Logoul Hauk va fi ascuns de pe ecranul principal + Ascunde logoul \ No newline at end of file diff --git a/android/app/src/main/res/values-tr/strings.xml b/android/app/src/main/res/values-tr/strings.xml index c23b645..a8e9d30 100644 --- a/android/app/src/main/res/values-tr/strings.xml +++ b/android/app/src/main/res/values-tr/strings.xml @@ -48,4 +48,5 @@ Paylaşım modu: Paylaşım süresi: Açık kaynak konum paylaşımı + Aktif linkler \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index fa6f67b..8370c12 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -165,6 +165,9 @@ Confirm before stopping shares Prompt for confirmation when stopping shares in the app Do not prompt for confirmation when stopping shares in the app + Hide logo on main screen + Hide the Hauk logo from the app\'s main screen + Show the Hauk logo at the top of the app\'s main screen About Hauk diff --git a/android/app/src/main/res/xml/root_preferences.xml b/android/app/src/main/res/xml/root_preferences.xml index 0f7e3de..addb5e5 100644 --- a/android/app/src/main/res/xml/root_preferences.xml +++ b/android/app/src/main/res/xml/root_preferences.xml @@ -122,6 +122,13 @@ app:summaryOff="@string/pref_confirmStop_off" app:summaryOn="@string/pref_confirmStop_on" /> + + diff --git a/android/build.gradle b/android/build.gradle index dcaeef2..66fbaea 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.1' + classpath 'com.android.tools.build:gradle:8.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/android/gradle.properties b/android/gradle.properties index 199d16e..46309a3 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -17,4 +17,7 @@ org.gradle.jvmargs=-Xmx1536m android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 63a0e6c..46b5de0 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Mar 04 12:19:53 CET 2020 +#Thu Jul 30 19:59:09 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip diff --git a/backend-php/api/fetch.php b/backend-php/api/fetch.php index d4e7c2f..166f3e6 100644 --- a/backend-php/api/fetch.php +++ b/backend-php/api/fetch.php @@ -20,6 +20,8 @@ if (!$share->exists()) { } else { header("Content-Type: text/json"); + $sinceTime=$_GET["since"] ?? null; + // Solo and group shares have different internal structures. Figure out the // correct type so that it can be output. switch ($share->getType()) { @@ -34,7 +36,7 @@ if (!$share->exists()) { "expire" => $share->getExpirationTime(), "serverTime" => microtime(true), "interval" => $session->getInterval(), - "points" => $session->getPoints(), + "points" => $session->getPoints($sinceTime), "encrypted" => $session->isEncrypted(), "salt" => $session->getEncryptionSalt() )); @@ -46,7 +48,7 @@ if (!$share->exists()) { "expire" => $share->getExpirationTime(), "serverTime" => microtime(true), "interval" => $share->getAutoInterval(), - "points" => $share->getAllPoints() + "points" => $share->getAllPoints($sinceTime) )); break; } diff --git a/backend-php/api/new-link.php b/backend-php/api/new-link.php index 3fe6080..3b37aab 100644 --- a/backend-php/api/new-link.php +++ b/backend-php/api/new-link.php @@ -8,7 +8,7 @@ header("X-Hauk-Version: ".BACKEND_VERSION); requirePOST( "sid", // Existing session ID. - "ado", // Whether or not to allow adoption. + "ado" // Whether or not to allow adoption. ); $memcache = memConnect(); diff --git a/backend-php/include/inc.php b/backend-php/include/inc.php index 13d2643..690a93a 100644 --- a/backend-php/include/inc.php +++ b/backend-php/include/inc.php @@ -3,7 +3,7 @@ // An include file containing constants and common functions for the Hauk // backend. It loads the configuration file and declares it as a constant. -const BACKEND_VERSION = "1.6.1"; +const BACKEND_VERSION = "1.6.2"; const LANGUAGES = ["ca", "de", "en", "eu", "fr", "it", "nb_NO", "nl", "nn", "ro", "ru", "tr", "uk"]; // Create mode for create.php. Corresponds with the constants from the Android @@ -136,7 +136,7 @@ const DEFAULTS = array( "reserved_links" => [], "reserve_whitelist" => false, "link_style" => LINK_4_PLUS_4_UPPER_CASE, - "map_tile_uri" => 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + "map_tile_uri" => 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', "map_attribution" => 'Map data © OpenStreetMap contributors, CC-BY-SA', "default_zoom" => 14, "max_zoom" => 19, @@ -158,6 +158,7 @@ const DEFAULTS = array( // one found from this list. const CONFIG_PATHS = array( "/etc/hauk/config.php", + "/usr/local/etc/hauk/config.php", __DIR__."/config.php" ); @@ -564,12 +565,12 @@ class GroupShare extends Share { } // Returns a map of nicknames and the users' corresponding coordinates. - public function getAllPoints() { + public function getAllPoints($sinceTime) { $points = array(); $hosts = $this->getHosts(); foreach ($hosts as $nick => $host) { if ($host->exists()) { - $points[$nick] = $host->getPoints(); + $points[$nick] = $host->getPoints($sinceTime); } } return $points; @@ -757,8 +758,22 @@ class Client { } // Returns a list of all point arrays for this session. - public function getPoints() { + public function getPoints($sinceTime) { + if (is_null($sinceTime)) { + // return all memcached points return $this->sessionData["points"]; + } else { + $newPoints = []; + // FIXME: use map instead of indices + $timeIndex = $this->isEncrypted() ? 3 : 2; + // only return points which are more recent than $oldestPointTime + foreach ($this->sessionData["points"] as $point) { + if (floatval($point[$timeIndex]) > $sinceTime) { + array_push($newPoints, $point); + } + } + return $newPoints; + } } // Generates a random session ID for new sessions. @@ -792,18 +807,18 @@ function authenticated() { global $LANG; if (!isset($_POST["usr"])) die($LANG["username_required"]); requirePOST("pwd", "usr"); - if (file_exists(getConfig("htpasswd_path"))) { - $file = fopen(getConfig("htpasswd_path"), "r"); - $authed = false; - while (($line = fgets($file)) !== false && !$authed) { - $creds = explode(":", trim($line)); - if ($creds[0] == $_POST["usr"]) { - $authed = password_verify($_POST["pwd"], $creds[1]); - } + // Jump out if we cannot find the htpasswd file. + if (!file_exists(getConfig("htpasswd_path"))) die($LANG["cannot_find_password_file"]); + $file = fopen(getConfig("htpasswd_path"), "r"); + $authed = false; + while (($line = fgets($file)) !== false && !$authed) { + $creds = explode(":", trim($line)); + if ($creds[0] == $_POST["usr"]) { + $authed = password_verify($_POST["pwd"], $creds[1]); } - fclose($file); - return $authed; } + fclose($file); + return $authed; case LDAP: // LDAP-based authentication. diff --git a/backend-php/include/lang/ca/texts.php b/backend-php/include/lang/ca/texts.php index af669bb..df8ecfb 100644 --- a/backend-php/include/lang/ca/texts.php +++ b/backend-php/include/lang/ca/texts.php @@ -18,3 +18,4 @@ $LANG['invalid_storage'] = 'Heu establert un storage_backend d\'emmagatzematge n $LANG['no_redis_ext'] = 'No hi ha habilitada cap extensió redis compatible (redis) a la vostra configuració PHP!'; $LANG['no_memcached_ext'] = 'No hi ha habilitada cap extensió confidencial (memcache o memcached) a la configuració de PHP!'; $LANG['config_missing'] = 'No es pot trobar config.php!'; +$LANG['cannot_find_password_file'] = 'No es troba el fitxer de contrasenya!'; diff --git a/backend-php/include/lang/de/texts.php b/backend-php/include/lang/de/texts.php index fe1b3be..1b950cc 100644 --- a/backend-php/include/lang/de/texts.php +++ b/backend-php/include/lang/de/texts.php @@ -24,3 +24,4 @@ $LANG['ldap_search_failed'] = 'Benutzer konnte am LDAP Server nicht gefunden wer $LANG['ldap_connection_failed'] = 'Fehler beim Verbinden zum LDAP Server!'; $LANG['ldap_config_error'] = 'LDAP-Verbindungsparameter konnten nicht eingestellt werden!'; $LANG['ldap_extension_missing'] = 'Die LDAP Erweiterung ist in der PHP config nicht aktiviert!'; +$LANG['cannot_find_password_file'] = 'Kennwortdatei kann nicht gefunden werden!'; diff --git a/backend-php/include/lang/en/texts.php b/backend-php/include/lang/en/texts.php index 817116a..7bb4b53 100644 --- a/backend-php/include/lang/en/texts.php +++ b/backend-php/include/lang/en/texts.php @@ -24,3 +24,4 @@ $LANG['ldap_connection_failed'] = 'Failed to connect to the LDAP server!'; $LANG['ldap_search_failed'] = 'Failed to look up user on the LDAP server!'; $LANG['ldap_user_unauthorized'] = 'User not found, not authorized, or incorrect password!'; $LANG['ldap_search_ambiguous'] = 'Matched multiple users - the LDAP filter is too broad!'; +$LANG['cannot_find_password_file'] = 'Cannot find password file!'; diff --git a/backend-php/include/lang/eu/texts.php b/backend-php/include/lang/eu/texts.php index 1891f6f..e450f7d 100644 --- a/backend-php/include/lang/eu/texts.php +++ b/backend-php/include/lang/eu/texts.php @@ -15,3 +15,4 @@ $LANG['share_mode_unsupported'] = 'Euskarririk gabeko parekatze modua!'; $LANG['group_pin_invalid'] = 'Baliogabeko talde PIN-a!'; $LANG['session_invalid'] = 'Saio baliogabea!'; $LANG['location_invalid'] = 'Kokaleku baliogabea!'; +$LANG['cannot_find_password_file'] = 'Ezin da pasahitz fitxategia aurkitu!'; diff --git a/backend-php/include/lang/fr/texts.php b/backend-php/include/lang/fr/texts.php index c4bf08d..30df662 100644 --- a/backend-php/include/lang/fr/texts.php +++ b/backend-php/include/lang/fr/texts.php @@ -24,3 +24,4 @@ $LANG['ldap_extension_missing'] = 'L\'extension LDAP n\'est pas activée dans vo $LANG['e2e_adoption_not_allowed'] = 'Ce partage est protégé par un mot de passe et ne peut pas être adopté !'; $LANG['group_e2e_unsupported'] = 'Les partages de groupe ne peuvent pas être protégés par un mot de passe !'; $LANG['username_required'] = 'Nom d\'utilisateur requis !'; +$LANG['cannot_find_password_file'] = 'Impossible de trouver le fichier de mot de passe !'; diff --git a/backend-php/include/lang/it/texts.php b/backend-php/include/lang/it/texts.php index 52c4cfb..25e8fc5 100644 --- a/backend-php/include/lang/it/texts.php +++ b/backend-php/include/lang/it/texts.php @@ -24,3 +24,4 @@ $LANG['invalid_storage'] = 'storage_backend non è impostata correttamente in Ha $LANG['no_redis_ext'] = 'Nessuna estensione compatibile con redi (redi) è attiva nella tua configurazione PHP!'; $LANG['no_memcached_ext'] = 'Nessuna estensione compatibile con memcached (memecache o memecached) è attiva nella tua configurazione PHP!'; $LANG['config_missing'] = 'Impossibile trovare config.php!'; +$LANG['cannot_find_password_file'] = 'Impossibile trovare il file della password!'; diff --git a/backend-php/include/lang/ko/texts.php b/backend-php/include/lang/ko/texts.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/backend-php/include/lang/ko/texts.php @@ -0,0 +1 @@ +redis = new Redis(); - $this->redis->connect(getConfig("redis_host"), getConfig("redis_port")) - or die ("Server could not connect to Redis!\n"); + if(substr(getConfig("redis_host"), 0, 1) === "/") { + $this->redis->connect(getConfig("redis_host")) + or die ("Server could not connect to Redis socket!\n"); + } else { + $this->redis->connect(getConfig("redis_host"), getConfig("redis_port")) + or die ("Server could not connect to Redis!\n"); + } if (getConfig("redis_use_auth")) { $this->redis->auth(getConfig("redis_auth")) or die("Incorrect Redis authentication!"); diff --git a/fastlane/metadata/android/en-US/changelogs/14.txt b/fastlane/metadata/android/en-US/changelogs/14.txt new file mode 100644 index 0000000..b464eb4 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/14.txt @@ -0,0 +1,3 @@ +This updated adds support for Android versions up to Android 13. Due to compatibility issues, support for Android 6 has also been dropped in this release for now. + +For the full changelog, please see https://github.com/bilde2910/Hauk/releases. diff --git a/frontend/assets/lang/ko.json b/frontend/assets/lang/ko.json new file mode 100644 index 0000000..411d4e5 --- /dev/null +++ b/frontend/assets/lang/ko.json @@ -0,0 +1,36 @@ +{ + "btn_dismiss": "닫기", + "google_play_badge_text": "Google Play 에서 다운로드", + "google_play_badge_url": "https://play.google.com/intl/en_us/badges/static/images/badges/ko_badge_web_generic.png", + "f_droid_badge_text": "F-Droid 에서 다운로드", + "f_droid_badge_url": "https://fdroid.gitlab.io/artwork/badge/get-it-on-ko.png", + "btn_show_all": "모두 보기", + "btn_close": "닫기", + "btn_decrypt": "잠금 해제", + "btn_cancel": "취소", + "last_update_days": "{{time}}일 전", + "last_update_hours": "{{time}}시간 전", + "last_update_minutes": "{{time}}분 전", + "last_update_seconds": "{{time}}초 전", + "control_show_self": "내 위치 표시하기", + "status_offline": "오프라인", + "status_expired": "만료됨", + "dialog_user_navigate": "이 위치로 안내", + "dialog_user_follow": "지도에서 보기", + "dialog_active_head": "활성 사용자들", + "dialog_connection_body": "Hauk 서버로의 접속이 끊겼습니다. Hauk은 백그라운드에서 재접속을 시도하겠습니다. 네트워크 접속 여부를 확인해주세요.", + "dialog_connection_head": "접속 오류", + "dialog_expired_body": "이 위치 공유가 만료되었습니다.", + "dialog_expired_head": "링크가 만료됨", + "point_app_to": "위치를 공유하기 위해 Hauk 앱을 이 서버로 설정하여 주십시오:", + "gnss_signal_body": "발신자가 GPS 신호를 기다리고 있습니다", + "gnss_signal_head": "잠시만 기다려주세요", + "e2e_unsupported": "이 링크는 비밀번호로 보호되어 있습니다. 사용하고 계시는 브라우저는 잠금을 해제하기 위한 기능을 지원하지 않습니다. 다른 브라우저로 다시 시도해주세요.", + "e2e_unavailable_secure": "이 링크는 비밀번호로 보호되어 있습니다. HTTPS를 사용하고 있지 않기 때문에 보호를 해제할 수 없습니다. HTTPS를 사용중인지 확인하시고 다시 시도해주세요.", + "e2e_incorrect": "입력한 비밀번호가 올바르지 않습니다. 다시 시도해주세요.", + "e2e_password_prompt": "이 링크는 비밀번호로 보호되어 있습니다. 링크에 접근하기 위해 비밀번호를 입력해주세요.", + "e2e_placeholder": "비밀번호를 입력하세요", + "e2e_title": "비밀번호로 보호됨", + "expired_body": "요청하신 위치정보를 서버에서 찾을 수 없습니다. 기존에 작동하던 링크라면, 위치 공유가 만료되었을 수 있습니다.", + "expired_head": "위치 정보가 만료됨" +} diff --git a/frontend/assets/lang/nl.json b/frontend/assets/lang/nl.json index e78c85a..fd67b17 100644 --- a/frontend/assets/lang/nl.json +++ b/frontend/assets/lang/nl.json @@ -24,5 +24,13 @@ "e2e_incorrect": "Het ingevoerde wachtwoord is incorrect. Probeer het alstublieft nog eens.", "e2e_password_prompt": "Deze deling is met wachtwoord beveiligd. Vul het wachtwoord in om toegang te krijgen tot de deling.", "e2e_placeholder": "Voer wachtwoord in", - "e2e_title": "Beveiligd met wachtwoord" + "e2e_title": "Beveiligd met wachtwoord", + "google_play_badge_text": "Download op Google Play", + "f_droid_badge_text": "Download op F-Droid", + "btn_show_all": "Toon alle", + "btn_close": "Sluiten", + "control_show_self": "Toon mijn locatie", + "dialog_user_navigate": "Navigeer naar", + "dialog_user_follow": "Toon op kaart", + "dialog_active_head": "Actieve gebruikers" } diff --git a/frontend/assets/lang/pl.json b/frontend/assets/lang/pl.json new file mode 100644 index 0000000..80f9410 --- /dev/null +++ b/frontend/assets/lang/pl.json @@ -0,0 +1,36 @@ +{ + "google_play_badge_text": "Pobierz z Google Play", + "google_play_badge_url": "https://play.google.com/intl/en_us/badges/static/images/badges/pl_badge_web_generic.png", + "f_droid_badge_text": "Pobierz z F-Droid", + "f_droid_badge_url": "https://fdroid.gitlab.io/artwork/badge/get-it-on-pl.png", + "btn_show_all": "Pokaż wszystko", + "btn_close": "Zamknij", + "btn_decrypt": "Odblokuj", + "btn_cancel": "Anuluj", + "btn_dismiss": "Odrzuć", + "last_update_days": "{{time}} dni temu", + "last_update_hours": "{{time}}h temu", + "last_update_minutes": "{{time}}m temu", + "last_update_seconds": "{{time}s temu", + "control_show_self": "Pokaż moją lokalizację", + "status_offline": "Offline", + "status_expired": "Wygasło", + "dialog_user_navigate": "Nawiguj do", + "dialog_user_follow": "Pokaż na mapie", + "dialog_active_head": "Aktywni użytkownicy", + "dialog_connection_body": "Połączenie z serwerem Hauk zostało utracone. Hauk spróbuje odzyskać połączenie. Proszę sprawdzić swoje połączenie sieciowe.", + "dialog_connection_head": "Błąd połączenia", + "dialog_expired_body": "Ta sesja udostępniania wygasła.", + "dialog_expired_head": "Sesja wygasła", + "point_app_to": "Wprowadź w aplikacji Hauk ten adres serwera:", + "gnss_signal_body": "Nadawca oczekuje na sygnał GPS", + "gnss_signal_head": "Proszę czekać", + "e2e_unsupported": "Ta sesja jest chroniona hasłem. Twoja przeglądarka nie obsługuje funkcji potrzebnych do otwierania takich sesji. Spróbuj użyć innej przeglądarki.", + "e2e_unavailable_secure": "Ta sesja jest chroniona hasłem. Nie można jej odblokować, gdyż nie używasz protokołu HTTPS. Upewnij się, że używasz protokołu HTTPS i spróbuj ponownie.", + "e2e_incorrect": "Niepoprawne hasło. Spróbuj ponownie.", + "e2e_password_prompt": "Ta sesja jest chroniona hasłem. Wprowadź hasło.", + "e2e_placeholder": "Wprowadź hasło", + "e2e_title": "Chronione hasłem", + "expired_body": "Lokalizacja którą próbujesz zobaczyć nie została odnaleziona na serwerze. Jeśli ten link wcześniej działał, oznacza to, że sesja udostępniania mogła wygasnąć.", + "expired_head": "Lokalizacja wygasła" +} diff --git a/frontend/index.html b/frontend/index.html index 0c69701..56fc2f7 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,6 +2,7 @@ + @@ -57,13 +58,13 @@