Compare commits
4 Commits
java_test
...
config_set
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
427968a1cd | ||
|
|
8b71ae3b33 | ||
|
|
185a013cff | ||
|
|
5596f46047 |
21
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,17 +1,26 @@
|
|||||||
name: Report a bug
|
name: Report a bug
|
||||||
description: Things that were working earlier but don't anymore
|
description: Let us know if something's not working the way you expected.
|
||||||
labels: []
|
labels: ["triage"]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
**Checklist**
|
Before opening a new bug report, please ensure
|
||||||
1. You've searched existing [issues](https://github.com/search?q=repo%3Aente-io%2Fente+&type=issues) and [discussions](https://github.com/search?q=repo%3Aente-io%2Fente+&type=discussions)
|
1. you are on the latest version (it might've already been fixed),
|
||||||
2. It was working earlier (otherwise use [enhancements](https://github.com/ente-io/ente/discussions/categories/enhancements))
|
2. you've searched for existing issues (please add your observations as a comment there instead of creating a duplicate).
|
||||||
3. It is not about self hosting (for those use [this](https://github.com/ente-io/ente/discussions/categories/q-a))
|
|
||||||
|
If you are self hosting, please create a community [Q&A](https://github.com/ente-io/ente/discussions/categories/q-a) instead.
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Description
|
label: Description
|
||||||
|
description: >
|
||||||
|
Please describe the bug. If possible, also include the steps to
|
||||||
|
reproduce the behaviour, and the expected behaviour (sometimes
|
||||||
|
bugs are just expectation mismatches, in which case this would be
|
||||||
|
a good fit for [feature
|
||||||
|
requests](https://github.com/ente-io/ente/discussions/categories/feature-requests)).
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
attributes:
|
attributes:
|
||||||
label: Version
|
label: Version
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
blank_issues_enabled: true
|
blank_issues_enabled: true
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Enhacements, feature requests, feedback and questions
|
- name: Feature requests and questions
|
||||||
url: https://github.com/ente-io/ente/discussions
|
url: https://github.com/ente-io/ente/discussions
|
||||||
about: Please use Discussions for everything apart from the above.
|
about: Please use Discussions for everything apart from the above.
|
||||||
|
|||||||
10
.github/workflows/auth-crowdin-push.yml
vendored
@@ -5,14 +5,10 @@ on:
|
|||||||
branches: [main]
|
branches: [main]
|
||||||
paths:
|
paths:
|
||||||
# Run workflow when auth's intl_en.arb is changed
|
# Run workflow when auth's intl_en.arb is changed
|
||||||
- "mobile/apps/auth/lib/l10n/arb/app_en.arb"
|
- "auth/lib/l10n/arb/app_en.arb"
|
||||||
# Or the workflow itself is changed
|
# Or the workflow itself is changed
|
||||||
- ".github/workflows/auth-crowdin.yml"
|
- ".github/workflows/auth-crowdin.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
push-sources-to-crowdin:
|
push-sources-to-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -24,8 +20,8 @@ jobs:
|
|||||||
- name: Crowdin's action
|
- name: Crowdin's action
|
||||||
uses: crowdin/github-action@v2
|
uses: crowdin/github-action@v2
|
||||||
with:
|
with:
|
||||||
base_path: "mobile/apps/auth/"
|
base_path: "auth/"
|
||||||
config: "mobile/apps/auth/crowdin.yml"
|
config: "auth/crowdin.yml"
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
download_translations: false
|
download_translations: false
|
||||||
|
|||||||
8
.github/workflows/auth-crowdin-sync.yml
vendored
@@ -8,10 +8,6 @@ on:
|
|||||||
# Also allow manually running the workflow.
|
# Also allow manually running the workflow.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
synchronize-with-crowdin:
|
synchronize-with-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -23,8 +19,8 @@ jobs:
|
|||||||
- name: Crowdin's action
|
- name: Crowdin's action
|
||||||
uses: crowdin/github-action@v2
|
uses: crowdin/github-action@v2
|
||||||
with:
|
with:
|
||||||
base_path: "mobile/apps/auth/"
|
base_path: "auth/"
|
||||||
config: "mobile/apps/auth/crowdin.yml"
|
config: "auth/crowdin.yml"
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
download_translations: true
|
download_translations: true
|
||||||
|
|||||||
20
.github/workflows/auth-internal-release.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
workflow_dispatch: # Allow manually running the action
|
workflow_dispatch: # Allow manually running the action
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.32.8"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -15,7 +12,7 @@ jobs:
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/auth
|
working-directory: auth
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
@@ -43,7 +40,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build PlayStore AAB
|
- name: Build PlayStore AAB
|
||||||
run: |
|
run: |
|
||||||
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
|
flutter build appbundle --release --flavor playstore --dart-define=app.flavor=playstore
|
||||||
env:
|
env:
|
||||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_auth_key.jks"
|
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_auth_key.jks"
|
||||||
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
|
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
|
||||||
@@ -55,14 +52,5 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||||
packageName: io.ente.auth
|
packageName: io.ente.auth
|
||||||
releaseFiles: mobile/apps/auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||||
track: internal
|
track: internal
|
||||||
|
|
||||||
- name: Notify Discord
|
|
||||||
uses: sarisia/actions-status-discord@v1
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
|
||||||
nodetail: true
|
|
||||||
title: "🏆 Internal release available for Auth"
|
|
||||||
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.auth)"
|
|
||||||
color: 0x800080
|
|
||||||
|
|||||||
36
.github/workflows/auth-lint.yml
vendored
@@ -4,51 +4,24 @@ on:
|
|||||||
# Run on every pull request (open or push to it) that changes auth/
|
# Run on every pull request (open or push to it) that changes auth/
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- "mobile/apps/auth/**"
|
- "auth/**"
|
||||||
- ".github/workflows/auth-lint.yml"
|
- ".github/workflows/auth-lint.yml"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.32.8"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/auth
|
working-directory: auth
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Verify custom icons are lowercase including optional understores, and end with .svg
|
|
||||||
run: |
|
|
||||||
find assets/custom-icons -type f -name "*.svg" | while read -r file; do
|
|
||||||
if [[ "$(basename "$file")" != "$(basename "$file" | tr '[:upper:]' '[:lower:]' | tr ' ' '_')" ]]; then
|
|
||||||
echo "File name is not lowercase: $file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Verify all icons are less than 20KB
|
|
||||||
run: |
|
|
||||||
find assets/custom-icons -type f -name "*.svg" | while read -r file; do
|
|
||||||
if [[ "$file" == "assets/custom-icons/icons/bbs_nga.svg" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if [[ "$(stat --printf="%s" "$file")" -gt 20480 ]]; then
|
|
||||||
echo "File size is greater than 20KB: $file ($file_size bytes)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Verify custom icon JSON
|
|
||||||
run: cat assets/custom-icons/_data/custom-icons.json | jq empty
|
|
||||||
|
|
||||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
@@ -59,3 +32,6 @@ jobs:
|
|||||||
- run: flutter pub get
|
- run: flutter pub get
|
||||||
|
|
||||||
- run: flutter analyze --no-fatal-infos
|
- run: flutter analyze --no-fatal-infos
|
||||||
|
|
||||||
|
- name: Verify custom icon JSON
|
||||||
|
run: cat assets/custom-icons/_data/custom-icons.json | jq empty
|
||||||
|
|||||||
142
.github/workflows/auth-release.yml
vendored
@@ -29,18 +29,15 @@ on:
|
|||||||
- "auth-v*"
|
- "auth-v*"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.32.8"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux-latest:
|
build-ubuntu:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/auth
|
working-directory: auth
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
@@ -71,7 +68,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build independent APK
|
- name: Build independent APK
|
||||||
run: |
|
run: |
|
||||||
flutter build apk --dart-define=cronetHttpNoPlay=true --release --flavor independent
|
flutter build apk --release --flavor independent --dart-define=app.flavor=independent
|
||||||
mv build/app/outputs/flutter-apk/app-independent-release.apk artifacts/ente-${{ github.ref_name }}.apk
|
mv build/app/outputs/flutter-apk/app-independent-release.apk artifacts/ente-${{ github.ref_name }}.apk
|
||||||
env:
|
env:
|
||||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_auth_key.jks"
|
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_auth_key.jks"
|
||||||
@@ -83,7 +80,7 @@ jobs:
|
|||||||
# disable this step if release tag contains nightly or beta
|
# disable this step if release tag contains nightly or beta
|
||||||
if: startsWith(github.ref, 'refs/tags/auth-v') && !contains(github.ref, 'nightly') && !contains(github.ref, 'beta')
|
if: startsWith(github.ref, 'refs/tags/auth-v') && !contains(github.ref, 'nightly') && !contains(github.ref, 'beta')
|
||||||
run: |
|
run: |
|
||||||
flutter build appbundle --release --flavor playstore --dart-define=app.flavor=playstore --dart-define=cronetHttpNoPlay=true
|
flutter build appbundle --release --flavor playstore --dart-define=app.flavor=playstore
|
||||||
env:
|
env:
|
||||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_auth_key.jks"
|
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_auth_key.jks"
|
||||||
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
|
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
|
||||||
@@ -93,38 +90,27 @@ jobs:
|
|||||||
- name: Install dependencies for desktop build
|
- name: Install dependencies for desktop build
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
sudo apt-get update -y
|
||||||
sudo apt-get install -y libsecret-1-dev libsodium-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm patchelf libsqlite3-dev locate libayatana-appindicator3-dev libffi-dev libtiff5 xz-utils libarchive-tools libcurl4-openssl-dev
|
sudo apt-get install -y libsecret-1-dev libsodium-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config libsqlite3-dev locate appindicator3-0.1 libappindicator3-dev libffi-dev libtiff5
|
||||||
sudo updatedb --localpaths='/usr/lib/x86_64-linux-gnu'
|
sudo updatedb --localpaths='/usr/lib/x86_64-linux-gnu'
|
||||||
|
|
||||||
- name: Install appimagetool
|
|
||||||
run: |
|
|
||||||
wget -O appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
|
||||||
chmod +x appimagetool
|
|
||||||
mv appimagetool /usr/local/bin/
|
|
||||||
|
|
||||||
- name: Build desktop app
|
- name: Build desktop app
|
||||||
run: |
|
run: |
|
||||||
flutter config --enable-linux-desktop
|
flutter config --enable-linux-desktop
|
||||||
dart pub global activate --source git https://github.com/ente-io/flutter_distributor_fork --git-ref develop --git-path packages/flutter_distributor
|
# dart pub global activate flutter_distributor
|
||||||
# RPM
|
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref develop --git-path packages/flutter_distributor
|
||||||
flutter_distributor package --platform=linux --targets=rpm --skip-clean
|
|
||||||
mv dist/**/*-*-linux.rpm artifacts/ente-${{ github.ref_name }}-x86_64.rpm
|
|
||||||
# APPIMAGE
|
|
||||||
flutter_distributor package --platform=linux --targets=appimage --skip-clean
|
|
||||||
mv dist/**/*-*-linux.AppImage artifacts/ente-${{ github.ref_name }}-x86_64.AppImage
|
|
||||||
# DEB
|
|
||||||
flutter_distributor package --platform=linux --targets=deb --skip-clean
|
flutter_distributor package --platform=linux --targets=deb --skip-clean
|
||||||
mv dist/**/*-*-linux.deb artifacts/ente-${{ github.ref_name }}-x86_64.deb
|
mv dist/**/*-*-linux.deb artifacts/ente-${{ github.ref_name }}-x86_64.deb
|
||||||
|
env:
|
||||||
|
LIBSODIUM_USE_PKGCONFIG: 1
|
||||||
|
|
||||||
- name: Generate checksums
|
- name: Generate checksums and push to artifacts
|
||||||
run: |
|
run: |
|
||||||
sha256sum artifacts/ente-auth-*.apk >> artifacts/sha256sum-apk
|
sha256sum artifacts/ente-* > artifacts/sha256sum-apk-deb
|
||||||
sha256sum artifacts/ente-auth-*.deb artifacts/ente-auth-*.rpm artifacts/ente-auth-*.AppImage >> artifacts/sha256sum-linux
|
|
||||||
|
|
||||||
- name: Create a draft GitHub release
|
- name: Create a draft GitHub release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
artifacts: "mobile/apps/auth/artifacts/*"
|
artifacts: "auth/artifacts/*"
|
||||||
draft: true
|
draft: true
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
updateOnlyUnreleased: true
|
updateOnlyUnreleased: true
|
||||||
@@ -136,16 +122,76 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||||
packageName: io.ente.auth
|
packageName: io.ente.auth
|
||||||
releaseFiles: mobile/apps/auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||||
track: internal
|
track: internal
|
||||||
|
|
||||||
build-windows:
|
build-fedora-etc:
|
||||||
runs-on: windows-latest
|
runs-on: ubuntu-latest
|
||||||
environment: "auth-win-build"
|
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/auth
|
working-directory: auth
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code and submodules
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: "stable"
|
||||||
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Create artifacts directory
|
||||||
|
run: mkdir artifacts
|
||||||
|
|
||||||
|
- name: Install dependencies for desktop build
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y libsecret-1-dev libsodium-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm patchelf libsqlite3-dev locate libayatana-appindicator3-dev libffi-dev libtiff5 xz-utils libarchive-tools
|
||||||
|
sudo updatedb --localpaths='/usr/lib/x86_64-linux-gnu'
|
||||||
|
|
||||||
|
- name: Install appimagetool
|
||||||
|
run: |
|
||||||
|
wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||||
|
chmod +x appimagetool
|
||||||
|
mv appimagetool /usr/local/bin/
|
||||||
|
|
||||||
|
- name: Build desktop app
|
||||||
|
run: |
|
||||||
|
flutter config --enable-linux-desktop
|
||||||
|
# dart pub global activate flutter_distributor
|
||||||
|
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref develop --git-path packages/flutter_distributor
|
||||||
|
# Run below command if it is a beta or nightly
|
||||||
|
if [[ ${{ github.ref }} =~ beta|nightly ]]; then
|
||||||
|
flutter_distributor package --platform=linux --targets=pacman --skip-clean
|
||||||
|
mv dist/**/*-*-linux.pacman artifacts/ente-${{ github.ref_name }}-x86_64.pacman
|
||||||
|
fi
|
||||||
|
flutter_distributor package --platform=linux --targets=rpm --skip-clean
|
||||||
|
mv dist/**/*-*-linux.rpm artifacts/ente-${{ github.ref_name }}-x86_64.rpm
|
||||||
|
flutter_distributor package --platform=linux --targets=appimage --skip-clean
|
||||||
|
mv dist/**/*-*-linux.AppImage artifacts/ente-${{ github.ref_name }}-x86_64.AppImage
|
||||||
|
|
||||||
|
- name: Generate checksums
|
||||||
|
run: sha256sum artifacts/ente-* >> artifacts/sha256sum-rpm-appimage
|
||||||
|
|
||||||
|
- name: Create a draft GitHub release
|
||||||
|
uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
artifacts: "auth/artifacts/*"
|
||||||
|
draft: true
|
||||||
|
allowUpdates: true
|
||||||
|
updateOnlyUnreleased: true
|
||||||
|
|
||||||
|
build-windows:
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: auth
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
@@ -167,7 +213,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
flutter config --enable-windows-desktop
|
flutter config --enable-windows-desktop
|
||||||
# dart pub global activate flutter_distributor
|
# dart pub global activate flutter_distributor
|
||||||
dart pub global activate --source git https://github.com/ente-io/flutter_distributor_fork --git-ref develop --git-path packages/flutter_distributor
|
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref develop --git-path packages/flutter_distributor
|
||||||
make innoinstall
|
make innoinstall
|
||||||
flutter_distributor package --platform=windows --targets=exe --skip-clean
|
flutter_distributor package --platform=windows --targets=exe --skip-clean
|
||||||
mv dist/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
mv dist/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||||
@@ -175,22 +221,14 @@ jobs:
|
|||||||
- name: Retain Windows EXE and DLLs
|
- name: Retain Windows EXE and DLLs
|
||||||
run: cp -r build/windows/x64/runner/Release ente-${{ github.ref_name }}-windows
|
run: cp -r build/windows/x64/runner/Release ente-${{ github.ref_name }}-windows
|
||||||
|
|
||||||
- name: Sign files with Trusted Signing
|
- name: Code sign Windows installer and EXE
|
||||||
uses: azure/trusted-signing-action@v0
|
uses: dlemstra/code-sign-action@v1
|
||||||
with:
|
with:
|
||||||
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
certificate: "${{ secrets.WINDOWS_CERTIFICATE }}"
|
||||||
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
password: "${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}"
|
||||||
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
|
files: |
|
||||||
endpoint: ${{ secrets.AZURE_ENDPOINT }}
|
auth/artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||||
trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }}
|
auth/ente-${{ github.ref_name }}-windows/auth.exe
|
||||||
certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }}
|
|
||||||
files: |
|
|
||||||
${{ github.workspace }}/mobile/apps/auth/artifacts/ente-${{ github.ref_name }}-installer.exe
|
|
||||||
${{ github.workspace }}/mobile/apps/auth/ente-${{ github.ref_name }}-windows/auth.exe
|
|
||||||
file-digest: SHA256
|
|
||||||
timestamp-rfc3161: http://timestamp.acs.microsoft.com
|
|
||||||
timestamp-digest: SHA256
|
|
||||||
|
|
||||||
|
|
||||||
- name: Zip Windows EXE and DLLs
|
- name: Zip Windows EXE and DLLs
|
||||||
run: tar.exe -a -c -f artifacts/ente-${{ github.ref_name }}-windows.zip ente-${{ github.ref_name }}-windows
|
run: tar.exe -a -c -f artifacts/ente-${{ github.ref_name }}-windows.zip ente-${{ github.ref_name }}-windows
|
||||||
@@ -201,7 +239,7 @@ jobs:
|
|||||||
- name: Create a draft GitHub release
|
- name: Create a draft GitHub release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
artifacts: "mobile/apps/auth/artifacts/*"
|
artifacts: "auth/artifacts/*"
|
||||||
draft: true
|
draft: true
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
updateOnlyUnreleased: true
|
updateOnlyUnreleased: true
|
||||||
@@ -211,7 +249,7 @@ jobs:
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/auth
|
working-directory: auth
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
@@ -298,7 +336,7 @@ jobs:
|
|||||||
- name: Create a draft GitHub release
|
- name: Create a draft GitHub release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
artifacts: "mobile/apps/auth/artifacts/*"
|
artifacts: "auth/artifacts/*"
|
||||||
draft: true
|
draft: true
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
updateOnlyUnreleased: true
|
updateOnlyUnreleased: true
|
||||||
|
|||||||
6
.github/workflows/cli-release.yml
vendored
@@ -12,10 +12,6 @@ on:
|
|||||||
tags:
|
tags:
|
||||||
- "cli-v*"
|
- "cli-v*"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
draft-release:
|
draft-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -49,7 +45,7 @@ jobs:
|
|||||||
goarch: ${{ matrix.goarch }}
|
goarch: ${{ matrix.goarch }}
|
||||||
asset_name: ente-${{ github.ref_name }}-${{ matrix.goos }}-${{ matrix.goarch }}
|
asset_name: ente-${{ github.ref_name }}-${{ matrix.goos }}-${{ matrix.goarch }}
|
||||||
release_name: ${{ github.ref_name }}
|
release_name: ${{ github.ref_name }}
|
||||||
goversion: "1.23"
|
goversion: "1.20"
|
||||||
project_path: "./cli"
|
project_path: "./cli"
|
||||||
pre_command: export CGO_ENABLED=0
|
pre_command: export CGO_ENABLED=0
|
||||||
build_flags: "-trimpath"
|
build_flags: "-trimpath"
|
||||||
|
|||||||
53
.github/workflows/codeql.yml
vendored
@@ -1,53 +0,0 @@
|
|||||||
# The only reason we're making a custom CodeQL configuration is because the
|
|
||||||
# default setup does not have an option to run daily / weekly instead of per
|
|
||||||
# push, which is too slow.
|
|
||||||
#
|
|
||||||
# In the future, it might become faster. Then just delete this file, and revert
|
|
||||||
# to the default configuration.
|
|
||||||
#
|
|
||||||
# References:
|
|
||||||
# https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/
|
|
||||||
|
|
||||||
name: "CodeQL"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch: # Allow running manually
|
|
||||||
schedule:
|
|
||||||
- cron: "22 1 * * 1"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: Analyze (${{ matrix.language }})
|
|
||||||
runs-on: 'ubuntu-latest'
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
# Required for all workflows.
|
|
||||||
security-events: write
|
|
||||||
# Required to fetch internal or private CodeQL packs.
|
|
||||||
packages: read
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- language: actions
|
|
||||||
build-mode: none
|
|
||||||
- language: go
|
|
||||||
build-mode: autobuild
|
|
||||||
- language: javascript-typescript
|
|
||||||
build-mode: none
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v3
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
build-mode: ${{ matrix.build-mode }}
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v3
|
|
||||||
with:
|
|
||||||
category: "/language:${{matrix.language}}"
|
|
||||||
3
.github/workflows/copycat-db-release.yml
vendored
@@ -3,9 +3,6 @@ name: "Release (copycat-db)"
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch: # Run manually
|
workflow_dispatch: # Run manually
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
5
.github/workflows/desktop-lint.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "desktop/**"
|
- "desktop/**"
|
||||||
- ".github/workflows/desktop-lint.yml"
|
- ".github/workflows/desktop-lint.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -23,7 +20,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "desktop/yarn.lock"
|
cache-dependency-path: "desktop/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/docs-deploy.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "docs/yarn.lock"
|
cache-dependency-path: "docs/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
32
.github/workflows/docs-lint.yml
vendored
@@ -1,32 +0,0 @@
|
|||||||
name: "Lint (docs)"
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Run on every pull request (open or push to it) that changes docs/
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "docs/**"
|
|
||||||
- ".github/workflows/docs-lint.yml"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: docs
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup node and enable yarn caching
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 22
|
|
||||||
cache: "yarn"
|
|
||||||
cache-dependency-path: "web/yarn.lock"
|
|
||||||
|
|
||||||
- run: yarn install
|
|
||||||
|
|
||||||
- run: yarn pretty:check
|
|
||||||
5
.github/workflows/docs-verify-build.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
- "docs/**"
|
- "docs/**"
|
||||||
- ".github/workflows/docs-verify-build.yml"
|
- ".github/workflows/docs-verify-build.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
verify-build:
|
verify-build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "docs/yarn.lock"
|
cache-dependency-path: "docs/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/infra-deploy-staff.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "infra/staff/yarn.lock"
|
cache-dependency-path: "infra/staff/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/infra-lint-staff.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "infra/staff/**"
|
- "infra/staff/**"
|
||||||
- ".github/workflows/infra-deploy-staff.yml"
|
- ".github/workflows/infra-deploy-staff.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -25,7 +22,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "infra/staff/yarn.lock"
|
cache-dependency-path: "infra/staff/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
10
.github/workflows/mobile-crowdin-push.yml
vendored
@@ -5,14 +5,10 @@ on:
|
|||||||
branches: [main]
|
branches: [main]
|
||||||
paths:
|
paths:
|
||||||
# Run workflow when mobiles's intl_en.arb is changed
|
# Run workflow when mobiles's intl_en.arb is changed
|
||||||
- "mobile/apps/photos/lib/l10n/intl_en.arb"
|
- "mobile/lib/l10n/intl_en.arb"
|
||||||
# Or the workflow itself is changed
|
# Or the workflow itself is changed
|
||||||
- ".github/workflows/mobile-crowdin.yml"
|
- ".github/workflows/mobile-crowdin.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
push-sources-to-crowdin:
|
push-sources-to-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -24,8 +20,8 @@ jobs:
|
|||||||
- name: Crowdin's action
|
- name: Crowdin's action
|
||||||
uses: crowdin/github-action@v2
|
uses: crowdin/github-action@v2
|
||||||
with:
|
with:
|
||||||
base_path: "mobile/apps/photos/"
|
base_path: "mobile/"
|
||||||
config: "mobile/apps/photos/crowdin.yml"
|
config: "mobile/crowdin.yml"
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
download_translations: false
|
download_translations: false
|
||||||
|
|||||||
12
.github/workflows/mobile-crowdin-sync.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: "Sync Crowdin translations (mobile/photos)"
|
name: "Sync Crowdin translations (mobile)"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
@@ -8,10 +8,6 @@ on:
|
|||||||
# Also allow manually running the workflow.
|
# Also allow manually running the workflow.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
synchronize-with-crowdin:
|
synchronize-with-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -23,14 +19,14 @@ jobs:
|
|||||||
- name: Crowdin's action
|
- name: Crowdin's action
|
||||||
uses: crowdin/github-action@v2
|
uses: crowdin/github-action@v2
|
||||||
with:
|
with:
|
||||||
base_path: "mobile/apps/photos/"
|
base_path: "mobile/"
|
||||||
config: "mobile/apps/photos/crowdin.yml"
|
config: "mobile/crowdin.yml"
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
download_translations: true
|
download_translations: true
|
||||||
localization_branch_name: translations/mobile
|
localization_branch_name: translations/mobile
|
||||||
create_pull_request: true
|
create_pull_request: true
|
||||||
pull_request_title: "[mobile/photos] New translations"
|
pull_request_title: "[mobile] New translations"
|
||||||
pull_request_body: "New translations from [Crowdin](https://crowdin.com/project/ente-photos-app)"
|
pull_request_body: "New translations from [Crowdin](https://crowdin.com/project/ente-photos-app)"
|
||||||
pull_request_base_branch_name: "main"
|
pull_request_base_branch_name: "main"
|
||||||
project_id: 574741
|
project_id: 574741
|
||||||
|
|||||||
147
.github/workflows/mobile-daily-internal.yml
vendored
@@ -1,147 +0,0 @@
|
|||||||
name: "Internal release (photos)"
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
# Runs daily at 12:30 UTC (6:00 PM IST)
|
|
||||||
- cron: "30 12 * * *"
|
|
||||||
workflow_dispatch: # Allow manual trigger
|
|
||||||
|
|
||||||
env:
|
|
||||||
FLUTTER_VERSION: "3.32.8"
|
|
||||||
RUST_VERSION: "1.86.0"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: mobile/apps/photos
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code and submodules
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Setup JDK 17
|
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 17
|
|
||||||
|
|
||||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
channel: "stable"
|
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: Install Flutter Rust Bridge
|
|
||||||
run: cargo install flutter_rust_bridge_codegen
|
|
||||||
|
|
||||||
- name: Generate Rust bindings
|
|
||||||
run: flutter_rust_bridge_codegen generate
|
|
||||||
|
|
||||||
- name: Increment version code for build
|
|
||||||
run: |
|
|
||||||
CURRENT_VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //')
|
|
||||||
VERSION_NAME=$(echo $CURRENT_VERSION | cut -d'+' -f1)
|
|
||||||
CURRENT_BUILD=$(echo $CURRENT_VERSION | cut -d'+' -f2)
|
|
||||||
NEW_BUILD=$((CURRENT_BUILD + ${{ github.run_number }}))
|
|
||||||
NEW_VERSION="${VERSION_NAME}+${NEW_BUILD}"
|
|
||||||
|
|
||||||
sed -i "s/^version: .*/version: $NEW_VERSION/" pubspec.yaml
|
|
||||||
echo "Building with version ${NEW_VERSION}"
|
|
||||||
|
|
||||||
# Store version for later use
|
|
||||||
echo "NEW_VERSION=${NEW_VERSION}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Prepare and validate changelog for Play Store
|
|
||||||
run: |
|
|
||||||
mkdir -p whatsnew
|
|
||||||
CHANGELOG_FILE="scripts/store_changes.txt"
|
|
||||||
DISCORD_FILE="scripts/internal_changes.txt"
|
|
||||||
OUTPUT_FILE="whatsnew/whatsnew-en-US"
|
|
||||||
|
|
||||||
# Use provided changelog or fallback
|
|
||||||
if [ -f "$CHANGELOG_FILE" ]; then
|
|
||||||
head -c 500 "$CHANGELOG_FILE" > "$OUTPUT_FILE"
|
|
||||||
else
|
|
||||||
echo "Bug fixes and improvements" > "$OUTPUT_FILE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Validate: file exists
|
|
||||||
if [ ! -s "$OUTPUT_FILE" ]; then
|
|
||||||
echo "❌ Changelog is empty."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Validate: <= 500 chars
|
|
||||||
LENGTH=$(wc -m < "$OUTPUT_FILE")
|
|
||||||
if [ "$LENGTH" -gt 500 ]; then
|
|
||||||
echo "❌ Changelog exceeds 500 characters ($LENGTH)."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Validate: no markdown or HTML
|
|
||||||
if grep -Eq '[\*\_\<\>\[\]\(\)]' "$OUTPUT_FILE"; then
|
|
||||||
echo "❌ Changelog contains markdown/HTML formatting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ Changelog valid:"
|
|
||||||
cat "$OUTPUT_FILE"
|
|
||||||
|
|
||||||
# Store changelog for Play Store (with escaped newlines)
|
|
||||||
CHANGELOG_PLAYSTORE=$(cat "$OUTPUT_FILE" | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/"/\\"/g')
|
|
||||||
echo "CHANGELOG=${CHANGELOG_PLAYSTORE}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
# Store changelog for Discord (with proper newlines)
|
|
||||||
CHANGELOG_DISCORD=$(cat "$DISCORD_FILE" | sed 's/"/\\"/g')
|
|
||||||
echo "CHANGELOG_DISCORD<<EOF" >> $GITHUB_ENV
|
|
||||||
echo "$CHANGELOG_DISCORD" >> $GITHUB_ENV
|
|
||||||
echo "EOF" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Setup keys
|
|
||||||
uses: timheuer/base64-to-file@v1
|
|
||||||
with:
|
|
||||||
fileName: "keystore/ente_photos_key.jks"
|
|
||||||
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
|
||||||
|
|
||||||
- name: Build PlayStore AAB
|
|
||||||
run: |
|
|
||||||
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
|
|
||||||
env:
|
|
||||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
|
||||||
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
|
||||||
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
|
||||||
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
|
||||||
|
|
||||||
- name: Upload AAB to PlayStore
|
|
||||||
uses: r0adkll/upload-google-play@v1
|
|
||||||
with:
|
|
||||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
|
||||||
packageName: io.ente.photos
|
|
||||||
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
|
||||||
track: internal
|
|
||||||
whatsNewDirectory: mobile/apps/photos/whatsnew
|
|
||||||
mappingFile: mobile/apps/photos/build/app/outputs/mapping/playstoreRelease/mapping.txt
|
|
||||||
|
|
||||||
- name: Notify Discord
|
|
||||||
uses: sarisia/actions-status-discord@v1
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
|
||||||
nodetail: true
|
|
||||||
title: "🏆 Daily release Photos v${{ env.NEW_VERSION }} (Branch: ${{ github.ref_name }})"
|
|
||||||
description: |
|
|
||||||
**Version:** ${{ env.NEW_VERSION }}
|
|
||||||
**Flutter:** ${{ env.FLUTTER_VERSION }}
|
|
||||||
**Commit:** [${{ github.sha }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }})
|
|
||||||
**Download:** [Play Store](https://play.google.com/store/apps/details?id=io.ente.photos)
|
|
||||||
|
|
||||||
**Changes:**
|
|
||||||
${{ env.CHANGELOG_DISCORD }}
|
|
||||||
color: 0x00ff00
|
|
||||||
56
.github/workflows/mobile-internal-release.yml
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
name: "Internal release (photos)"
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch: # Allow manually running the action
|
||||||
|
|
||||||
|
env:
|
||||||
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: mobile
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code and submodules
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Setup JDK 17
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 17
|
||||||
|
|
||||||
|
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: "stable"
|
||||||
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Setup keys
|
||||||
|
uses: timheuer/base64-to-file@v1
|
||||||
|
with:
|
||||||
|
fileName: "keystore/ente_photos_key.jks"
|
||||||
|
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
||||||
|
|
||||||
|
- name: Build PlayStore AAB
|
||||||
|
run: |
|
||||||
|
flutter build appbundle --release --flavor playstore
|
||||||
|
env:
|
||||||
|
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
||||||
|
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
||||||
|
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
||||||
|
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
||||||
|
|
||||||
|
- name: Upload AAB to PlayStore
|
||||||
|
uses: r0adkll/upload-google-play@v1
|
||||||
|
with:
|
||||||
|
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||||
|
packageName: io.ente.photos
|
||||||
|
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||||
|
track: internal
|
||||||
22
.github/workflows/mobile-lint.yml
vendored
@@ -4,22 +4,19 @@ on:
|
|||||||
# Run on every pull request (open or push to it) that changes mobile/
|
# Run on every pull request (open or push to it) that changes mobile/
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- "mobile/apps/photos/**"
|
- "mobile/**"
|
||||||
- ".github/workflows/mobile-lint.yml"
|
- ".github/workflows/mobile-lint.yml"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.32.8"
|
|
||||||
RUST_VERSION: "1.86.0"
|
|
||||||
|
|
||||||
permissions:
|
FLUTTER_VERSION: "3.24.3"
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/photos
|
working-directory: mobile
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -32,18 +29,7 @@ jobs:
|
|||||||
channel: "stable"
|
channel: "stable"
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- run: flutter pub get
|
- run: flutter pub get
|
||||||
|
|
||||||
- name: Install Rust ${{ env.RUST_VERSION }}
|
|
||||||
uses: dtolnay/rust-toolchain@master
|
|
||||||
with:
|
|
||||||
toolchain: ${{ env.RUST_VERSION }}
|
|
||||||
|
|
||||||
- name: Install Flutter Rust Bridge
|
|
||||||
run: cargo install flutter_rust_bridge_codegen
|
|
||||||
|
|
||||||
- name: Generate Rust bindings
|
|
||||||
run: flutter_rust_bridge_codegen generate
|
|
||||||
|
|
||||||
- run: flutter analyze --no-fatal-infos
|
- run: flutter analyze --no-fatal-infos
|
||||||
|
|||||||
11
.github/workflows/mobile-release.yml
vendored
@@ -9,10 +9,7 @@ on:
|
|||||||
- "photos-v*"
|
- "photos-v*"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.32.8"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -20,7 +17,7 @@ jobs:
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: mobile/apps/photos
|
working-directory: mobile
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code and submodules
|
- name: Checkout code and submodules
|
||||||
@@ -48,7 +45,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build independent APK
|
- name: Build independent APK
|
||||||
run: |
|
run: |
|
||||||
flutter build apk --dart-define=cronetHttpNoPlay=true --release --flavor independent
|
flutter build apk --release --flavor independent
|
||||||
mv build/app/outputs/flutter-apk/app-independent-release.apk build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk
|
mv build/app/outputs/flutter-apk/app-independent-release.apk build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk
|
||||||
env:
|
env:
|
||||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
||||||
@@ -62,5 +59,5 @@ jobs:
|
|||||||
- name: Create a draft GitHub release
|
- name: Create a draft GitHub release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
artifacts: "mobile/apps/photos/build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk,mobile/apps/photos/build/app/outputs/flutter-apk/sha256sum"
|
artifacts: "mobile/build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk,mobile/build/app/outputs/flutter-apk/sha256sum"
|
||||||
draft: true
|
draft: true
|
||||||
|
|||||||
126
.github/workflows/photos-internal-release.yml
vendored
@@ -1,126 +0,0 @@
|
|||||||
name: "Internal Release V2 (photos)"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch: # Manual trigger only
|
|
||||||
|
|
||||||
env:
|
|
||||||
FLUTTER_VERSION: "3.32.8"
|
|
||||||
ANDROID_KEYSTORE_PATH: "keystore/ente_photos_key.jks"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: macos-latest # Required for iOS builds
|
|
||||||
environment: "ios-build"
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: mobile/apps/photos
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# Common Setup
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Setup JDK 17
|
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 17
|
|
||||||
|
|
||||||
- name: Install Flutter
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
# Android Build
|
|
||||||
- name: Setup Android signing key
|
|
||||||
uses: timheuer/base64-to-file@v1
|
|
||||||
with:
|
|
||||||
fileName: ${{ env.ANDROID_KEYSTORE_PATH }}
|
|
||||||
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
|
||||||
|
|
||||||
# - name: Build Android AAB
|
|
||||||
# run: |
|
|
||||||
# flutter build appbundle \
|
|
||||||
# --dart-define=cronetHttpNoPlay=true \
|
|
||||||
# --release \
|
|
||||||
# --flavor playstore
|
|
||||||
# env:
|
|
||||||
# SIGNING_KEY_PATH: ${{ env.ANDROID_KEYSTORE_PATH }}
|
|
||||||
# SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
|
||||||
# SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
|
||||||
# SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
|
||||||
|
|
||||||
# iOS Build (new secure implementation)
|
|
||||||
- name: Install fastlane
|
|
||||||
run: gem install fastlane
|
|
||||||
|
|
||||||
- name: Create ExportOptions.plist
|
|
||||||
run: |
|
|
||||||
cat <<EOF > ios/ExportOptions.plist
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>method</key>
|
|
||||||
<string>app-store</string>
|
|
||||||
<key>teamID</key>
|
|
||||||
<string>${{ secrets.IOS_TEAM_ID }}</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
EOF
|
|
||||||
|
|
||||||
- name: Setup App Store Connect API Key
|
|
||||||
run: |
|
|
||||||
echo '${{ secrets.IOS_API_KEY }}' > api_key.json
|
|
||||||
chmod 600 api_key.json
|
|
||||||
|
|
||||||
- name: Build iOS IPA
|
|
||||||
run: |
|
|
||||||
flutter build ipa \
|
|
||||||
--release \
|
|
||||||
--export-options-plist=ExportOptions.plist \
|
|
||||||
--dart-define=cronetHttpNoPlay=true
|
|
||||||
env:
|
|
||||||
SIGNING_TEAM_ID: ${{ secrets.IOS_TEAM_ID }}
|
|
||||||
|
|
||||||
# Uploads
|
|
||||||
# - name: Upload to Play Store
|
|
||||||
# uses: r0adkll/upload-google-play@v1
|
|
||||||
# with:
|
|
||||||
# serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
|
||||||
# packageName: io.ente.photos
|
|
||||||
# releaseFiles: build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
|
||||||
# track: internal
|
|
||||||
|
|
||||||
- name: Upload to TestFlight
|
|
||||||
run: |
|
|
||||||
fastlane pilot upload \
|
|
||||||
--api_key_path api_key.json \
|
|
||||||
--ipa "build/ios/ipa/Ente Photos.ipa" \
|
|
||||||
--skip_waiting_for_build_processing \
|
|
||||||
--apple_id ${{ secrets.IOS_APPLE_ID }} \
|
|
||||||
--app_identifier "io.ente.photos"
|
|
||||||
env:
|
|
||||||
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.IOS_API_KEY_ID }}
|
|
||||||
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.IOS_ISSUER_ID }}
|
|
||||||
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.IOS_APP_SPECIFIC_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Clean sensitive files
|
|
||||||
run: |
|
|
||||||
rm -f api_key.json
|
|
||||||
rm -f ${{ env.ANDROID_KEYSTORE_PATH }}
|
|
||||||
|
|
||||||
- name: Notify Discord
|
|
||||||
uses: sarisia/actions-status-discord@v1
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
|
||||||
title: "🚀 Dual Platform Release Uploaded"
|
|
||||||
description: |
|
|
||||||
**Android**: [Play Store Internal](https://play.google.com/store/apps/details?id=io.ente.photos)
|
|
||||||
**iOS**: TestFlight build processing
|
|
||||||
color: 0x00ff00
|
|
||||||
44
.github/workflows/rust-lint.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
name: "Lint (rust)"
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Run on every pull request (open or push to it) that changes rust/
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "rust/**"
|
|
||||||
- ".github/workflows/rust-lint.yml"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
# Cancel in-progress lint runs when a new commit is pushed.
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
env:
|
|
||||||
RUSTFLAGS: -D warnings
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: rust
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/registry
|
|
||||||
~/.cargo/git
|
|
||||||
target
|
|
||||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
|
|
||||||
- run: cargo fmt --check
|
|
||||||
|
|
||||||
- run: cargo clippy --all-targets --all-features
|
|
||||||
|
|
||||||
- run: cargo build
|
|
||||||
3
.github/workflows/server-lint.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "server/**"
|
- "server/**"
|
||||||
- ".github/workflows/server-lint.yml"
|
- ".github/workflows/server-lint.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
45
.github/workflows/server-publish-ghcr.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: "Publish ghcr (server)"
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Run automatically on 15th of every month, at 05:00 UTC.
|
|
||||||
schedule:
|
|
||||||
- cron: '0 5 15 * *'
|
|
||||||
# Run manually if needed to publish out of schedule.
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # for pushing the `ghcr/server` branch
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Determine commit from prod museum
|
|
||||||
run: |
|
|
||||||
echo "museum_commit=$(curl -s https://api.ente.io/ping | jq -r .id)" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
ref: ${{ env.museum_commit }}
|
|
||||||
|
|
||||||
- name: Build and push
|
|
||||||
uses: mr-smithers-excellent/docker-build-push@v6
|
|
||||||
with:
|
|
||||||
dockerfile: server/Dockerfile
|
|
||||||
directory: server
|
|
||||||
# Resultant package name will be ghcr.io/ente-io/server
|
|
||||||
image: server
|
|
||||||
registry: ghcr.io
|
|
||||||
enableBuildKit: true
|
|
||||||
multiPlatform: true
|
|
||||||
platform: linux/amd64,linux/arm64
|
|
||||||
buildArgs: GIT_COMMIT=${{ env.museum_commit }}
|
|
||||||
tags: ${{ env.museum_commit }}, latest
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Update branch ghcr/server to point to source commit
|
|
||||||
run: |
|
|
||||||
git push -f origin HEAD:refs/heads/ghcr/server
|
|
||||||
45
.github/workflows/server-publish.yml
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
name: "Publish (server)"
|
||||||
|
|
||||||
|
on:
|
||||||
|
# Run manually, providing it the commit.
|
||||||
|
#
|
||||||
|
# To obtain the commit from the currently deployed museum, do:
|
||||||
|
# curl -s https://api.ente.io/ping | jq -r '.id'
|
||||||
|
#
|
||||||
|
# See server/docs/publish.md for more details.
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
commit:
|
||||||
|
description: "Commit to publish the image from"
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ inputs.commit }}
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: mr-smithers-excellent/docker-build-push@v6
|
||||||
|
with:
|
||||||
|
dockerfile: server/Dockerfile
|
||||||
|
directory: server
|
||||||
|
# Resultant package name will be ghcr.io/ente-io/server
|
||||||
|
image: server
|
||||||
|
registry: ghcr.io
|
||||||
|
enableBuildKit: true
|
||||||
|
multiPlatform: true
|
||||||
|
platform: linux/amd64,linux/arm64
|
||||||
|
buildArgs: GIT_COMMIT=${{ inputs.commit }}
|
||||||
|
tags: ${{ inputs.commit }}, latest
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Tag as server/ghcr
|
||||||
|
run: |
|
||||||
|
git tag -f server/ghcr
|
||||||
|
git push -f origin server/ghcr
|
||||||
3
.github/workflows/server-release.yml
vendored
@@ -3,9 +3,6 @@ name: "Release (server)"
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch: # Run manually
|
workflow_dispatch: # Run manually
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
4
.github/workflows/web-crowdin-push-both.yml
vendored
@@ -12,10 +12,6 @@ on:
|
|||||||
# `gh workflow run web-crowdin-push-both.yml --ref <my-branch>`
|
# `gh workflow run web-crowdin-push-both.yml --ref <my-branch>`
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
push-both-to-crowdin:
|
push-both-to-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
9
.github/workflows/web-crowdin-sync.yml
vendored
@@ -22,15 +22,6 @@ on:
|
|||||||
# Also allow manually running the workflow.
|
# Also allow manually running the workflow.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
# "In order to push translations and create pull requests, the Crowdin GitHub
|
|
||||||
# action requires the `GITHUB_TOKEN` to have write permission on the `contents`
|
|
||||||
# and `pull-requests`.
|
|
||||||
#
|
|
||||||
# - https://github.com/crowdin/github-action?tab=readme-ov-file#permissions
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
synchronize-with-crowdin:
|
synchronize-with-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
7
.github/workflows/web-deploy-one.yml
vendored
@@ -15,9 +15,6 @@ on:
|
|||||||
- "payments"
|
- "payments"
|
||||||
- "photos"
|
- "photos"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -29,11 +26,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
7
.github/workflows/web-deploy-preview.yml
vendored
@@ -15,9 +15,6 @@ on:
|
|||||||
- "payments"
|
- "payments"
|
||||||
- "photos"
|
- "photos"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -29,11 +26,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/web-deploy-staging.yml
vendored
@@ -11,9 +11,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -37,11 +34,12 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ steps.select-branch.outputs.branch }}
|
ref: ${{ steps.select-branch.outputs.branch }}
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
33
.github/workflows/web-deploy.yml
vendored
@@ -4,7 +4,7 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
# [Note: Run workflow every 24 hours]
|
# [Note: Run workflow every 24 hours]
|
||||||
#
|
#
|
||||||
# Run every weekday at ~8:00 AM IST.
|
# Run everyday at ~8:00 AM IST (except Sundays).
|
||||||
#
|
#
|
||||||
# First field is minute, second is hour of the day. Last is day of week,
|
# First field is minute, second is hour of the day. Last is day of week,
|
||||||
# 0 being Sunday.
|
# 0 being Sunday.
|
||||||
@@ -15,13 +15,10 @@ on:
|
|||||||
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
|
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
|
||||||
# https://crontab.guru/
|
# https://crontab.guru/
|
||||||
#
|
#
|
||||||
- cron: "25 2 * * 1-5"
|
- cron: "25 2 * * 1-6"
|
||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -33,11 +30,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
@@ -54,18 +53,6 @@ jobs:
|
|||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/photos web/apps/photos/out
|
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/photos web/apps/photos/out
|
||||||
|
|
||||||
- name: Build custom-albums
|
|
||||||
run: yarn build:photos
|
|
||||||
env:
|
|
||||||
NEXT_PUBLIC_ENTE_ONLY_SERVE_ALBUMS_APP: 1
|
|
||||||
|
|
||||||
- name: Publish custom-albums
|
|
||||||
uses: cloudflare/wrangler-action@v3
|
|
||||||
with:
|
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
||||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/custom-albums web/apps/photos/out
|
|
||||||
|
|
||||||
- name: Build accounts
|
- name: Build accounts
|
||||||
run: yarn build:accounts
|
run: yarn build:accounts
|
||||||
|
|
||||||
@@ -105,13 +92,3 @@ jobs:
|
|||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/payments web/apps/payments/dist
|
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/payments web/apps/payments/dist
|
||||||
|
|
||||||
- name: Build locker
|
|
||||||
run: yarn build:locker
|
|
||||||
|
|
||||||
- name: Publish locker
|
|
||||||
uses: cloudflare/wrangler-action@v3
|
|
||||||
with:
|
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
||||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/locker web/apps/locker/out
|
|
||||||
|
|||||||
5
.github/workflows/web-lint.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "web/**"
|
- "web/**"
|
||||||
- ".github/workflows/web-lint.yml"
|
- ".github/workflows/web-lint.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
# Cancel in-progress lint runs when a new commit is pushed.
|
# Cancel in-progress lint runs when a new commit is pushed.
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
38
.github/workflows/web-publish-ghcr.yml
vendored
@@ -1,38 +0,0 @@
|
|||||||
name: "Publish ghcr (web)"
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Run automatically every Wednesday, at 07:00 UTC.
|
|
||||||
schedule:
|
|
||||||
- cron: '0 7 * * 3'
|
|
||||||
# Run manually if needed to publish out of schedule.
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # for pushing the `ghcr/web` branch
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Build and push
|
|
||||||
uses: mr-smithers-excellent/docker-build-push@v6
|
|
||||||
with:
|
|
||||||
dockerfile: web/Dockerfile
|
|
||||||
directory: web
|
|
||||||
# Resultant package name will be ghcr.io/ente-io/web
|
|
||||||
image: web
|
|
||||||
registry: ghcr.io
|
|
||||||
enableBuildKit: true
|
|
||||||
multiPlatform: true
|
|
||||||
platform: linux/amd64,linux/arm64
|
|
||||||
tags: ${{ github.sha }}, latest
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Update branch ghcr/web to point to source commit
|
|
||||||
run: |
|
|
||||||
git push -f origin HEAD:refs/heads/ghcr/web
|
|
||||||
8
.gitmodules
vendored
@@ -3,9 +3,13 @@
|
|||||||
url = https://github.com/ente-io/sentry-dart.git
|
url = https://github.com/ente-io/sentry-dart.git
|
||||||
branch = sentry_flutter_ente
|
branch = sentry_flutter_ente
|
||||||
[submodule "auth/flutter"]
|
[submodule "auth/flutter"]
|
||||||
path = mobile/apps/auth/flutter
|
path = auth/flutter
|
||||||
url = https://github.com/flutter/flutter.git
|
url = https://github.com/flutter/flutter.git
|
||||||
branch = stable
|
branch = stable
|
||||||
[submodule "auth/assets/simple-icons"]
|
[submodule "auth/assets/simple-icons"]
|
||||||
path = mobile/apps/auth/assets/simple-icons
|
path = auth/assets/simple-icons
|
||||||
url = https://github.com/simple-icons/simple-icons.git
|
url = https://github.com/simple-icons/simple-icons.git
|
||||||
|
[submodule "web/apps/photos/thirdparty/photoswipe"]
|
||||||
|
path = web/apps/photos/thirdparty/photoswipe
|
||||||
|
url = https://github.com/ente-io/PhotoSwipe.git
|
||||||
|
branch = single-thread
|
||||||
|
|||||||
@@ -1,42 +1,54 @@
|
|||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
- [Spread the word](#spread-the-word)
|
First and foremost, thank you for your interest in contributing to Ente 🙏
|
||||||
- [Engage with the community](#engage-with-the-community)
|
|
||||||
- [Translate](#translate)
|
There are many ways to contribute, and most of them don't require writing code.
|
||||||
- [Document](#document)
|
|
||||||
|
* [Spread the word](#spread-the-word)
|
||||||
|
* [Engage with the community](#engage-with-the-community)
|
||||||
|
* [Translate](#translate)
|
||||||
|
* [Document](#document)
|
||||||
|
|
||||||
|
|
||||||
## Spread the word
|
## Spread the word
|
||||||
|
|
||||||
**This is the most impactful contribution you can make**.
|
This is perhaps the most impactful contribution you can make. [Spread the
|
||||||
|
word](https://help.ente.io/photos/features/referral-program/). Online on your
|
||||||
[Spread the word](https://help.ente.io/photos/features/referral-program/). Online on your favorite social media channels. Offline to your friends and family who are looking for a privacy-friendly alternative to big tech.
|
favorite social media channels. Offline to your friends and family who are
|
||||||
|
looking for a privacy-friendly alternative to big tech.
|
||||||
|
|
||||||
## Engage with the community
|
## Engage with the community
|
||||||
|
|
||||||
Just hang around, enjoy the vibe. The Ente community — the people who are building Ente, and the people who are using Ente — hang out at various places depending on their proclivity:
|
Just hang around, enjoy the vibe. Answer someone's query on our
|
||||||
|
[Discord](https://discord.gg/z2YVKkycX3), or pile on in the sporadic #off-topic
|
||||||
|
rants there. Chuckle (or wince!) at our [Twitter](https://twitter.com/enteio)
|
||||||
|
memes. Suggest a new feature in our [Github
|
||||||
|
Discussions](https://github.com/ente-io/ente/discussions/new?category=feature-requests),
|
||||||
|
or upvote the existing ones that you feel we should focus on first. Provide your
|
||||||
|
opinion on existing threads.
|
||||||
|
|
||||||
- [Discord](https://discord.ente.io)
|
These might seem like small things, but it provides us energy. Knowing that
|
||||||
- [Mastodon](https://fosstodon.org/@ente)
|
there is a community of people who care for what we are building.
|
||||||
- [X / Twitter](https://twitter.com/enteio)
|
|
||||||
- [Github Discussions](https://github.com/ente-io/ente/discussions)
|
|
||||||
|
|
||||||
Just being around might seem a small thing, but it provides us energy. Knowing that there is a community of people who care for what we are building, **who want us to do better**.
|
|
||||||
|
|
||||||
## Translate
|
## Translate
|
||||||
|
|
||||||
Visit our Crowdin projects to help with translations:
|
If you're interested in helping out with translation, please visit our Crowdin
|
||||||
|
projects to get started:
|
||||||
|
|
||||||
|
| Project | |
|
||||||
|
| ------------- | ------------- |
|
||||||
|
| [Auth](https://crowdin.com/project/ente-authenticator-app) | [](https://crowdin.com/project/ente-authenticator-app) |
|
||||||
|
| [Photos](https://crowdin.com/project/ente-photos-app) | [](https://crowdin.com/project/ente-photos-app) |
|
||||||
|
| [Photos Web / Desktop](https://crowdin.com/project/ente-photos-web) | [](https://crowdin.com/project/ente-photos-web) |
|
||||||
|
|
||||||
| Project | |
|
|
||||||
| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| [Auth](https://crowdin.com/project/ente-authenticator-app) | [](https://crowdin.com/project/ente-authenticator-app) |
|
|
||||||
| [Photos](https://crowdin.com/project/ente-photos-app) | [](https://crowdin.com/project/ente-photos-app) |
|
|
||||||
| [Photos Web / Desktop](https://crowdin.com/project/ente-photos-web) | [](https://crowdin.com/project/ente-photos-web) |
|
|
||||||
|
|
||||||
If your language is not listed for translation, please [create a GitHub
|
If your language is not listed for translation, please [create a GitHub
|
||||||
issue](https://github.com/ente-io/ente/issues/new?title=Request+for+New+Language+Translation&body=Language+name%3A+%0AProject%3A+auth%2Fphotos%2Fboth)
|
issue](https://github.com/ente-io/ente/issues/new?title=Request+for+New+Language+Translation&body=Language+name%3A+%0AProject%3A+auth%2Fphotos%2Fboth)
|
||||||
to have it added. It is okay to have partial translations. Once ~90% of the
|
to have it added. It is okay to have partial translations. Once ~90% of the
|
||||||
strings in a language get translated, we will start surfacing it in the apps.
|
strings in a language get translated, we will start surfacing it in the apps.
|
||||||
|
|
||||||
|
Thank you for your support.
|
||||||
|
|
||||||
## Document
|
## Document
|
||||||
|
|
||||||
The help guides and FAQs for users of Ente products are also open source, and
|
The help guides and FAQs for users of Ente products are also open source, and
|
||||||
@@ -48,9 +60,25 @@ See [docs/](docs/README.md) for how to edit these documents.
|
|||||||
|
|
||||||
## Code contributions
|
## Code contributions
|
||||||
|
|
||||||
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](mobile/apps/auth/docs/adding-icons.md), or fixing a specific bug.
|
Code is a small aspect of community, and the ways mentioned above are more
|
||||||
|
important in helping us. But if you'd _really_ like to contribute code, it is
|
||||||
|
best to start small. Consider some well-scoped changes, say like adding more
|
||||||
|
[custom icons to auth](auth/docs/adding-icons.md).
|
||||||
|
|
||||||
Code that changes the behaviour of the product might not get merged, at least not initially. The PR can serve as a discussion bed, but you might find it easier to just start a discussion instead, or post your perspective in the (likely) existing thread about the behaviour change or new feature you wish for.
|
Each of the individual product/platform specific directories in this repository
|
||||||
|
have instructions on setting up a dev environment.
|
||||||
|
|
||||||
|
For anything beyond trivial bug fixes, please use [features requests and
|
||||||
|
discussions](https://github.com/ente-io/ente/discussions) instead of performing
|
||||||
|
code changes directly.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
>
|
||||||
|
> Please remember that code is a important, but small, part of the overall big
|
||||||
|
> picture that makes a product a joy to use. Something that's easy in code is
|
||||||
|
> not necessarily the right choice for the product as a whole. So we'll repeat -
|
||||||
|
> there are other ways to contribute than code that we'd request you to
|
||||||
|
> consider.
|
||||||
|
|
||||||
## Leave a review or star
|
## Leave a review or star
|
||||||
|
|
||||||
|
|||||||
14
README.md
@@ -30,12 +30,12 @@ Learn more at [ente.io](https://ente.io).
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Our flagship product. 3x data replication. Face detection. Semantic search.
|
Our flagship product. 3x data replication. On device machine learning. Cross
|
||||||
Private sharing. Collaborative albums. Family plans. Easy import, easier export.
|
platform. Private sharing. Collaborative albums. Family plans. Easy import,
|
||||||
Background uploads. The list goes on. And of course, all of this, while being
|
easier export. Background uploads. The list goes on. And of course, all of this,
|
||||||
fully end-to-end encrypted across platforms.
|
while being fully end-to-end encrypted.
|
||||||
|
|
||||||
Ente Photos is a paid service, but we offer 10GB of free storage.
|
Ente Photos is a paid service, but we offer 5GB of free storage.
|
||||||
You can also clone this repository and choose to self-host.
|
You can also clone this repository and choose to self-host.
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
@@ -95,8 +95,8 @@ please see our [support guide](SUPPORT.md).
|
|||||||
<img src=".github/assets/ente-ducky.png" width=200 alt="Ente's Mascot, Ducky,
|
<img src=".github/assets/ente-ducky.png" width=200 alt="Ente's Mascot, Ducky,
|
||||||
inviting people to Ente's source code repository" />
|
inviting people to Ente's source code repository" />
|
||||||
|
|
||||||
Please visit the [community section](https://ente.io/about#community) for all the ways to
|
Please visit our [community page](https://ente.io/community) for all the ways to
|
||||||
connect with our community.
|
connect with the community.
|
||||||
|
|
||||||
[](https://discord.gg/z2YVKkycX3)
|
[](https://discord.gg/z2YVKkycX3)
|
||||||
[](https://ente.io/blog/rss.xml)
|
[](https://ente.io/blog/rss.xml)
|
||||||
|
|||||||
43
auth/.gitignore
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Miscellaneous
|
||||||
|
*.class
|
||||||
|
*.log
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
.DS_Store
|
||||||
|
.atom/
|
||||||
|
.buildlog/
|
||||||
|
.history
|
||||||
|
.svn/
|
||||||
|
|
||||||
|
# Editors
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# IntelliJ related
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
|
# VS Code which you may wish to be included in version control, so this line
|
||||||
|
# is commented out by default.
|
||||||
|
#.vscode/
|
||||||
|
|
||||||
|
# Flutter/Dart/Pub related
|
||||||
|
**/doc/api/
|
||||||
|
.dart_tool/
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
.packages
|
||||||
|
.pub-cache/
|
||||||
|
.pub/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# Web related
|
||||||
|
lib/generated_plugin_registrant.dart
|
||||||
|
|
||||||
|
# Exceptions to above rules.
|
||||||
|
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||||
|
|
||||||
|
android/key.properties
|
||||||
|
dist/
|
||||||
106
auth/README.md
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# Ente Auth
|
||||||
|
|
||||||
|
Ente's 2FA app. An end-to-end encrypted, cross platform and free app for
|
||||||
|
storing your 2FA codes with cloud backups. Works offline. You can even use it
|
||||||
|
without signing up for an account if you don't want the cloud backups or
|
||||||
|
multi-device sync.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 📲 Download
|
||||||
|
|
||||||
|
### Android
|
||||||
|
|
||||||
|
This repository's [GitHub
|
||||||
|
releases](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v4)
|
||||||
|
contains APKs, built straight from source. These builds keep themselves updated,
|
||||||
|
without relying on third party stores.
|
||||||
|
|
||||||
|
You can alternatively install the build from PlayStore or F-Droid.
|
||||||
|
|
||||||
|
<a href="https://play.google.com/store/apps/details?id=io.ente.auth">
|
||||||
|
<img height="59" src="../.github/assets/play-store-badge.png">
|
||||||
|
</a>
|
||||||
|
<a href="https://f-droid.org/packages/io.ente.auth/">
|
||||||
|
<img height="59" src="../.github/assets/f-droid-badge.png">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
### iOS / Apple Silicon macOS
|
||||||
|
|
||||||
|
<a href="https://apps.apple.com/us/app/ente-authenticator/id6444121398">
|
||||||
|
<img height="59" src="../.github/assets/app-store-badge.svg">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
### Desktop
|
||||||
|
|
||||||
|
You can [**download**](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v4)
|
||||||
|
a native desktop app from this repository's GitHub releases. The desktop app
|
||||||
|
works on Windows, Linux and macOS.
|
||||||
|
|
||||||
|
### Web
|
||||||
|
|
||||||
|
You can view your 2FA codes at [auth.ente.io](https://auth.ente.io). For adding
|
||||||
|
or managing your secrets, please use our mobile or desktop app.
|
||||||
|
|
||||||
|
## 🧑💻 Build from source
|
||||||
|
|
||||||
|
1. [Install Flutter](https://flutter.dev/docs/get-started/install)
|
||||||
|
|
||||||
|
2. Pull in all submodules with `git submodule update --init --recursive`
|
||||||
|
|
||||||
|
3. For Android, [setup your
|
||||||
|
keystore](https://docs.flutter.dev/deployment/android#create-an-upload-keystore)
|
||||||
|
and run `flutter build apk --release --flavor independent`
|
||||||
|
|
||||||
|
4. For iOS, run `flutter build ios`
|
||||||
|
|
||||||
|
## ⚙️ Develop
|
||||||
|
|
||||||
|
For Android, use
|
||||||
|
|
||||||
|
```sh
|
||||||
|
flutter run -t lib/main.dart --flavor independent
|
||||||
|
```
|
||||||
|
|
||||||
|
For iOS, use `flutter run`
|
||||||
|
|
||||||
|
VSCode users might find it useful to copy [docs/vscode](docs/vscode) into a top
|
||||||
|
level `.vscode`.
|
||||||
|
|
||||||
|
If the code you're working needs to modify user facing strings, see
|
||||||
|
[docs/localization](docs/localization.md).
|
||||||
|
|
||||||
|
## 🔩 Architecture
|
||||||
|
|
||||||
|
The architecture that powers end-to-end encrypted storage and sync of your
|
||||||
|
tokens has been documented [here](../architecture/README.md).
|
||||||
|
|
||||||
|
## 🌍 Translate
|
||||||
|
|
||||||
|
[](https://crowdin.com/project/ente-authenticator-app)
|
||||||
|
|
||||||
|
If you're interested in helping out with translation, please visit our [Crowdin
|
||||||
|
project](https://crowdin.com/project/ente-photos-app) to get started. Thank you
|
||||||
|
for your support.
|
||||||
|
|
||||||
|
If your language is not listed for translation, please [create a GitHub
|
||||||
|
issue](https://github.com/ente-io/ente/issues/new?title=Request+for+New+Language+Translation&body=Language+name%3A)
|
||||||
|
to have it added.
|
||||||
|
|
||||||
|
## 🧑🎨 Icons
|
||||||
|
|
||||||
|
Ente Auth supports the icon pack provided by
|
||||||
|
[simple-icons](https://github.com/simple-icons/simple-icons). If you wish to add
|
||||||
|
more, see [docs/adding-icons](docs/adding-icons.md).
|
||||||
|
|
||||||
|
## 💚 Contribute
|
||||||
|
|
||||||
|
The best way to support this project is by checking out [Ente
|
||||||
|
Photos](../mobile/README.md) or spreading the word.
|
||||||
|
|
||||||
|
For more ways to contribute, see [../CONTRIBUTING.md](../CONTRIBUTING.md).
|
||||||
|
|
||||||
|
## ⭐️ About
|
||||||
|
|
||||||
|
To know more about Ente and the ways to get in touch or seek help, see [our main
|
||||||
|
README](../README.md) or visit [ente.io](https://ente.io).
|
||||||
13
auth/android/.gitignore
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
gradle-wrapper.jar
|
||||||
|
/.gradle
|
||||||
|
/captures/
|
||||||
|
/gradlew
|
||||||
|
/gradlew.bat
|
||||||
|
/local.properties
|
||||||
|
GeneratedPluginRegistrant.java
|
||||||
|
|
||||||
|
# Remember to never publicly share your keystore.
|
||||||
|
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||||
|
key.properties
|
||||||
|
**/*.keystore
|
||||||
|
**/*.jks
|
||||||
118
auth/android/app/build.gradle
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
plugins {
|
||||||
|
id "com.android.application"
|
||||||
|
id "kotlin-android"
|
||||||
|
id "dev.flutter.flutter-gradle-plugin"
|
||||||
|
}
|
||||||
|
|
||||||
|
def localProperties = new Properties()
|
||||||
|
def localPropertiesFile = rootProject.file('local.properties')
|
||||||
|
if (localPropertiesFile.exists()) {
|
||||||
|
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||||
|
localProperties.load(reader)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||||
|
if (flutterVersionCode == null) {
|
||||||
|
flutterVersionCode = '1'
|
||||||
|
}
|
||||||
|
|
||||||
|
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||||
|
if (flutterVersionName == null) {
|
||||||
|
flutterVersionName = '1.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
def keystoreProperties = new Properties()
|
||||||
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||||
|
if (keystorePropertiesFile.exists()) {
|
||||||
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace "io.ente.auth"
|
||||||
|
compileSdk 34
|
||||||
|
ndkVersion flutter.ndkVersion
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = '1.8'
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
|
||||||
|
lintOptions {
|
||||||
|
disable 'InvalidPackage'
|
||||||
|
warningsAsErrors false
|
||||||
|
checkReleaseBuilds false
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "io.ente.auth"
|
||||||
|
// You can update the following values to match your application needs.
|
||||||
|
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||||
|
minSdkVersion 21
|
||||||
|
targetSdkVersion 34
|
||||||
|
versionCode flutterVersionCode.toInteger()
|
||||||
|
versionName flutterVersionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
multiDexEnabled true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : System.getenv("SIGNING_KEY_PATH") ? file(System.getenv("SIGNING_KEY_PATH")) : null
|
||||||
|
keyAlias keystoreProperties['keyAlias'] ? keystoreProperties['keyAlias'] : System.getenv("SIGNING_KEY_ALIAS")
|
||||||
|
keyPassword keystoreProperties['keyPassword'] ? keystoreProperties['keyPassword'] : System.getenv("SIGNING_KEY_PASSWORD")
|
||||||
|
storePassword keystoreProperties['storePassword'] ? keystoreProperties['storePassword'] : System.getenv("SIGNING_STORE_PASSWORD")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flavorDimensions "default"
|
||||||
|
productFlavors {
|
||||||
|
independent {
|
||||||
|
dimension "default"
|
||||||
|
applicationIdSuffix ".independent"
|
||||||
|
}
|
||||||
|
playstore {
|
||||||
|
dimension "default"
|
||||||
|
}
|
||||||
|
fdroid {
|
||||||
|
dimension "default"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
}
|
||||||
|
debug {
|
||||||
|
applicationIdSuffix '.debug'
|
||||||
|
versionNameSuffix "-debug"
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
arguments "-DANDROID_PACKAGE_NAME=${android.defaultConfig.applicationId}${applicationIdSuffix}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
android.applicationVariants.all { variant ->
|
||||||
|
if (variant.flavorName == "fdroid") {
|
||||||
|
variant.outputs.all { output ->
|
||||||
|
output.outputFileName = "app-fdroid-release.apk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flutter {
|
||||||
|
source '../..'
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {}
|
||||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
70
auth/android/app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<application android:name="${applicationName}"
|
||||||
|
android:label="Ente Auth"
|
||||||
|
android:icon="@mipmap/launcher_icon"
|
||||||
|
android:usesCleartextTraffic="true"
|
||||||
|
android:requestLegacyExternalStorage="true"
|
||||||
|
android:allowBackup="false"
|
||||||
|
android:fullBackupContent="false"
|
||||||
|
android:largeHeap="true">
|
||||||
|
|
||||||
|
<activity android:name=".MainActivity" android:launchMode="singleTop"
|
||||||
|
android:theme="@style/LaunchTheme"
|
||||||
|
android:exported="true"
|
||||||
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:windowSoftInputMode="adjustResize">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
<data android:scheme="ente-auth"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="otpauth" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="enteauth" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
<!-- Don't delete the meta-data below.
|
||||||
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
|
<meta-data android:name="flutterEmbedding" android:value="2"/>
|
||||||
|
|
||||||
|
<meta-data android:name="io.sentry.dsn"
|
||||||
|
android:value="https://ed4ddd6309b847ba8849935e26e9b648@sentry.ente.io/9"/>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<queries>
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.SENDTO"/>
|
||||||
|
<data android:scheme="mailto"/>
|
||||||
|
</intent>
|
||||||
|
</queries>
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="32"/>
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="29"
|
||||||
|
tools:ignore="ScopedStorage"/>
|
||||||
|
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@@ -1,19 +1,24 @@
|
|||||||
Ente Auth helps you generate and store 2 step verification (2FA) tokens on your mobile devices.
|
Ente Auth helps you generate and store 2 step verification (2FA)
|
||||||
|
tokens on your mobile devices.
|
||||||
|
|
||||||
|
|
||||||
FEATURES
|
FEATURES
|
||||||
|
|
||||||
- Secure Backups
|
- Secure Backups
|
||||||
Auth provides end-to-end encrypted cloud backups so that you don't have to worry about losing your tokens. We use the same protocols Ente Photos uses to encrypt and preserve your data.
|
Auth provides end-to-end encrypted cloud backups so that you don't have to worry
|
||||||
|
about losing your tokens. We use the same protocols Ente Photos uses to encrypt
|
||||||
|
and preserve your data.
|
||||||
|
|
||||||
- Multi Device Synchronization
|
- Multi Device Synchronization
|
||||||
Auth will automatically sync the 2FA tokens you add to your account, across all your devices. Every new device you sign into will have access to these tokens.
|
Auth will automatically sync the 2FA tokens you add to your account, across all
|
||||||
|
your devices. Every new device you sign into will have access to these tokens.
|
||||||
|
|
||||||
- Web access
|
- Web access
|
||||||
You can access your 2FA code from any web browser by visiting https://auth.ente.io .
|
You can access your 2FA code from any web browser by visiting https://auth.ente.io .
|
||||||
|
|
||||||
- Offline Mode
|
- Offline Mode
|
||||||
Auth generates 2FA tokens offline, so your network connectivity will not get in the way of your workflow.
|
Auth generates 2FA tokens offline, so your network connectivity will not get in
|
||||||
|
the way of your workflow.
|
||||||
|
|
||||||
- Import and Export Tokens
|
- Import and Export Tokens
|
||||||
You can add tokens to Auth by one of the following methods:
|
You can add tokens to Auth by one of the following methods:
|
||||||
@@ -25,7 +30,8 @@ otpauth://totp/provider.com:you@email.com?secret=YOUR_SECRET
|
|||||||
|
|
||||||
The codes maybe separated by new lines or commas.
|
The codes maybe separated by new lines or commas.
|
||||||
|
|
||||||
You can also export the codes you have added to Auth, to an **unencrypted** text file, that adheres to the above format.
|
You can also export the codes you have added to Auth, to an **unencrypted** text
|
||||||
|
file, that adheres to the above format.
|
||||||
|
|
||||||
|
|
||||||
SUPPORT
|
SUPPORT
|
||||||
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 69 B |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 635 KiB After Width: | Height: | Size: 635 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 69 B |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 69 B |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 635 KiB After Width: | Height: | Size: 635 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 604 KiB After Width: | Height: | Size: 604 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |