SUMMARY | 问题概要
On this Deepin system, face enrollment always fails with device is claimed inside the authentication
framework. The root cause is a D-Bus interface incompatibility between deepin-authenticate
(2.0.33, commercial repo) and deepin-face (2.0.16, main repo): the framework expects the new
UOS driver interface (Claim(bool) method, Claimed property, StartEnroll(uuid, faceName),
GetShareMemInfo, ...), while the open-source driver exposes the old interface (Claim property,
EnrollStart(chara, charaType, actionId), anonymous file descriptor). As shipped in the official
repositories, the two components are not compatible with each other.
SOFTWARE/OS VERSIONS | 软件/系统版本信息
| Field | Value |
|---|---|
| OS | Deepin 25 (VERSION_CODENAME=crimson) |
| Kernel | 6.18.48-amd64-desktop-rolling |
| Architecture | amd64 |
| `deepin-authenticate` | 1:2.0.33 (repo `crimson/commercial`) |
| `deepin-face` | 2.0.16 (repo `crimson/main`) |
| Camera | Generic FULL HD 1080P Webcam (USB, ID 2ef4:4255), uvcvideo |
| Runtime | containerized environment (read-only root, persistent home) |
PRE-REQUIREMENT | 预置条件
No response
STEPS TO REPRODUCE | 复现步骤
- Open Settings → Biometrics → Face → Add face.
- The webcam LED turns on and immediately turns off; no preview image is shown.
- Enrollment fails; the framework returns:
Error org.deepin.dde.DBus.Error.Unnamed: device is claimed
org.deepin.dde.Authenticate1.Face.ServiceList stays empty (the driver is never registered).
OBSERVED RESULT | 观察到的结果
4.1 The camera works
lsusb: 2ef4:4255 Generic FULL HD 1080P Webcam
/sys/class/video4linux/video0 present, uvcvideo driver loaded.
- Real capture with ffmpeg (YUYV422 and MJPEG, 640x480 → 1920x1080): OK (valid JPEG files).
4.2 The deepin-face driver works when called directly
EnrollStart as root returns a file descriptor (unix socket): success.
Claim correctly goes from false to true and back to false after EnrollStop.
4.3 The framework does not register the driver
Face.ServiceList = "" (empty), FrameworkState = 1 (unavailable).
CharaManger.DriverInfo = [{"DriverName":"org.deepin.dde.Face1","CharaType":4}]
(the driver is known but not registered).
4.4 Live D-Bus capture during Face.StartEnroll
error ...: "'face' not exist"
error ...: "Property org.deepin.dde.Face1.Claimed was not found in object /org/deepin/dde/Face1"
error ...: "device is claimed"
After a local binary patch of the driver (Claim→Claimed) the sequence proceeds up to the missing method:
method call sender=:1.480 -> destination=org.deepin.dde.Face1 path=/org/deepin/dde/Face1
interface=org.deepin.dde.Face1; member=Claim
error "No such method 'Claim' in interface 'org.deepin.dde.Face1' (signature 'b')"
4.5 Driver log (/var/log/deepin-face.log)
QDBusConnection: couldn't handle call to Claim, no slot matched
Could not find slot DbusFaceService::Claim
EXPECTED RESULT | 期望的结果
No response
ADDITIONAL INFORMATION | 额外补充
The framework uses Deepin's go-dbus-factory. The expected driver interface is defined in
go-dbus-factory/system/org.deepin.dde.authenticate1.face/Face.xml
(https://github.com/linuxdeepin/go-dbus-factory/blob/master/system/org.deepin.dde.authenticate1.face/Face.xml):
<interface name="org.deepin.dde.Authenticate1.Face.Device">
<method name="Claim"><arg name="claimed" type="b" direction="in"/></method>
<method name="StartEnroll"><arg name="uuid" type="s"/><arg name="faceName" type="s"/></method>
<method name="StopEnroll"/>
<method name="GetShareMemInfo">...sockPath, key, size...</method>
<method name="SetDefaultDevice"/><method name="ListFaces"/><method name="RenameFace"/>...
<property name="Claimed" type="b" access="read"/>
<property name="SupportedDevices"/><property name="Capability"/><property name="Status"/>...
</interface>
The actual interface of the installed driver (deepin-face 2.0.16, source:
https://github.com/linuxdeepin/deepin-face/blob/master/dbusfaceservice.h):
Q_PROPERTY(bool Claim READ getClaim)
Q_PROPERTY(QStringList List READ getList)
Q_PROPERTY(qint32 CharaType READ getCharaType)
Q_SLOTS: EnrollStart(chara, charaType, actionId), EnrollStop, VerifyStart, VerifyStop, Delete
| Member expected by framework |
Driver 2.0.16 |
Result |
Method Claim(bool) |
absent (only Claim property) |
❌ registration fails |
Property Claimed |
absent (Claim instead) |
❌ (added via local patch) |
StartEnroll(uuid, faceName) |
EnrollStart(chara, charaType, actionId) |
❌ different signature |
GetShareMemInfo() → sockPath/key/size |
absent (returns anonymous fd) |
❌ different frame protocol |
SetDefaultDevice/ListFaces/RenameFace/... |
absent |
❌ |
The commercial UOS driver (never present in the main repo) implements the new interface;
the open-source deepin-face does not. The official Deepin 25 repositories ship a commercial
framework together with an incompatible open-source driver.
6. Secondary issue (preview)
The camera preview (Qt Multimedia, FFmpeg backend) produces no frames inside the container:
QImage::scaled: Image is a null image in the driver log, LED on/off, while the ffmpeg CLI
captures normally. To be investigated separately (possibly selection of the metadata node
/dev/video1 or format negotiation).
7. Reproduction
dbus-send --system --print-reply --dest=org.deepin.dde.Authenticate1 /org/deepin/dde/Authenticate1/Face org.deepin.dde.Authenticate1.Face.StartEnroll string:Domenico string:org.deepin.dde.Face1 string:test
→ Error org.deepin.dde.DBus.Error.Unnamed: device is claimed
dbus-send --system --print-reply --dest=org.deepin.dde.Authenticate1 /org/deepin/dde/Authenticate1/Face org.freedesktop.DBus.Properties.Get string:org.deepin.dde.Authenticate1.Face string:ServiceList
→ empty.
8. Proposed fixes (for Deepin)
- Ship a face driver in the official repos that is compatible with the commercial framework
(new interface: Claim/Claimed/StartEnroll/GetShareMemInfo), or
- Downgrade
deepin-authenticate to a version compatible with deepin-face 2.0.16, or
- Document the incompatibility and prevent the cross-installation of these packages.
9. Workarounds applied locally (diagnostic only)
- Binary patch of the driver: property
Claim → Claimed (first step of the expected contract).
Restart=on-failure on the deepin-face service (avoids crash at boot).
DefaultService=org.deepin.dde.Face1 persisted.
None of these unblocks enrollment because the missing members cannot be added to a compiled binary.
SUMMARY | 问题概要
On this Deepin system, face enrollment always fails with
device is claimedinside the authenticationframework. The root cause is a D-Bus interface incompatibility between
deepin-authenticate(2.0.33, commercial repo) and
deepin-face(2.0.16, main repo): the framework expects the newUOS driver interface (
Claim(bool)method,Claimedproperty,StartEnroll(uuid, faceName),GetShareMemInfo, ...), while the open-source driver exposes the old interface (Claimproperty,EnrollStart(chara, charaType, actionId), anonymous file descriptor). As shipped in the officialrepositories, the two components are not compatible with each other.
SOFTWARE/OS VERSIONS | 软件/系统版本信息
PRE-REQUIREMENT | 预置条件
No response
STEPS TO REPRODUCE | 复现步骤
Error org.deepin.dde.DBus.Error.Unnamed: device is claimedorg.deepin.dde.Authenticate1.Face.ServiceListstays empty (the driver is never registered).OBSERVED RESULT | 观察到的结果
4.1 The camera works
lsusb:2ef4:4255 Generic FULL HD 1080P Webcam/sys/class/video4linux/video0present,uvcvideodriver loaded.4.2 The
deepin-facedriver works when called directlyEnrollStartas root returns a file descriptor (unix socket): success.Claimcorrectly goes fromfalsetotrueand back tofalseafterEnrollStop.4.3 The framework does not register the driver
Face.ServiceList=""(empty),FrameworkState=1(unavailable).CharaManger.DriverInfo=[{"DriverName":"org.deepin.dde.Face1","CharaType":4}](the driver is known but not registered).
4.4 Live D-Bus capture during
Face.StartEnrollAfter a local binary patch of the driver (Claim→Claimed) the sequence proceeds up to the missing method:
4.5 Driver log (
/var/log/deepin-face.log)EXPECTED RESULT | 期望的结果
No response
ADDITIONAL INFORMATION | 额外补充
The framework uses Deepin's
go-dbus-factory. The expected driver interface is defined ingo-dbus-factory/system/org.deepin.dde.authenticate1.face/Face.xml(https://github.com/linuxdeepin/go-dbus-factory/blob/master/system/org.deepin.dde.authenticate1.face/Face.xml):
The actual interface of the installed driver (
deepin-face2.0.16, source:https://github.com/linuxdeepin/deepin-face/blob/master/dbusfaceservice.h):
Claim(bool)Claimproperty)ClaimedClaiminstead)StartEnroll(uuid, faceName)EnrollStart(chara, charaType, actionId)GetShareMemInfo() → sockPath/key/sizeSetDefaultDevice/ListFaces/RenameFace/...The commercial UOS driver (never present in the main repo) implements the new interface;
the open-source
deepin-facedoes not. The official Deepin 25 repositories ship a commercialframework together with an incompatible open-source driver.
6. Secondary issue (preview)
The camera preview (Qt Multimedia, FFmpeg backend) produces no frames inside the container:
QImage::scaled: Image is a null imagein the driver log, LED on/off, while the ffmpeg CLIcaptures normally. To be investigated separately (possibly selection of the metadata node
/dev/video1or format negotiation).7. Reproduction
dbus-send --system --print-reply --dest=org.deepin.dde.Authenticate1 /org/deepin/dde/Authenticate1/Face org.deepin.dde.Authenticate1.Face.StartEnroll string:Domenico string:org.deepin.dde.Face1 string:test→
Error org.deepin.dde.DBus.Error.Unnamed: device is claimeddbus-send --system --print-reply --dest=org.deepin.dde.Authenticate1 /org/deepin/dde/Authenticate1/Face org.freedesktop.DBus.Properties.Get string:org.deepin.dde.Authenticate1.Face string:ServiceList→ empty.
8. Proposed fixes (for Deepin)
(new interface:
Claim/Claimed/StartEnroll/GetShareMemInfo), ordeepin-authenticateto a version compatible withdeepin-face2.0.16, or9. Workarounds applied locally (diagnostic only)
Claim→Claimed(first step of the expected contract).Restart=on-failureon thedeepin-faceservice (avoids crash at boot).DefaultService=org.deepin.dde.Face1persisted.None of these unblocks enrollment because the missing members cannot be added to a compiled binary.