Compare commits

..

4 Commits

Author SHA1 Message Date
RoyceDa
319ff7baf1 Merge branch 'main' of https://git.rosetta.im/Rosetta/desktop into main 2026-03-22 16:44:59 +02:00
RoyceDa
e61c9c5f58 Merge branch 'dev' into main 2026-03-22 16:43:57 +02:00
RoyceDa
426f0c40bc Проблема обмена ключами в звонках 2026-03-22 16:41:09 +02:00
RoyceDa
b300fa4d03 Улучшен CI/CD 2026-03-22 16:08:24 +02:00
5 changed files with 90 additions and 125 deletions

View File

@@ -13,6 +13,10 @@ on:
jobs:
build:
runs-on: macos
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
steps:
- name: Checkout code
uses: actions/checkout@v6
@@ -31,6 +35,7 @@ jobs:
restore-keys: |
${{ runner.os }}-npm-
if-no-files-found: ignore
# Кэш для electron-builder
- name: Cache electron-builder
uses: actions/cache@v5
@@ -42,32 +47,35 @@ jobs:
restore-keys: |
${{ runner.os }}-electron-builder-
if-no-files-found: ignore
- name: NPM offline setup
shell: bash
run: |
npm config set cache "$HOME/.npm-cache" --global
npm config set prefer-offline true --global
- name: Install npm dependencies
run: npm install --prefer-offline --no-audit --no-fund
- name: Build the application
run: npm run kernel:mac
#Загружаем на удаленный сервер по SSH используя scp и пароль из секретов
#Загружаем из двух папок dist/builds/darwin/x64 и dist/builds/darwin/arm64, так как electron-builder может создавать разные файлы для разных архитектур
#Вызываем файл sshupload.sh и передаем ему параметры из секретов, чтобы не хранить пароль в открытом виде в workflow
- name: Upload to SSH using scp
shell: bash
- name: Build the application (${{ matrix.arch }})
run: |
chmod +x "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh"
sh "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh" \
-l "$GITHUB_WORKSPACE/dist/builds/darwin/x64/Rosetta-*.pkg" \
-r "${{ secrets.SDU_SSH_KERNEL }}/darwin/x64" \
-s "${{ secrets.SDU_SSH_HOST }}" \
-u "${{ secrets.SDU_SSH_USERNAME }}" \
-p '${{ secrets.SDU_SSH_PASSWORD }}'
sh "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh" \
-l "$GITHUB_WORKSPACE/dist/builds/darwin/arm64/Rosetta-*.pkg" \
-r "${{ secrets.SDU_SSH_KERNEL }}/darwin/arm64" \
-s "${{ secrets.SDU_SSH_HOST }}" \
-u "${{ secrets.SDU_SSH_USERNAME }}" \
-p '${{ secrets.SDU_SSH_PASSWORD }}'
npx electron-vite build
npx electron-builder --mac --${{ matrix.arch }}
- name: Check if files exist (${{ matrix.arch }})
run: |
echo "=== Checking dist structure ==="
find dist/builds/darwin/${{ matrix.arch }} -type f -name "*.pkg" 2>/dev/null || echo "No PKG files found"
ls -la dist/builds/darwin/${{ matrix.arch }}/ 2>/dev/null || echo "arch folder not found"
- name: Upload ${{ matrix.arch }} to SSH using SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SDU_SSH_HOST }}
username: ${{ secrets.SDU_SSH_USERNAME }}
password: ${{ secrets.SDU_SSH_PASSWORD }}
port: 22
source: "dist/builds/darwin/${{ matrix.arch }}/Rosetta-*.pkg"
target: "${{ secrets.SDU_SSH_KERNEL }}/darwin/${{ matrix.arch }}"
strip_components: 4
rm: true

View File

