Skip to content

Commit a768258

Browse files
committed
Implement a dialog for setting new device PIN
1 parent a6679dd commit a768258

17 files changed

Lines changed: 600 additions & 96 deletions

File tree

credentialsd-common/src/client.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ pub trait FlowController {
2222
Output = Result<Pin<Box<dyn Stream<Item = BackgroundEvent> + Send + 'static>>, ()>,
2323
> + Send;
2424
fn enter_client_pin(&mut self, pin: String) -> impl Future<Output = Result<(), ()>> + Send;
25+
fn set_usb_device_pin(&mut self, pin: String) -> impl Future<Output = Result<(), ()>> + Send;
26+
fn set_nfc_device_pin(&mut self, pin: String) -> impl Future<Output = Result<(), ()>> + Send;
2527
fn select_credential(
2628
&self,
2729
credential_id: String,

credentialsd-common/src/model.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,20 @@ pub struct RequestingParty {
109109
pub origin: String,
110110
}
111111

112+
#[derive(Debug, Clone, Serialize, Deserialize)]
113+
pub enum ViewUpdateFailure {
114+
GeneralFailure(String),
115+
PinNotSet(String),
116+
}
117+
118+
impl ViewUpdateFailure {
119+
pub fn into_string(self) -> String {
120+
match self {
121+
ViewUpdateFailure::GeneralFailure(msg) | ViewUpdateFailure::PinNotSet(msg) => msg,
122+
}
123+
}
124+
}
125+
112126
#[derive(Debug, Clone, Serialize, Deserialize)]
113127
pub enum ViewUpdate {
114128
SetTitle((String, String)),
@@ -131,7 +145,7 @@ pub enum ViewUpdate {
131145

132146
Completed,
133147
Cancelled,
134-
Failed(String),
148+
Failed(ViewUpdateFailure),
135149
}
136150

137151
#[derive(Clone, Debug, Default)]

credentialsd-ui/data/resources/ui/window.ui

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,66 @@
208208
</object>
209209
</child>
210210

211+
<child>
212+
<object class="GtkStackPage">
213+
<property name="name">set_new_pin</property>
214+
<property name="title" translatable="yes">Set a PIN</property>
215+
<property name="child">
216+
<object class="GtkBox">
217+
<property name="orientation">vertical</property>
218+
219+
<child>
220+
<object class="GtkLabel">
221+
<property name="label" translatable="yes">Please choose a new PIN for your device.</property>
222+
<property name="wrap">true</property>
223+
</object>
224+
</child>
225+
226+
<child>
227+
<object class="GtkPasswordEntry" id="new_pin_primary_entry">
228+
<property name="placeholder-text" translatable="yes">New PIN</property>
229+
<signal name="changed" handler="handle_setting_pin_change" swapped="true"/>
230+
</object>
231+
</child>
232+
233+
<child>
234+
<object class="GtkPasswordEntry" id="new_pin_confirm_entry">
235+
<property name="placeholder-text" translatable="yes">Confirm PIN</property>
236+
<signal name="changed" handler="handle_setting_pin_change" swapped="true"/>
237+
</object>
238+
</child>
239+
240+
<child>
241+
<object class="GtkBox">
242+
<property name="halign">end</property>
243+
<property name="spacing">6</property>
244+
<child>
245+
<object class="GtkButton" id="new_pin_btn_close_window">
246+
<property name="label" translatable="yes">Close</property>
247+
<signal name="clicked" handler="handle_close_window" swapped="true"/>
248+
</object>
249+
</child>
250+
<child>
251+
<object class="GtkButton" id="new_pin_btn_continue">
252+
<property name="label" translatable="yes">Continue</property>
253+
<binding name="sensitive">
254+
<lookup name="pin_fields_match">
255+
<lookup name="view-model">CredentialsUiWindow</lookup>
256+
</lookup>
257+
</binding>
258+
<style>
259+
<class name="suggested-action"/>
260+
</style>
261+
<signal name="clicked" handler="handle_commit_new_pin" swapped="true"/>
262+
</object>
263+
</child>
264+
</object>
265+
</child>
266+
</object>
267+
</property>
268+
</object>
269+
</child>
270+
211271
<child>
212272
<object class="GtkStackPage">
213273
<property name="name">completed</property>
@@ -244,6 +304,31 @@
244304
<property name="label" translatable="yes">Something went wrong while retrieving a credential. Please try again later or use a different authenticator.</property>
245305
</object>
246306
</child>
307+
<child>
308+
<object class="GtkBox">
309+
<property name="halign">end</property>
310+
<property name="spacing">6</property>
311+
<binding name="visible">
312+
<lookup name="start_setting_new_pin_visible">
313+
<lookup name="view-model">
314+
CredentialsUiWindow
315+
</lookup>
316+
</lookup>
317+
</binding>
318+
<child>
319+
<object class="GtkButton" id="failed_close_window">
320+
<property name="label" translatable="yes">Close</property>
321+
<signal name="clicked" handler="handle_close_window" swapped="true"/>
322+
</object>
323+
</child>
324+
<child>
325+
<object class="GtkButton" id="start_setting_new_pin">
326+
<property name="label" translatable="yes">Set PIN on device</property>
327+
<signal name="clicked" handler="handle_start_setting_new_pin" swapped="true"/>
328+
</object>
329+
</child>
330+
</object>
331+
</child>
247332
</object>
248333
</property>
249334
</object>

credentialsd-ui/po/credentialsd-ui.pot

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ msgstr ""
99
"Project-Id-Version: credentialsd-ui\n"
1010
"Report-Msgid-Bugs-To: \"https://github.com/linux-credentials/credentialsd/"
1111
"issues\"\n"
12-
"POT-Creation-Date: 2026-02-03 10:40+0100\n"
12+
"POT-Creation-Date: 2026-02-11 14:31+0100\n"
1313
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1414
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1515
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -21,7 +21,7 @@ msgstr ""
2121

2222
#: data/xyz.iinuwa.credentialsd.CredentialsUi.desktop.in.in:2
2323
#: data/xyz.iinuwa.credentialsd.CredentialsUi.metainfo.xml.in.in:8
24-
#: src/gui/view_model/gtk/mod.rs:385
24+
#: src/gui/view_model/gtk/mod.rs:400
2525
msgid "Credential Manager"
2626
msgstr ""
2727

@@ -105,66 +105,95 @@ msgid "Choose credential"
105105
msgstr ""
106106

107107
#: data/resources/ui/window.ui:214
108+
msgid "Set a PIN"
109+
msgstr ""
110+
111+
#: data/resources/ui/window.ui:221
112+
msgid "Please choose a new PIN for your device."
113+
msgstr ""
114+
115+
#: data/resources/ui/window.ui:228
116+
msgid "New PIN"
117+
msgstr ""
118+
119+
#: data/resources/ui/window.ui:235
120+
msgid "Confirm PIN"
121+
msgstr ""
122+
123+
#: data/resources/ui/window.ui:246 data/resources/ui/window.ui:320
124+
msgid "Close"
125+
msgstr ""
126+
127+
#: data/resources/ui/window.ui:252
128+
msgid "Continue"
129+
msgstr ""
130+
131+
#: data/resources/ui/window.ui:274
108132
msgid "Complete"
109133
msgstr ""
110134

111-
#: data/resources/ui/window.ui:220
135+
#: data/resources/ui/window.ui:280
112136
msgid "Done!"
113137
msgstr ""
114138

115-
#: data/resources/ui/window.ui:231
139+
#: data/resources/ui/window.ui:291
116140
msgid "Something went wrong."
117141
msgstr ""
118142

119-
#: data/resources/ui/window.ui:244 src/gui/view_model/mod.rs:290
143+
#: data/resources/ui/window.ui:304 src/gui/view_model/mod.rs:310
144+
#: src/gui/view_model/mod.rs:370
120145
msgid ""
121146
"Something went wrong while retrieving a credential. Please try again later "
122147
"or use a different authenticator."
123148
msgstr ""
124149

125-
#: src/gui/view_model/gtk/mod.rs:147
150+
#: data/resources/ui/window.ui:326
151+
msgid "Set PIN on device"
152+
msgstr ""
153+
154+
#: src/gui/view_model/gtk/mod.rs:154
126155
msgid "Enter your PIN. One attempt remaining."
127156
msgid_plural "Enter your PIN. %d attempts remaining."
128157
msgstr[0] ""
129158
msgstr[1] ""
130159

131-
#: src/gui/view_model/gtk/mod.rs:153
160+
#: src/gui/view_model/gtk/mod.rs:160
132161
msgid "Enter your PIN."
133162
msgstr ""
134163

135-
#: src/gui/view_model/gtk/mod.rs:163
164+
#: src/gui/view_model/gtk/mod.rs:170
136165
msgid "Touch your device again. One attempt remaining."
137166
msgid_plural "Touch your device again. %d attempts remaining."
138167
msgstr[0] ""
139168
msgstr[1] ""
140169

141-
#: src/gui/view_model/gtk/mod.rs:169
170+
#: src/gui/view_model/gtk/mod.rs:176
142171
msgid "Touch your device."
143172
msgstr ""
144173

145-
#: src/gui/view_model/gtk/mod.rs:174
174+
#: src/gui/view_model/gtk/mod.rs:181
146175
msgid "Touch your device"
147176
msgstr ""
148177

149-
#: src/gui/view_model/gtk/mod.rs:177
178+
#: src/gui/view_model/gtk/mod.rs:184
150179
msgid "Scan the QR code with your device to begin authentication."
151180
msgstr ""
152181

153-
#: src/gui/view_model/gtk/mod.rs:187
182+
#: src/gui/view_model/gtk/mod.rs:194
154183
msgid ""
155184
"Connecting to your device. Make sure both devices are near each other and "
156185
"have Bluetooth enabled."
157186
msgstr ""
158187

159-
#: src/gui/view_model/gtk/mod.rs:195
188+
#: src/gui/view_model/gtk/mod.rs:202
160189
msgid "Device connected. Follow the instructions on your device"
161190
msgstr ""
162191

163-
#: src/gui/view_model/gtk/mod.rs:321
192+
#: src/gui/view_model/gtk/mod.rs:332
164193
msgid "Insert your security key."
165194
msgstr ""
166195

167-
#: src/gui/view_model/gtk/mod.rs:340
196+
#: src/gui/view_model/gtk/mod.rs:351
168197
msgid "Multiple devices found. Please select with which to proceed."
169198
msgstr ""
170199

@@ -226,30 +255,30 @@ msgid ""
226255
"to sign in to \"%s1\". Only proceed if you trust this process."
227256
msgstr ""
228257

229-
#: src/gui/view_model/mod.rs:227
258+
#: src/gui/view_model/mod.rs:244
230259
msgid "Failed to select credential from device."
231260
msgstr ""
232261

233-
#: src/gui/view_model/mod.rs:281
262+
#: src/gui/view_model/mod.rs:298 src/gui/view_model/mod.rs:358
234263
msgid "No matching credentials found on this authenticator."
235264
msgstr ""
236265

237-
#: src/gui/view_model/mod.rs:284
266+
#: src/gui/view_model/mod.rs:302 src/gui/view_model/mod.rs:362
238267
msgid ""
239268
"No more PIN attempts allowed. Try removing your device and plugging it back "
240269
"in."
241270
msgstr ""
242271

243-
#: src/gui/view_model/mod.rs:287
272+
#: src/gui/view_model/mod.rs:306 src/gui/view_model/mod.rs:366
244273
msgid ""
245274
"This server requires your device to have additional protection like a PIN, "
246275
"which is not set. Please set a PIN for this device and try again."
247276
msgstr ""
248277

249-
#: src/gui/view_model/mod.rs:293
278+
#: src/gui/view_model/mod.rs:315 src/gui/view_model/mod.rs:375
250279
msgid "This credential is already registered on this authenticator."
251280
msgstr ""
252281

253-
#: src/gui/view_model/mod.rs:395
282+
#: src/gui/view_model/mod.rs:424
254283
msgid "Something went wrong. Try again later or use a different authenticator."
255284
msgstr ""

0 commit comments

Comments
 (0)