Skip to content

Latest commit

 

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DShare

DShare 是一款基于 DTK(Deepin Tool Kit) 专为 deepin 桌面环境 打造的文件共享软件。它把本机的一个目录(~/myshare)通过局域网共享出去: 既提供原生 DTK 图形界面在本地管理文件,也内置一个 HTTP/HTTPS 服务,让同局域网 内的其他设备通过浏览器或本程序直接浏览、下载、上传文件。

采用 DTK6 开发,深度集成 deepin 的视觉风格与桌面组件(窗口、控件、主题、 提示框、日志等),是 deepin / UOS v25 桌面下体验一致的文件共享工具。

English version is available at the bottom of this file.


功能特性

  • 本地文件管理:基于 DTK 的图形界面,浏览共享目录 ~/myshare,支持 新建文件夹、复制/粘贴、拖拽移动/复制、删除、双击打开。
  • Web 文件共享:程序启动时自动在 5000 端口 开启服务,可访问地址显示在 窗口底部状态栏(随「访问需授权」开关在 http:// / https:// 间切换):
    • 浏览目录(带路径导航、文件大小展示)
    • 下载单个文件
    • 通过网页表单上传文件、新建文件夹
    • 未开启授权时使用明文 HTTP,浏览器直接访问、无自签证书告警;
    • 开启授权时使用 HTTPS(自动用 openssl 生成自签名证书并写入本机 LAN IP 到 SAN),以加密保护授权凭据,浏览器会提示证书不受信任,选择「继续访问」即可。
  • 局域网设备发现:基于多播(UDP 端口 5001 / 组播组 239.255.42.99)自动 发现同局域网内其它运行本程序的 deepin 机器。可按机器名正则发起查找,避免 手动记 IP。
  • 远程目录浏览与传输:在地址栏「机器」下拉中选择另一台设备即可只读浏览其 共享目录:
    • 双击文件 → 下载到本机缓存并默认打开
    • 把远程文件拖到本地视图/系统文件管理器 → 下载
    • 把本地文件拖入远程视图 → 上传到对方共享目录
  • 访问授权(默认开启):任何设备访问你的共享都需经你手动批准。授权请求 会弹出提示框显示对方机器名与 IP;浏览器端通过自动握手 + Cookie 完成授权,桌面 客户端通过 AuthManager 自动完成握手,无需用户记忆任何口令。写入侧另有独立防线: 分片/文件大小上限、offset 连续性校验、同名文件拒绝覆盖(服务端返回 409,桌面 客户端会询问是否覆盖后再重传)。不需要授权时可在顶部关闭开关,此时回到明文 HTTP。
  • HTTPS 引导页:授权模式下本机同时监听明文 5080 端口,但该端口不提供任何 共享内容,只返回一张提示页说明「本共享需通过 HTTPS 访问」并给出「继续访问」 按钮。扫码或直接拿到地址的人会先看到说明,再点进 HTTPS 地址,不会被证书告警劝退。
  • 手机扫码访问:地址栏「机器」下拉框右侧有一个二维码,实时对应本机当前 共享目录的网页地址。授权模式下二维码指向 5080 引导页(无证书告警),选择 「继续访问」后进入 HTTPS 授权流程;未开启授权时直接指向该目录的 HTTP 地址。 点击二维码弹出大图预览(含地址与「复制地址」按钮)。进入远程浏览时该二维码 自动禁用。「添加客户端」入口已并入下拉框的末项「+ 添加客户端…」,选中即可查找 并连接其它设备。

编译依赖

依赖 说明
CMake >= 3.13 构建系统
Qt6 Core / Widgets / Network / HttpServer 应用框架与 HTTP 服务
DTK6 Core / Gui / Widget / Log deepin 桌面组件与日志(本程序基于此构建)
openssl 仅在没有配置 HTTPS 证书、临时生成自签名证书时用到其命令行(配了正式证书就不需要)
C++17 编译器(g++ / clang)

适用于 deepin / UOS v25(DTK6)环境。


编译与安装

# 在项目根目录
mkdir -p build && cd build
cmake ..
make -j"$(nproc)"

# 运行(未安装时可直接执行构建产物)
./dshare

# 可选:安装到系统
sudo make install      # 可执行文件 -> /usr/bin,桌面项 -> /usr/share/applications

安装后也可从应用菜单启动(桌面项名称为「DShare」)。


发布产物:获取、安装与校验

每个版本的 Release 都会附带以下文件(scripts/build-release.sh 一键构建,产物落在 dist/,见「构建 Release 产物」):

文件 用途
dshare_<版本>_<架构>.deb Debian/deepin 本地安装包(amd64 / arm64 / loong64)
<appid>_<版本>_<架构>_binary.layer 如意玲珑(linyaps)层文件,用于玲珑环境与商店投稿
SHA256SUMS 上述产物的 SHA-256 校验和

下载后先校验,再安装:

cd 下载目录
sha256sum -c SHA256SUMS          # 全部文件应输出“成功 / OK”

安装 deb:

sudo apt install ./dshare_1.0.1_amd64.deb
# 卸载
sudo apt remove dshare

安装玲珑 layer(ll-cli 不需要 sudo,装到当前用户目录下):

ll-cli install ./io.github.zhutianhao.dshare_1.0.1.0_x86_64_binary.layer
# 运行 / 查看 / 卸载
ll-cli run io.github.zhutianhao.dshare
ll-cli list | grep dshare
ll-cli uninstall io.github.zhutianhao.dshare

装完即可在应用菜单里看到 DShare。首次安装时玲珑会自动补拉该应用的 base 与 runtime(org.deepin.baseorg.deepin.runtime.dtk),需要联网。

架构对应关系:amd64 ↔ x86_64arm64 ↔ arm64loong64 ↔ loong64。 deb 包名用左侧命名,玲珑层文件名用右侧命名;layer 必须与机器架构一致。 另外 ll-builder export -o dshare.uab 可导出单文件离线包, 同样用 ll-cli install ./dshare.uab 安装(当前 CI 只产出 layer)。

构建 Release 产物

# 需要 dpkg-dev(dpkg-buildpackage)与 linglong-builder(ll-builder)
sudo apt install -y dpkg-dev debhelper linglong-builder

scripts/build-release.sh                  # 产出 deb + layer + SHA256SUMS 到 dist/
scripts/build-release.sh --deb-only       # 只要 deb
scripts/build-release.sh --layer-only     # 只要玲珑 layer
scripts/build-release.sh --sums-only      # 不重新构建,只重算 SHA256SUMS

ll-builderdpkg-buildpackage 都按本机架构构建,不做交叉编译,因此需要出 arm64 / loong64 产物时请在对应架构的机器上跑一遍脚本,把各架构产物汇总到同一个目录 后执行一次 --sums-only 生成统一的 SHA256SUMS 再发布。脚本最后会打印可直接执行的 gh release create 命令。

打包细节:deb 的依赖不写死版本下限debian/rules 会去掉 dh_shlibdeps 按构建机库版本生成的下限),否则在容器等较新环境里构建的 deb 会因为 libqt6widgets6libdtk6widget 版本过高而在 deepin 25 上装不上。