@@ -12,7 +12,11 @@ on:
jobs:
build:
runs-on: linux
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
steps:
- name: Checkout code
uses: actions/checkout@v6
@@ -49,38 +53,28 @@ jobs:
- name: Install npm dependencies
run: npm install --no-audit --no-fund
- name: Build the application
run: npm run kernel:linux
- name: Build the application (${{ matrix.arch }})
run: |
npx electron-vite build
npx electron-builder --linux --${{ matrix.arch }}
- name: Check if files exist
- name: Check if files exist (${{ matrix.arch }})
run: |
echo "=== Checking dist structure ==="
find dist/builds -type f -name "*.AppImage" 2>/dev/null || echo "No AppImage files found"
ls -la dist/builds/linux/ 2>/dev/null || echo "linux folder not found"
find dist/builds/linux/${{ matrix.arch }} -type f -name "*.AppImage" 2>/dev/null || echo "No AppImage files found"
ls -la dist/builds/linux/${{ matrix.arch }}/ 2>/dev/null || echo "arch folder not found"
- name: Install SCP in Docker container
run: apt-get install -y openssh-client
- name: Upload x64 to SSH using SCP
- name: Upload ${{ matrix.arch }} to SSH using SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SDU_SSH_HOST }}
username: ${{ secrets.SDU_SSH_USERNAME }}
password: ${{ secrets.SDU_SSH_PASSWORD }}
port: 22
source: "dist/builds/linux/x64/Rosetta-*.AppImage"
target: "${{ secrets.SDU_SSH_KERNEL }}/linux/x64"
source: "dist/builds/linux/${{ matrix.arch }}/Rosetta-*.AppImage"
target: "${{ secrets.SDU_SSH_KERNEL }}/linux/${{ matrix.arch }}"
strip_components: 4
rm: true
- name: Upload arm64 to SSH using SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SDU_SSH_HOST }}
username: ${{ secrets.SDU_SSH_USERNAME }}
password: ${{ secrets.SDU_SSH_PASSWORD }}
port: 22
source: "dist/builds/linux/arm64/Rosetta-*.AppImage"
target: "${{ secrets.SDU_SSH_KERNEL }}/linux/arm64"
strip_components: 4
rm: true
rm: true

View File

@@ -11,7 +11,7 @@ on:
jobs:
build:
runs-on: linux
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
@@ -29,13 +29,13 @@ jobs:
restore-keys: |
${{ runner.os }}-npm-
if-no-files-found: ignore
# Кэш для electron-builder (macOS)
- name: Cache electron-builder (macOS)
# Кэш для electron-builder (Linux)
- name: Cache electron-builder (Linux)
uses: actions/cache@v5
with:
path: |
${{ env.HOME }}/Library/Caches/electron-builder
${{ env.HOME }}/Library/Caches/electron
${{ env.HOME }}/.cache/electron-builder
${{ env.HOME }}/.cache/electron
key: ${{ runner.os }}-electron-builder-${{ hashFiles('**/electron-builder.yml') }}
restore-keys: |
${{ runner.os }}-electron-builder-
@@ -54,6 +54,11 @@ jobs:
- name: Build the application
run: npm run kernel:linux
- name: Install ZIP in Docker container
run: |
apt-get update
apt-get install -y zip
#Собираем сервисные пакеты для всех платформ
- name: Build SP
shell: bash
@@ -62,13 +67,28 @@ jobs:
sh "$GITHUB_WORKSPACE/build-packs.sh"
#Загружаем на удаленный сервер по SSH используя scp и пароль из секретов
#Загружаем из двух папок dist/builds/darwin/x64 и dist/builds/darwin/arm64, так как electron-builder может создавать разные файлы для разных архитектур
- name: Upload to SSH
shell: bash
run: |
chmod +x "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh"
sh "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh" \
-l "$GITHUB_WORKSPACE/packs/*" \
-r "${{ secrets.SDU_SSH_PACKS }}" \
-s "${{ secrets.SDU_SSH_HOST }}" \
-u "${{ secrets.SDU_SSH_USERNAME }}" \
-p '${{ secrets.SDU_SSH_PASSWORD }}'
# - name: Upload to SSH
# shell: bash
# run: |
# chmod +x "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh"
# sh "$GITHUB_WORKSPACE/.gitea/workflows/sshupload.sh" \
# -l "$GITHUB_WORKSPACE/packs/*" \
# -r "${{ secrets.SDU_SSH_PACKS }}" \
# -s "${{ secrets.SDU_SSH_HOST }}" \
# -u "${{ secrets.SDU_SSH_USERNAME }}" \
# -p '${{ secrets.SDU_SSH_PASSWORD }}'
- name: Install SCP in Docker container
run: apt-get install -y openssh-client
- name: Upload ${{ matrix.arch }} to SSH using SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SDU_SSH_HOST }}
username: ${{ secrets.SDU_SSH_USERNAME }}
password: ${{ secrets.SDU_SSH_PASSWORD }}
port: 22
source: "$GITHUB_WORKSPACE/packs/*"
target: "${{ secrets.SDU_SSH_PACKS }}"
strip_components: 1
rm: true