GitHub Actions 自动构建

仓库配了两个工作流:

工作流 触发 做什么
.github/workflows/ci.yml 推送到 main / PR 在玲珑容器里完整编译一次,作为编译检查
.github/workflows/release.yml 推送 v* tag(也可手动触发) 构建 amd64 + arm64 的 deb 与玲珑 layer,生成 SHA256SUMS 并创建 GitHub Release

之所以要借玲珑的容器:GitHub 官方 runner 是 Ubuntu,装不了 DTK6 开发包。而玲珑官方 软件源提供 xUbuntu_24.04(含 amd64/arm64)的 linglong-builderll-builder 会在 deepin base + dtk runtime 容器里编译——宿主不需要任何 deepin 依赖。deb 也是在同一套 容器里跑 dpkg-buildpackage 产出的。

发版流程:

git tag v1.0.1 && git push origin v1.0.1   # 即触发构建与 Release

一次构建的大部分时间花在拉取玲珑的 base / dtk runtime 层上(首次约 10 分钟, 编译本身只要 20 秒左右),因此工作流会缓存 ~/.cache/linglong-builder (ll-builder 以普通用户运行时存放层数据的目录,按架构各一份,缓存键带 linglong.yaml 的哈希,升级 base/runtime 会自动失效)。命中缓存后单个架构 约 3–5 分钟。