View File

@@ -1,67 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'EOF'
Usage: sshupload.sh -l <local_glob> -r <remote_dir> -s <server> -u <user> -p <password>
EOF
}
local_glob=""
remote_dir=""
server=""
user=""
password=""
while [[ $# -gt 0 ]]; do
case "$1" in
-l|--local) local_glob="$2"; shift 2;;
-r|--remote) remote_dir="$2"; shift 2;;
-s|--server) server="$2"; shift 2;;
-u|--user) user="$2"; shift 2;;
-p|--password) password="$2"; shift 2;;
-h|--help) usage; exit 0;;
*) echo "Unknown arg: $1" >&2; usage; exit 1;;
esac
done
if [[ -z "$local_glob" || -z "$remote_dir" || -z "$server" || -z "$user" || -z "$password" ]]; then
echo "Missing required params" >&2
usage
exit 1
fi
# Ensure sshpass installed
if ! command -v sshpass >/dev/null 2>&1; then
if command -v brew >/dev/null 2>&1; then
brew update
brew install hudochenkov/sshpass/sshpass
elif command -v apt-get >/dev/null 2>&1; then
sudo apt-get update
sudo apt-get install -y sshpass
else
echo "sshpass not found and no supported package manager" >&2
exit 1
fi
fi
user_host="${user}@${server}"
# Ensure remote dir exists and clear it
sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$user_host" "mkdir -p '$remote_dir' && rm -f '$remote_dir'/*"
# Expand glob (supports ~ and patterns) and upload each file (compatible with macOS bash 3.x)
shopt -s nullglob
eval "files=( ${local_glob} )"
shopt -u nullglob
if [[ ${#files[@]} -eq 0 ]]; then
echo "No files matched: $local_glob" >&2
exit 1
fi
for f in "${files[@]}"; do
sshpass -p "$password" scp -o StrictHostKeyChecking=no "$f" "$user_host:$remote_dir/"
done
echo "Upload completed"

10
problems/problem_calls.md Normal file
View File

@@ -0,0 +1,10 @@
# Проблема обмена ключами в звонках
Для того, чтобы звонки работали защищенно, необходимо обмениваться ключами между участниками. При этом, сам ключ не должен передаваться по сети, иначе его смогут перехватить злоумышленники. Поэтому, для обмена ключами используется специальный протокол, который позволяет участникам обмениваться ключами без передачи их по сети. В Rosetta можно было использовать уже известный и проверенный контур шифрования по которому шифруются сообщения с использованием публичных и приватных ключей. Однако реализация такого метода может обернуться проблемами при эксплуатации, так как при ответе на звонок, участник может не иметь доступа к приватному ключу, который используется для дешифровки сообщений (например, при ответе на звонок с телефона, когда в приложение не был совершен вход, то есть оно выгружено из памяти), в этом случае звонок не будет работать, так как участник не сможет дешифровать голос и видео из звонка.
## Возможное решение
Можно заставлять пользователя входить в приложение при ответе на звонок, чтобы он мог получить доступ к приватному ключу и дешифровать звонок. Однако, это может привести к неудобствам для пользователей, так как им придется каждый раз входить в приложение при ответе на звонок, что может быть особенно проблематично при использовании мобильного устройства.
## Решение использованное в Rosetta
Для решения проблемы обмена ключами в звонках, в Rosetta используется алгоритм Диффи-Хеллмана для генерации общего секрета между участниками звонка. Этот алгоритм позволяет участникам обмениваться публичными ключами и генерировать общий секрет, который используется для шифрования и дешифрования медиа-потока в звонке. При этом, это не требует входа в приложение, так как ключ генерируется случайный при каждом звонке, и не зависит от приватного ключа. Это обеспечивает удобство для пользователей, так как им не нужно входить в приложение при ответе на звонок, и при этом обеспечивает безопасность звонков, так как ключи не передаются по сети и генерируются случайным образом для каждого звонка. Таким образом, Rosetta обеспечивает безопасные и удобные звонки для пользователей.