loong64 目前没有官方 runner,需要一台标签为 [self-hosted, linux, loong64] 的 deepin/loong64 机器;手动触发工作流时勾选 include_loong64 才会构建该架构。 (linglong.yaml 中的多架构库目录 lib/<triplet> 已按构建机自动推导,无需手改。)


使用方法

1. 本地管理共享目录

启动后默认进入本机 ~/myshare(不存在会自动创建)。通过工具栏即可:

  • 返回上级 / 新建文件夹 / 刷新 / 复制 / 粘贴
  • 右键菜单:新建文件夹、刷新、复制、粘贴、删除、打开
  • 选中文件后在本窗口内拖拽 = 移动,从外部(如系统文件管理器)拖入 = 复制

2. 通过浏览器共享 / 访问

  • 本机访问:浏览器打开状态栏显示的地址(如 https://localhost:5000)。
  • 局域网访问:窗口底部状态栏会显示当前可访问地址——未开启授权http://<你的IP>:5000开启授权(默认)为 https://<你的IP>:5000, 并额外给出更易转发的明文引导页 http://<你的IP>:5080
  • 把引导页地址发给同局域网的其他人最省事:对方打开后看到一张说明页,点 「继续访问」即跳到 HTTPS 地址。
  • 授权模式下浏览器会提示自签名证书不受信任,选择「继续访问」即可(证书仅用于 加密授权凭据,不提供第三方信任链);未开启授权 时为明文 HTTP,无安全提示。
  • 在网页中可浏览目录、点击文件下载、使用表单上传文件或新建文件夹。
  • 网页上传会实时显示进度与速度,上传期间禁用上传按钮,避免重复提交。
  • 上传遇到同名文件时服务端不会覆盖,网页会提示「目标已存在,未覆盖」。

3. 发现并连接其它设备

  1. 点击工具栏 添加,弹出「查找」对话框。
  2. 输入目标机器名(作为正则表达式,留空/.* 匹配全部),点击「查找」。
  3. 程序持续发送多播查询,下方列表会显示应答的机器(已去重)。
  4. 双击列表中的机器,即把它加入地址栏「机器」下拉框并切换过去。也可直接在下 拉框末项「+ 添加客户端…」触发查找对话框。

4. 与远程设备互传文件

在「机器」下拉框选择某台远程设备后:

  • 下载:双击文件(下载并打开)/ 把文件拖到本地视图或桌面。
  • 上传:把本地文件拖入远程视图的目录中(可一次拖入多个)。上传时会弹出进度 窗口,显示当前文件、整体进度、实时速度,并可随时取消。
  • 远程目录为只读,不支持在其中新建/删除/粘贴。
  • 收发两端都是分片流式处理(4 MB/片,边收边写),因此单个文件可以超过 2 GB, 也不会把整个文件读进内存。

5. HTTPS 证书:正式证书 / 自签名

授权模式默认使用 HTTPS。证书来源按以下顺序决定:

  1. 用户导入的证书(工具栏「证书」按钮):选定证书与私钥后,程序会校验 PEM 格式、有效期,并做一次本机回环 TLS 握手确认二者匹配;通过后配置写入 ~/.config/dshare/cert.conf只记录文件路径,不复制私钥内容,所以用 Let's Encrypt 这类会定期续期的证书时无需重复导入)。
  2. 自签名证书:未导入证书时,用 openssl 命令在 ~/.cache/dshare/ 下生成 有效期 10 年的自签名证书(私钥权限 0600)。浏览器会提示证书不受信任,属预期行为。

要点:

  • 导入正式证书后不再调用 openssl,也就不存在「环境缺 openssl 导致无法共享」的问题; 此时浏览器与手机扫码都不会有证书告警(5080 引导页仍保留,作为兜底)。
  • 只支持不带密码的 PEM 私钥。常驻服务无法在启动时等人输密码,遇到加密私钥会提示 先用 openssl rsa -in <私钥> -out <新私钥> 去密码。
  • 证书过期或尚未生效时不会以它启动 HTTPS,也不会悄悄退回自签名或明文,而是弹出 选择框(见下)。距到期 30 天内会在状态栏提示剩余天数。
  • 更换/清除证书需要重启共享服务(SSL 配置在监听时就固定了),程序会自动重启。

环境无法启用 HTTPS 时(既没有可用证书、系统也没有 openssl,或 Qt 未启用 SSL), 启动后会弹框让你显式选择,绝不静默降级:

选项 行为
导入证书 打开证书选择框,成功后立即启动加密共享
明文共享 二次确认后改用 HTTP(任何人可访问),状态栏常驻红色警告
保持停止 本次不共享;状态栏显示未启动原因,可稍后导入证书或手动关闭授权开关

6. 访问授权(默认开启)

顶部「访问需授权」开关默认处于开启状态:

  • 任何未授权设备访问你的共享,你都会收到弹窗,显示请求方的 机器名与 IP,可选择「允许」或「拒绝」。
  • 超时(5 分钟)未处理视为拒绝;同时等待批准的请求上限为 64 条,超出会被限流, 避免恶意刷请求。
  • 对浏览器与桌面客户端均生效,授权过程对终端用户透明。
  • 开启授权时共享服务使用 HTTPS(加密) 以保护授权凭据,并在 5080 端口 提供明文引导页引导访客切换过来;关闭时则用明文 HTTP,5080 端口随之关闭。 协议随开关自动切换并重启服务。
  • 注意:授权记录只保存在内存中,重启程序后需要重新批准各设备。

7. 手机扫码访问当前目录

地址栏「机器」下拉框右侧显示本机当前共享目录对应的网页二维码:

  • 手机(需与本机在同一局域网)扫码,打开后浏览 / 下载文件。
  • 二维码地址随当前目录与「访问需授权」开关实时刷新:开启授权时指向明文引导页 http://<本机IP>:5080/?rel=...(先看到说明页,点「继续访问」进 HTTPS,全程无 证书弹窗打断),未开启授权时直接为 http://<本机IP>:5000/browse/...
  • 点击二维码 弹出大图预览,可长按/扫码,或用「复制地址」按钮把访问地址 复制到剪贴板,方便发给他人。
  • 进入远程浏览(选中其它设备)时,该二维码自动禁用,因为此时展示的是 对方的目录、而非本机共享。

协议 / 端口一览

用途 协议 端口 说明
Web 文件服务 HTTP(未授权)/ HTTPS(需授权,默认) 5000 协议随「访问需授权」开关自动切换
HTTPS 引导页 HTTP 5080 仅授权模式开启;只返回提示页,不含共享内容
局域网发现 UDP 多播 5001 组播组 239.255.42.99

配置文件:~/.config/dshare/cert.conf(HTTPS 证书路径,详见「HTTPS 证书」一节)。

上传侧限制(服务端强制):单片 ≤ 8 MiB,单文件 ≤ 8 GiB;续传分片的 offset 不得越过已有内容末尾(防止稀疏文件撑爆磁盘);同名文件必须显式 overwrite=1 才可覆盖。


目录结构

dshare/
├── main.cpp              # 程序入口,初始化 DApplication(DTK)
├── mainwindow.{h,cpp}    # 主窗口:本地浏览、拖拽、跨机传输、授权弹窗
├── fileserver.{h,cpp}    # 内嵌 HTTP/HTTPS 服务(浏览/下载/上传/授权)
├── discovery.{h,cpp}     # 局域网多播设备发现
├── remotemodel.{h,cpp}   # 远程共享目录只读模型(拖拽支持)
├── finddialog.{h,cpp}    # 「查找设备」对话框
├── authmanager.{h,cpp}   # 客户端侧授权握手管理
├── fileuploader.{h,cpp}  # 分片上传器与上传进度窗口
├── updirproxy.h          # 本地目录的「返回上一级」代理模型
├── certdialog.{h,cpp}    # HTTPS 证书导入对话框
├── dshare.desktop        # 桌面启动项
├── debian/               # deb 打包配置
├── linglong.yaml         # 如意玲珑(linyaps)构建描述
├── scripts/build-release.sh  # 一键产出 deb / layer / SHA256SUMS
├── translations/         # 中文本地化(zh_CN)
└── CMakeLists.txt        # 构建配置

License

本程序以 GNU General Public License v3 (GPL-3.0) 发布,详见仓库根目录的 LICENSE 文件。


DShare — English

DShare is a file-sharing application built with DTK (Deepin Tool Kit) specifically for the deepin desktop environment. It shares a local directory (~/myshare) over the LAN: a native DTK GUI for local file management plus a built-in HTTP/HTTPS server so other devices can browse, download, and upload files via a browser or another instance of this app.

Highlights

  • Native DTK6 GUI, consistent with the deepin / UOS v25 desktop look and feel.
  • Local management of ~/myshare (create folder, copy/paste, drag-drop, delete).
  • Built-in web server on port 5000. Access authorization is on by default: every device must be approved by the host, and the service then runs over HTTPS (self-signed cert). A plain-HTTP landing page on port 5080 explains this and offers a "Continue" button, so visitors are not stopped by a cert warning out of nowhere. Turning authorization off switches everything back to plain HTTP. Browse, download, upload, and create folders from any browser.
  • LAN peer discovery via multicast (UDP 5001, group 239.255.42.99), with machine-name regex matching.
  • Read-only remote browsing of other peers, with drag-to-download / drag-to-upload file transfer.
  • Upload hardening enforced server-side: ≤ 8 MiB per chunk, ≤ 8 GiB per file, chunk offset may not go past the existing end of file (no sparse-file disk exhaustion), and existing files are never overwritten silently — the uploader gets HTTP 409 and asks the user before retrying with overwrite=1.
  • HTTPS certificates: import your own certificate and private key (PEM) from the toolbar — the app validates format, validity dates and cert/key pairing via a loopback TLS handshake, then stores only the file paths in ~/.config/dshare/cert.conf. With a certificate configured, the openssl command is never needed. Without one, a self-signed certificate is generated. If HTTPS is impossible (no certificate, no openssl, or Qt built without SSL), a dialog asks you to choose explicitly — import a certificate, accept plain HTTP (with a permanent warning), or stay stopped. It never downgrades silently.

Release artifacts

Each release ships dshare_<version>_<arch>.deb, the linglong *_binary.layer, and a SHA256SUMS. Verify before installing:

sha256sum -c SHA256SUMS
sudo apt install ./dshare_1.0.1_amd64.deb
ll-cli install ./io.github.zhutianhao.dshare_1.0.1.0_x86_64_binary.layer

Artifacts are produced by scripts/build-release.sh (needs dpkg-dev and linglong-builder). Both tools build natively, so run it once per target architecture (amd64 / arm64 / loong64) and publish all outputs together.

CI: .github/workflows/release.yml builds amd64 + arm64 deb/layer and creates the GitHub Release on every v* tag. Since GitHub runners are Ubuntu (no DTK6 packages), everything is compiled inside the linglong container via linglong-builder from the official Ubuntu 24.04 repo. .github/workflows/ci.yml does the same build as a compile check on pushes/PRs. loong64 needs a self-hosted runner and is opt-in.

Build

mkdir build && cd build
cmake .. && make -j"$(nproc)"
./dshare

Requires CMake ≥ 3.13, Qt6 (Core/Widgets/Network/HttpServer), DTK6 (Core/Gui/Widget/Log), and — only for the self-signed fallback — the openssl command at runtime (skipped entirely once a certificate is imported).

Licensed under GPL-3.0.

About

DShare is a file-sharing application built with DTK (Deepin Tool Kit) specifically for the deepin desktop environment.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages