diff --git a/CHANGES b/CHANGES
index 5ade0ba1b..374fa320c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,39 @@ contributors are listed. Note that Calamares does not have a historical
changelog -- this log starts with version 3.2.0. The release notes on the
website will have to do for older versions.
+# 3.2.17 (unreleased) #
+
+This release contains contributions from (alphabetically by first name):
+ - No external contributions.
+
+## Core ##
+ - No changes to core functionality
+
+## Modules ##
+ - No changes to module functionality
+
+
+# 3.2.16 (2019-11-01) #
+
+This release contains contributions from (alphabetically by first name):
+ - Bill Auger
+
+## Core ##
+ - Some obscure build scenarios which would lead to bogus module-is-
+ misconfigured messages on startup have been resolved.
+
+## Modules ##
+ - The explanatory messages on the *users* page have moved to tooltips,
+ and placeholder text has been added to the fields. #1202
+ - The bad-password messages in the *users* page have been improved. #1261
+ - Password-checking in the *users* module has been substantially
+ changed. A new key *allowWeakPasswords* can be used to introduce
+ an additional checkbox to the page, which can then be used to
+ switch off strict password checking. (Thanks to Bill Auger)
+ - The icons used in password warnings on the *users* page have been
+ changed to the colorful status icons (rather than the thin red X).
+
+
# 3.2.15 (2019-10-11) #
This release contains contributions from (alphabetically by first name):
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9d61ebbc5..2d1cb83f0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,10 +40,10 @@
cmake_minimum_required( VERSION 3.3 FATAL_ERROR )
project( CALAMARES
- VERSION 3.2.15
+ VERSION 3.2.17
LANGUAGES C CXX )
-set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development
+set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development
### OPTIONS
#
diff --git a/lang/calamares_fr.ts b/lang/calamares_fr.ts
index 47fd4fd9f..472e81f8d 100644
--- a/lang/calamares_fr.ts
+++ b/lang/calamares_fr.ts
@@ -3253,7 +3253,7 @@ Sortie
-
+ Ouvrir le site des notes de publication
diff --git a/lang/calamares_it_IT.ts b/lang/calamares_it_IT.ts
index 1d860c7d0..136d33c3e 100644
--- a/lang/calamares_it_IT.ts
+++ b/lang/calamares_it_IT.ts
@@ -99,7 +99,7 @@
-
+ Ricarica il foglio di stile
@@ -210,7 +210,7 @@
-
+ In attesa del(i) modulo(i) %n.In attesa del(i) modulo(i) %n.
@@ -258,7 +258,7 @@
-
+ Vuoi incollare il log di installazione nel web?
@@ -1148,7 +1148,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ <html><head/><body><p>Quando questa casella è selezionata, il tuo computer verrà riavviato immediatamente quando clicchi su <span style="font-style:italic;">Finito</span> oppure chiudi il programma di setup.</p></body></html>
@@ -1163,7 +1163,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ <h1>Installazione fallita</h1><br/>%1 non è stato installato sul tuo computer.<br/>Il messaggio di errore è: %2.
@@ -1204,12 +1204,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ Formatta la partitione %1 (file system: %2, dimensione: %3 MiB) su %4.
-
+ Formatta la partizione <strong>%1</strong> di dimensione <strong>%3MiB </strong> con il file system <strong>%2</strong>.
@@ -1298,17 +1298,17 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ Impossibile creare le cartelle <code>%1</code>.
-
+ Impossibile aprire il file <code>%1</code>.
-
+ Impossibile scrivere sul file <code>%1</code>.
@@ -1316,7 +1316,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ Sto creando initramfs con mkinitcpio.
@@ -1324,7 +1324,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ Sto creando initramfs.
@@ -1475,32 +1475,32 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ Mostra il testo completo della licenza
-
+ Nascondi il testo della licenza
-
+ Mostra l'accordo di licenza
-
+ Nascondi l'accordo di licenza
-
+ Apre l'accordo di licenza in una finestra del browser.
-
+ <a href="%1">Visualizza l'accordo di licenza</a>
@@ -1556,7 +1556,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno
-
+ Non è stata specificata alcuna partizione.
@@ -2462,7 +2462,7 @@ Output:
-
+ Non è stata fornita alcuna descrizione.
@@ -2564,7 +2564,7 @@ Output:
-
+ Operazione di ridimensionamento del Filesystem
@@ -2574,7 +2574,7 @@ Output:
-
+ L'operazione di ridimensionamento del file-system ha una configurazione non valida e non verrà effettuata.
@@ -2622,12 +2622,12 @@ Output:
-
+ Il filesystem %1 deve essere ridimensionato, ma non è possibile farlo.
-
+ Il dispositivo %1 deve essere ridimensionato, non è possibile farlo
@@ -2645,7 +2645,7 @@ Output:
-
+ Sto ridimensionando la partizione %1 di dimensione %2MiB a %3MiB.
@@ -2667,12 +2667,12 @@ Output:
-
+ Ridimensiona il gruppo di volumi con nome %1 da %2 a %3.
-
+ Ridimensiona il gruppo di volumi con nome <strong>%1</strong> da <strong>%2</strong> a <strong>%3</strong>.
@@ -2685,7 +2685,7 @@ Output:
-
+ Questo computer non soddisfa i requisiti minimi per l'installazione di %1.<br/>L'installazione non può continuare. <a href="#details">Dettagli...</a>
@@ -2695,7 +2695,7 @@ Output:
-
+ Questo computer non soddisfa alcuni requisiti raccomandati per l'installazione di %1.<br/>L'installazione può continuare, ma alcune funzionalità potrebbero essere disabilitate.
@@ -3230,17 +3230,17 @@ Output:
-
+ Apri il sito web per le donazioni
-
+ &Donazioni
-
+ Apri il sito web per l'aiuto ed il supporto
@@ -3250,7 +3250,7 @@ Output:
-
+ Apri il sito web delle note di rilascio
@@ -3285,12 +3285,12 @@ Output:
-
+ <h1>Benvenuto nel programma di installazione Calamares di %1.</h1>
-
+ <h1>Benvenuto nell'installazione di %1.</h1>
diff --git a/lang/calamares_ja.ts b/lang/calamares_ja.ts
index 58d127397..29dec7ca4 100644
--- a/lang/calamares_ja.ts
+++ b/lang/calamares_ja.ts
@@ -1165,7 +1165,7 @@ The installer will quit and all changes will be lost.
- <h1>セットアップに失敗しました。</h1><br/>%1 はコンピュータにセットアップされていません。<br/>エラーメッセージは次のとおりです: %2
+ <h1>セットアップに失敗しました。</h1><br/>%1 はコンピュータにセットアップされていません。<br/>エラーメッセージ: %2
diff --git a/lang/calamares_ml.ts b/lang/calamares_ml.ts
index c26f8f28d..7941eaaa2 100644
--- a/lang/calamares_ml.ts
+++ b/lang/calamares_ml.ts
@@ -135,7 +135,7 @@
-
+ പ്രോഗ്രാം ചെയ്യപ്പെട്ട ജോലിയുടെ പരാജയം പ്രത്യേകമായി ആവശ്യപ്പെട്ടിരുന്നു.
@@ -648,12 +648,12 @@ The installer will quit and all changes will be lost.
-
+ കമാൻഡ് ഹോസ്റ്റ് എൻവയോൺമെന്റിൽ പ്രവർത്തിക്കുന്നു, റൂട്ട് പാത്ത് അറിയേണ്ടതുണ്ട്, പക്ഷേ rootMountPoint നിർവചിച്ചിട്ടില്ല.
-
+ കമാൻഡിന് ഉപയോക്താവിന്റെ പേര് അറിയേണ്ടതുണ്ട്,എന്നാൽ ഉപയോക്തൃനാമമൊന്നും നിർവചിച്ചിട്ടില്ല.
@@ -661,7 +661,7 @@ The installer will quit and all changes will be lost.
-
+ സാന്ദർഭിക പ്രക്രിയകൾ ജോലി
@@ -932,7 +932,7 @@ The installer will quit and all changes will be lost.
-
+ തിരഞ്ഞെടുത്ത സ്റ്റോറേജ് ഉപകരണത്തിലെ <strong>പാർട്ടീഷൻ ടേബിളിന്റെ</strong>തരം.<br><br>പാർട്ടീഷൻ ടേബിൾ തരം മാറ്റാനുള്ള ഒരേയൊരു മാർഗ്ഗം പാർട്ടീഷൻ ടേബിൾ ആദ്യം മുതൽ മായ്ച്ചുകളയുക എന്നതാണ്,ഇത് സംഭരണ ഉപകരണത്തിലെ എല്ലാ ഡാറ്റയും നശിപ്പിക്കുന്നു.<br>നിങ്ങൾ വ്യക്തമായി തിരഞ്ഞെടുത്തിട്ടില്ലെങ്കിൽ ഈ ഇൻസ്റ്റാളർ നിലവിലെ പാർട്ടീഷൻ ടേബിൾ സൂക്ഷിക്കും.<br>ഉറപ്പില്ലെങ്കിൽ, ആധുനിക സിസ്റ്റങ്ങളിൽ ജിപിടിയാണ് ശുപാർശ ചെയ്യുന്നത്.
@@ -942,7 +942,7 @@ The installer will quit and all changes will be lost.
-
+ ഇതൊരു <strong>ലൂപ്പ്</strong> ഉപകരണമാണ്.<br><br>ഒരു ഫയലിന്റെ ഒരു ബ്ലോക്ക് ഉപകരണമാക്കി ലഭ്യമാക്കുന്ന പാർട്ടീഷൻ ടേബിളില്ലാത്ത ഒരു കൃത്രിമ-ഉപകരണമാണിത്. ഇത്തരത്തിലുള്ള ക്രമീകരണത്തിൽ സാധാരണ ഒരൊറ്റ ഫയൽ സിസ്റ്റം മാത്രമേ കാണൂ.
@@ -1344,7 +1344,7 @@ The installer will quit and all changes will be lost.
-
+ സ്ക്രിപ്റ്റ് നിർവ്വഹിക്കുന്നു: <code>%1</code>
@@ -1386,7 +1386,7 @@ The installer will quit and all changes will be lost.
-
+ സിസ്റ്റം ലൊക്കേൽ ഭാഷയും, കമാൻഡ് ലൈൻ സമ്പർക്കമുഖഘടകങ്ങളുടെ അക്ഷരക്കൂട്ടങ്ങളേയും സ്വാധീനിക്കും. <br/>നിലവിലുള്ള ക്രമീകരണം <strong>%1</strong> ആണ്.
@@ -1414,22 +1414,22 @@ The installer will quit and all changes will be lost.
-
+ <h1>ലൈസൻസ് ഉടമ്പടി</h1>ഈ സജ്ജീകരണ നടപടിക്രമം ലൈസൻസിംഗ് നിബന്ധനകൾക്ക് വിധേയമായ കുത്തക സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്യും.
-
+ മുകളിലുള്ള അന്തിമ ഉപയോക്തൃ ലൈസൻസ് കരാറുകൾ (EULAs) അവലോകനം ചെയ്യുക.<br/>നിങ്ങൾ നിബന്ധനകളോട് യോജിക്കുന്നില്ലെങ്കിൽ, സജ്ജീകരണ നടപടിക്രമം തുടരാനാവില്ല.
-
+ <h1>ലൈസൻസ് ഉടമ്പടി</h1>അധിക സവിശേഷതകൾ നൽകുന്നതിനും ഉപയോക്തൃ അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനും ഈ സജ്ജീകരണ നടപടിക്രമത്തിന് ലൈസൻസിംഗ് നിബന്ധനകൾക്ക് വിധേയമായ കുത്തക സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയും.
-
+ മുകളിലുള്ള അന്തിമ ഉപയോക്തൃ ലൈസൻസ് കരാറുകൾ (EULAs) അവലോകനം ചെയ്യുക.<br/>നിങ്ങൾ നിബന്ധനകളോട് യോജിക്കുന്നില്ലെങ്കിൽ, പ്രൊപ്രൈറ്ററി സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്യില്ല, പകരം ഓപ്പൺ സോഴ്സ് ഇതരമാർഗങ്ങൾ ഉപയോഗിക്കും.
@@ -1452,27 +1452,27 @@ The installer will quit and all changes will be lost.
%1 is usually a vendor name, example: Nvidia graphics driver
-
+ <strong>%1 ഗ്രാഫിക്സ് ഡ്രൈവർ</strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1 ബ്രൌസർ പ്ലഗിൻ</strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1 കോഡെക് </strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1 പാക്കേജ് </strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1</strong><br/><font color="Grey">by %2</font>
@@ -1624,7 +1624,7 @@ The installer will quit and all changes will be lost.
-
+ കൂട്ടം (&t):
@@ -1634,7 +1634,7 @@ The installer will quit and all changes will be lost.
-
+ <html><head/><body><h1>OEM ക്രമീകരണം</h1><p>കലാമരേസ് ലക്ഷ്യ സിസ്റ്റം ക്രമീകരിക്കുമ്പോൾ OEM ക്രമീകരണങ്ങൾ ഉപയോഗിക്കും.</p></body></html>
@@ -1647,7 +1647,7 @@ The installer will quit and all changes will be lost.
-
+ OEM ബാച്ച് ഐഡന്റിഫയർ <code>%1</code> ആയി ക്രമീകരിക്കുക.
@@ -1770,7 +1770,7 @@ The installer will quit and all changes will be lost.
-
+ പാസ്വേഡിൽ പ്രതീക ക്ലാസുകൾ %1 ൽ കുറവാണ്
@@ -1800,12 +1800,12 @@ The installer will quit and all changes will be lost.
-
+ പാസ്വേഡിൽ %1 പ്രതീകങ്ങളേക്കാൾ ദൈർഘ്യമുള്ള മോണോടോണിക് ശ്രേണി അടങ്ങിയിരിക്കുന്നു
-
+ പാസ്വേഡിൽ വളരെ ദൈർഘ്യമുള്ള ഒരു മോണോടോണിക് പ്രതീക ശ്രേണിയുണ്ട്
@@ -1845,7 +1845,7 @@ The installer will quit and all changes will be lost.
-
+ ക്രമീകരണത്തിന്റെ ശരിയല്ലാത്ത സംഖ്യാമൂല്യം - %1
@@ -1987,7 +1987,7 @@ The installer will quit and all changes will be lost.
-
+ <small>നിങ്ങൾ ഒരു നെറ്റ്വർക്കിൽ കമ്പ്യൂട്ടർ മറ്റുള്ളവർക്ക് ദൃശ്യമാക്കുകയാണെങ്കിൽ ഈ പേര് ഉപയോഗിക്കും.</small>
@@ -2007,7 +2007,7 @@ The installer will quit and all changes will be lost.
-
+ <small>ഒരേ പാസ്വേഡ് രണ്ടുതവണ നൽകുക, അതുവഴി ടൈപ്പിംഗ് പിശകുകൾ പരിശോധിക്കാൻ കഴിയും.</small>
@@ -2164,7 +2164,7 @@ The installer will quit and all changes will be lost.
-
+ %1 ലെ പാർട്ടീഷൻ പട്ടികയിൽ ഇതിനകം %2 പ്രാഥമിക പാർട്ടീഷനുകൾ ഉണ്ട്,ഇനി ഒന്നും ചേർക്കാൻ കഴിയില്ല. പകരം ഒരു പ്രാഥമിക പാർട്ടീഷൻ നീക്കംചെയ്ത് എക്സ്ടെൻഡഡ് പാർട്ടീഷൻ ചേർക്കുക.
@@ -2182,7 +2182,7 @@ The installer will quit and all changes will be lost.
-
+ മറ്റൊരു ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിനൊപ്പം %1 ഇൻസ്റ്റാൾ ചെയ്യുക.
@@ -2197,12 +2197,12 @@ The installer will quit and all changes will be lost.
-
+ <strong>സ്വമേധയാ</strong> ഉള്ള പാർട്ടീഷനിങ്.
-
+ %2 (%3) ഡിസ്കിൽ മറ്റൊരു ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിനൊപ്പം %1 ഇൻസ്റ്റാൾ ചെയ്യുക.
@@ -2262,7 +2262,7 @@ The installer will quit and all changes will be lost.
-
+ എൻക്രിപ്റ്റ് ചെയ്ത ഒരു റൂട്ട് പാർട്ടീഷനോടൊപ്പം ഒരു വേർപെടുത്തിയ ബൂട്ട് പാർട്ടീഷനും ക്രമീകരിക്കപ്പെട്ടിരുന്നു, എന്നാൽ ബൂട്ട് പാർട്ടീഷൻ എൻക്രിപ്റ്റ് ചെയ്യപ്പെട്ടതല്ല.<br/><br/>ഇത്തരം സജ്ജീകരണത്തിന്റെ സുരക്ഷ ഉത്കണ്ഠാജനകമാണ്, എന്തെന്നാൽ പ്രധാനപ്പെട്ട സിസ്റ്റം ഫയലുകൾ ഒരു എൻക്രിപ്റ്റ് ചെയ്യപ്പെടാത്ത പാർട്ടീഷനിലാണ് സൂക്ഷിച്ചിട്ടുള്ളത്.<br/> താങ്കൾക്ക് വേണമെങ്കിൽ തുടരാം, പക്ഷേ ഫയൽ സിസ്റ്റം തുറക്കൽ സിസ്റ്റം ആരംഭപ്രക്രിയയിൽ വൈകിയേ സംഭവിക്കൂ.<br/>ബൂട്ട് പാർട്ടീഷൻ എൻക്രിപ്റ്റ് ചെയ്യാനായി, തിരിച്ചു പോയി പാർട്ടീഷൻ നിർമ്മാണ ജാലകത്തിൽ <strong>എൻക്രിപ്റ്റ്</strong> തിരഞ്ഞെടുത്തുകൊണ്ട് അത് വീണ്ടും നിർമ്മിക്കുക.
@@ -2280,13 +2280,13 @@ The installer will quit and all changes will be lost.
-
+ പ്ലാസ്മ കെട്ടും മട്ടും ജോലി
-
+ കെഡിഇ പ്ലാസ്മ കെട്ടും മട്ടും പാക്കേജ് തിരഞ്ഞെടുക്കാനായില്ല
@@ -2299,12 +2299,12 @@ The installer will quit and all changes will be lost.
-
+ കെഡിഇ പ്ലാസ്മ ഡെസ്ക്ടോപ്പിനായി ഒരു കെട്ടും മട്ടും തിരഞ്ഞെടുക്കുക.നിങ്ങൾക്ക് ഈ ഘട്ടം ഇപ്പോൾ ഒഴിവാക്കി സിസ്റ്റം ഇൻസ്റ്റാൾ ചെയ്തതിനു ശേഷവും കെട്ടും മട്ടും ക്രമീരകരിക്കാൻ കഴിയും.ഒരു കെട്ടും മട്ടും തിരഞ്ഞെടുക്കലിൽ ക്ലിക്കുചെയ്യുന്നത് ആ കെട്ടും മട്ടിന്റെയും തത്സമയ പ്രിവ്യൂ നൽകും.
-
+ കെഡിഇ പ്ലാസ്മ ഡെസ്ക്ടോപ്പിനായി ഒരു കെട്ടും മട്ടും തിരഞ്ഞെടുക്കുക.നിങ്ങൾക്ക് ഈ ഘട്ടം ഇപ്പോൾ ഒഴിവാക്കി സിസ്റ്റം ഇൻസ്റ്റാൾ ചെയ്തതിനു ശേഷവും കെട്ടും മട്ടും ക്രമീരകരിക്കാൻ കഴിയും
@@ -2312,7 +2312,7 @@ The installer will quit and all changes will be lost.
-
+ കെട്ടും മട്ടും
@@ -2354,7 +2354,7 @@ Output:
-
+ ബാഹ്യമായ ആജ്ഞ തകർന്നു.
@@ -2364,12 +2364,12 @@ Output:
-
+ ബാഹ്യമായ ആജ്ഞ ആരംഭിക്കുന്നതിൽ പരാജയപ്പെട്ടു.
-
+ <i>%1</i>ആജ്ഞ ആരംഭിക്കുന്നതിൽ പരാജയപ്പെട്ടു.
@@ -2379,27 +2379,27 @@ Output:
-
+ പ്രക്രിയ ജോലി വിളിയ്ക്ക് ശരിയല്ലാത്ത പരാമീറ്ററുകൾ.
-
+ ബാഹ്യമായ ആജ്ഞ പൂർത്തിയാവുന്നതിൽ പരാജയപ്പെട്ടു.
-
+ ആജ്ഞ <i>%1</i> %2 സെക്കൻഡുകൾക്കുള്ളിൽ പൂർത്തിയാവുന്നതിൽ പരാജയപ്പെട്ടു.
-
+ ബാഹ്യമായ ആജ്ഞ പിഴവുകളോട് കൂടീ പൂർത്തിയായി.
-
+ ആജ്ഞ <i>%1</i> എക്സിറ്റ് കോഡ് %2ഓട് കൂടി പൂർത്തിയായി.
@@ -2423,7 +2423,7 @@ Output:
-
+ വിസ്തൃതമായത്
@@ -2566,7 +2566,7 @@ Output:
-
+ ഫയൽ സിസ്റ്റത്തിന്റെ വലുപ്പം മാറ്റുന്ന ജോലി
@@ -2576,19 +2576,19 @@ Output:
-
+ ഫയൽ സിസ്റ്റം വലുപ്പം മാറ്റുന്ന ജോലിയിൽ അസാധുവായ ക്രമീകരണം ഉണ്ട്, അത് പ്രവർത്തിക്കില്ല.
-
+ KPMCore ലഭ്യമല്ല
-
+ ഫയൽ സിസ്റ്റം വലുപ്പം മാറ്റുന്നതിനുള്ള ജോലിക്കായി കാലാമറസിന് KPMCore ആരംഭിക്കാൻ കഴിയില്ല.
@@ -2597,39 +2597,39 @@ Output:
-
+ വലുപ്പം മാറ്റുന്നത് പരാജയപ്പെട്ടു
-
+ ഫയൽ സിസ്റ്റം %1 ഈ സിസ്റ്റത്തിൽ കണ്ടെത്താനായില്ല, അതിനാൽ അതിന്റെ വലുപ്പം മാറ്റാനാവില്ല.
-
+ ഉപകരണം %1 ഈ സിസ്റ്റത്തിൽ കണ്ടെത്താനായില്ല, അതിനാൽ അതിന്റെ വലുപ്പം മാറ്റാനാവില്ല.
-
+ %1 എന്ന ഫയൽസിസ്റ്റത്തിന്റെ വലുപ്പം മാറ്റാൻ കഴിയില്ല.
-
+ %1 ഉപകരണത്തിന്റെ വലുപ്പം മാറ്റാൻ കഴിയില്ല.
-
+ %1 എന്ന ഫയൽസിസ്റ്റത്തിന്റെ വലുപ്പം മാറ്റണം, പക്ഷേ കഴിയില്ല.
-
+ %1 ഉപകരണത്തിന്റെ വലുപ്പം മാറ്റണം, പക്ഷേ കഴിയില്ല
@@ -2637,22 +2637,22 @@ Output:
-
+ %1 പാർട്ടീഷന്റെ വലുപ്പം മാറ്റുക.
-
+ <strong>%1</strong> എന്ന <strong>%2MiB</strong> പാർട്ടീഷന്റെ വലുപ്പം <strong>%3Mib</strong>യിലേക്ക് മാറ്റുക.
-
+ %1 എന്ന %2MiB പാർട്ടീഷന്റെ വലുപ്പം %3Mibയിലേക്ക് മാറ്റുന്നു.
-
+ '%2' ഡിസ്കിലുള്ള %1 പാർട്ടീഷന്റെ വലുപ്പം മാറ്റുന്നതിൽ ഇൻസ്റ്റാളർ പരാജയപ്പെട്ടു
@@ -2669,17 +2669,17 @@ Output:
-
+ %1 എന്ന് പേരുള്ള വോള്യം ഗ്രൂപ്പിന്റെ വലുപ്പം %2ൽ നിന്നും %3ലേക്ക് മാറ്റുക.
-
+ <strong>%1</strong> എന്ന് പേരുള്ള വോള്യം ഗ്രൂപ്പിന്റെ വലുപ്പം <strong>%2</strong>ൽ നിന്നും <strong>%3</strong>ലേക്ക് മാറ്റുക.
-
+ '%1' എന്ന് പേരുള്ള ഒരു വോള്യം ഗ്രൂപ്പിന്റെ വലുപ്പം മാറ്റുന്നതിൽ ഇൻസ്റ്റാളർ പരാജയപ്പെട്ടു.
@@ -2712,7 +2712,7 @@ Output:
-
+ മികച്ച ഫലങ്ങൾക്കായി ഈ കമ്പ്യൂട്ടർ താഴെപ്പറയുന്നവ നിറവേറ്റുന്നു എന്നുറപ്പുവരുത്തുക:
@@ -2760,7 +2760,7 @@ Output:
-
+ ടാർഗെറ്റ് സിസ്റ്റത്തിലേക്ക് ഹോസ്റ്റ്നാമം എഴുതാൻ കഴിയില്ല
@@ -2768,12 +2768,12 @@ Output:
-
+ കീബോർഡ് മാതൃക %1 ആയി ക്രമീകരിക്കുക, രൂപരേഖ %2-%3
-
+ വിർച്വൽ കൺസോളിനായുള്ള കീബോർഡ് ക്രമീകരണം എഴുതുന്നതിൽ പരാജയപ്പെട്ടു.
@@ -2785,12 +2785,12 @@ Output:
-
+ X11 നായി കീബോർഡ് കോൺഫിഗറേഷൻ എഴുതുന്നതിൽ പരാജയപ്പെട്ടു.
-
+ നിലവിലുള്ള /etc/default ഡയറക്ടറിയിലേക്ക് കീബോർഡ് കോൺഫിഗറേഷൻ എഴുതുന്നതിൽ പരാജയപ്പെട്ടു.
@@ -2823,17 +2823,17 @@ Output:
-
+ %1MiB <strong>%2</strong> പാർട്ടീഷൻ <strong>%3</strong> ആയി ഫ്ലാഗ് ചെയ്യുക.
-
+ ഫ്ലാഗുകൾ %1MiB <strong>%2</strong> പാർട്ടീഷനിൽ നിർമ്മിക്കുന്നു.
-
+ <strong>%3</strong> ഫ്ലാഗുകൾ %1MiB <strong>%2</strong> പാർട്ടീഷനിൽ ക്രമീകരിക്കുന്നു.
@@ -2843,12 +2843,12 @@ Output:
-
+ <strong>%1</strong> പാർട്ടീഷനെ <strong>%2</strong> ആയി ഫ്ലാഗ് ചെയ്യുക
-
+ പുതിയ പാർട്ടീഷൻ <strong>%1 </strong>ആയി ഫ്ലാഗുചെയ്യുക.
@@ -2863,12 +2863,12 @@ Output:
-
+ <strong>%2</strong> ഫ്ലാഗുകൾ <strong>%1</strong> പാർട്ടീഷനിൽ ക്രമീകരിക്കുക.
-
+ <strong>%1</strong> ഫ്ലാഗുകൾ പുതിയ പാർട്ടീഷനിൽ ക്രമീകരിക്കുക.
@@ -2891,12 +2891,12 @@ Output:
-
+ ലക്ഷ്യത്തിന്റെ സിസ്റ്റം പാത്ത് തെറ്റാണ്.
-
+ rootMountPoint %1 ആണ്
@@ -2906,7 +2906,7 @@ Output:
-
+ passwd പിഴവ് കോഡ് %1 ഓട് കൂടീ അവസാനിച്ചു.
@@ -2916,7 +2916,7 @@ Output:
-
+ usermod പിഴവ് കോഡ് %1 ഓട് കൂടീ അവസാനിച്ചു.
@@ -2924,17 +2924,17 @@ Output:
-
+ %1%2 എന്നതിലേക്ക് സമയപദ്ധതി ക്രമീകരിക്കുക
-
+ തിരഞ്ഞെടുത്ത സമയപദ്ധതി പാത്ത് ലഭ്യമല്ല.
-
+ മോശമായ പാത്ത്: %1
@@ -2944,7 +2944,7 @@ Output:
-
+ കണ്ണി ഉണ്ടാക്കൽ പരാജയപ്പെട്ടു, ലക്ഷ്യം: %1, കണ്ണിയുടെ പേര്: %2
@@ -2962,7 +2962,7 @@ Output:
-
+ ഷെൽ പ്രക്രിയകൾ ജോലി
@@ -2971,7 +2971,7 @@ Output:
slide counter, %1 of %2 (numeric)
-
+ %L1 / %L2
@@ -2984,7 +2984,7 @@ Output:
-
+ നിങ്ങൾ ഇൻസ്റ്റാൾ നടപടിക്രമങ്ങൾ ആരംഭിച്ചുകഴിഞ്ഞാൽ എന്ത് സംഭവിക്കും എന്നതിന്റെ ഒരു അവലോകനമാണിത്.
@@ -3010,12 +3010,12 @@ Output:
-
+ ഇൻസ്റ്റാൾ-പിന്തുടരുന്നതിൽ ആന്തരികമായ പിഴവ്.
-
+ HTTP അപേക്ഷയുടെ സമയപരിധി കഴിഞ്ഞു.
@@ -3023,28 +3023,28 @@ Output:
-
+ ഉപകരണത്തിൽ നിന്നുള്ള പ്രതികരണം
-
+ ഉപകരണത്തിൽ നിന്നുള്ള പ്രതികരണം ക്രമീകരിക്കുന്നു.
-
+ ഉപകരണത്തിൽ നിന്നുള്ള പ്രതികരണത്തിന്റെ ക്രമീകരണത്തിൽ പിഴവ്.
-
+ ഉപകരണത്തിൽ നിന്നുള്ള പ്രതികരണം ശരിയായി ക്രമീകരിക്കാനായില്ല. സ്ക്രിപ്റ്റ് പിഴവ് %1.
-
+ ഉപകരണത്തിൽ നിന്നുള്ള പ്രതികരണം ശരിയായി ക്രമീകരിക്കാനായില്ല. കലാമാരേസ് പിഴവ് %1.
@@ -3057,22 +3057,22 @@ Output:
-
+ പ്ലേസ്ഹോൾഡർ
-
+ <html><head/><body><p>ഇത് തിരഞ്ഞെടുക്കുന്നതിലൂടെ, നിങ്ങളുടെ ഇൻസ്റ്റാളേഷനെക്കുറിച്ച് <span style=" font-weight:600;">ഒരു വിവരവും നിങ്ങൾ അയയ്ക്കില്ല.</span></p></body></html>
-
+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">ഉപയോക്തൃ ഫീഡ്ബാക്കിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് ഇവിടെ ക്ലിക്കുചെയ്യുക</span></a></p></body></html>
-
+ എത്ര ഉപയോക്താക്കളുണ്ട് ,ഏത് ഹാർഡ്വെയറിലാണ് %1 ഇൻസ്റ്റാൾ ചെയ്യുന്നത് (ചുവടെയുള്ള അവസാന രണ്ടു ഓപ്ഷനുകൾക്കൊപ്പം) കൂടാതെ നിങ്ങൾ മുന്ഗണന നൽകുന്ന പ്രയോഗങ്ങളെക്കുറിച്ചുള്ള വിവരങ്ങൾ നേടുന്നതിന് %1 ഇൻസ്റ്റാൾ ട്രാക്കിംഗ് സഹായിക്കുന്നു.എന്താണ് അയയ്ക്കുന്നതെന്ന് കാണാൻ, ഓരോ ഭാഗത്തിനും അടുത്തുള്ള സഹായ ഐക്കണിൽ ക്ലിക്കുചെയ്യുക.
@@ -3082,7 +3082,7 @@ Output:
-
+ ഇത് തിരഞ്ഞെടുക്കുന്നതിലൂടെ താങ്കൾ <b>ഇടയ്ക്കിടെ</b>താങ്കളുടെ ഇൻസ്റ്റളേഷനെയും ഹാർഡ്വെയറിനെയും പ്രയോഗങ്ങളേയും പറ്റിയുള്ള വിവരങ്ങൾ %1ന് അയച്ചുകൊടുക്കും.
@@ -3173,7 +3173,7 @@ Output:
-
+ ഫിസിക്കൽ വോള്യങ്ങളുടെ പട്ടിക
@@ -3188,7 +3188,7 @@ Output:
-
+ ഫിസിക്കൽ എക്സ്റ്റന്റ് വലുപ്പം:
@@ -3213,7 +3213,7 @@ Output:
-
+ LVകളുടെ അളവ്:
@@ -3307,7 +3307,7 @@ Output:
-
+ <h1>%1</h1><br/><strong>%2<br/>%3 ന്</strong><br/><br/>പകർപ്പവകാശം 2015-2017 Teo Mrnjavac <teo@kde.org><br/>പകർപ്പവകാശം 2018-2019 Adriaan de Groot <groot@kde.org><br/><a href="https://calamares.io/team/">കലാമരേസ് ടീമിനും</a><a href="https://www.transifex.com/calamares/calamares/">കലാമരേസ് പരിഭാഷാ ടീമിനും</a> നന്ദി.<br/><br/><a href="https://calamares.io/">കലാമരേസ്</a>വികസനം <br/><a href="http://www.blue-systems.com/">Blue Systems</a>- Liberating Software സ്പോൺസർ ചെയ്യുന്നതാണ്.
diff --git a/lang/calamares_sv.ts b/lang/calamares_sv.ts
index 57892470b..f84f4f8d0 100644
--- a/lang/calamares_sv.ts
+++ b/lang/calamares_sv.ts
@@ -4,17 +4,17 @@
- Systemets <strong>uppstartsmiljö</strong>.<br><br>Äldre x86-system stödjer endast <strong>BIOS</strong>.<br>Moderna system stödjer vanligen <strong>EFI</strong>, men kan också vara i kompabilitetsläge för BIOS.
+ Systemets <strong>startmiljö</strong>.<br><br>Äldre x86-system stöder endast <strong>BIOS</strong>.<br>Moderna system stöder vanligen <strong>EFI</strong>, men kan också vara i kompatibilitetsläge för BIOS.
- Detta system startades med en <strong>EFI-miljö</strong>.<br><br>För att ställa in uppstart från en EFI-miljö måste en uppstartsladdare användas, t.ex. <strong>GRUB</strong> eller <strong>systemd-boot</strong> eller en <strong>EFI-systempartition</strong>. Detta sker automatiskt, såvida du inte väljer att partitionera manuellt. Då måste du själv installera en uppstartsladdare.
+ Detta system startades med en <strong>EFI-miljö</strong>.<br><br>För att ställa in start från en EFI-miljö måste en starthanterare användas, t.ex. <strong>GRUB</strong> eller <strong>systemd-boot</strong> på en <strong>EFI-systempartition</strong>. Detta sker automatiskt, såvida du inte väljer att partitionera manuellt. Då måste du själv installera en starthanterare.
- Detta system startades med en <strong>BIOS-miljö</strong>. <br><br>För att ställa in uppstart från en BIOS-miljö måste en uppstartsladdare som t.ex. <strong>GRUB</strong> installeras, antingen i början av en partition eller på <strong>huvudstartsektorn (MBR)</strong> i början av partitionstabellen. Detta sker automatiskt, såvida du inte väljer manuell partitionering. Då måste du själv installera en uppstartsladdare.
+ Detta system startades med en <strong>BIOS-miljö</strong>. <br><br>För att ställa in start från en BIOS-miljö måste en starthanterare som t.ex. <strong>GRUB</strong> installeras, antingen i början av en partition eller på <strong>huvudstartsektorn (MBR)</strong> i början av partitionstabellen. Detta sker automatiskt, såvida du inte väljer manuell partitionering. Då måste du själv installera en starthanterare.
@@ -27,7 +27,7 @@
- Uppstartspartition
+ Startpartition
@@ -37,7 +37,7 @@
- Installera inte en uppstartsladdare
+ Installera inte någon starthanterare
@@ -210,12 +210,12 @@
-
+ Väntar på %n modul(er).Väntar på %n modul(er).
-
+ (%n sekund(er))(%n sekund(er))
@@ -273,7 +273,7 @@
-
+ Initieringen av Calamares misslyckades
@@ -283,7 +283,7 @@
-
+ <br/>Följande moduler kunde inte hämtas:
@@ -363,7 +363,7 @@ Alla ändringar kommer att gå förlorade.
- %1-installeraren är på väg att göra ändringar för att installera %2.<br/><strong>Du kommer inte att kunna ångra dessa ändringar!strong>
+ %1-installeraren är på väg att göra ändringar för att installera %2.<br/><strong>Du kommer inte att kunna ångra dessa ändringar.</strong>
@@ -474,7 +474,7 @@ Alla ändringar kommer att gå förlorade.
- Sökväg till uppstartshanterare:
+ Sökväg till starthanterare:
@@ -522,7 +522,7 @@ Alla ändringar kommer att gå förlorade.
- EFI system partition:
+ EFI-partition:
@@ -988,7 +988,7 @@ Alla ändringar kommer att gå förlorade.
-
+ Kunde inte öppna %1
@@ -2637,12 +2637,12 @@ Output:
-
+ Ändra <strong>%2MiB</strong>-partitionen <strong>%1</strong> till <strong>%3MB</strong>.
-
+ Ändrar storlek på partitionen %1 från %2MB till %3MB.
@@ -2682,7 +2682,7 @@ Output:
-
+ Datorn uppfyller inte minimikraven för inställning av %1.<br/>Inga inställningar kan inte göras. <a href="#details">Detaljer...</a>
@@ -2692,7 +2692,7 @@ Output:
-
+ Några av kraven för inställning av %1 uppfylls inte av datorn.<br/>Inställningarna kan ändå göras men vissa funktioner kommer kanske inte att kunna användas.
@@ -2785,7 +2785,7 @@ Output:
-
+ Misslyckades med att skriva tangentbordskonfiguration till den existerande mappen /etc/default.
@@ -2901,7 +2901,7 @@ Output:
-
+ passwd stoppades med felkod %1.
@@ -3052,7 +3052,7 @@ Output:
-
+ Platshållare
@@ -3098,12 +3098,12 @@ Output:
-
+ <small>Om mer än en person skall använda datorn så kan du skapa flera användarkonton när inställningarna är klara.</small>
-
+ <small>Om mer än en person skall använda datorn så kan du skapa flera användarkonton när installationen är klar.</small>
@@ -3134,7 +3134,7 @@ Output:
- Dina lösenord matchar inte!
+ Lösenorden överensstämmer inte!
@@ -3150,7 +3150,7 @@ Output:
-
+ Nyckel
@@ -3237,22 +3237,22 @@ Output:
-
+ Besök webbplatsen för hjälp och support
-
+ Besök webbplatsen för problem och felsökning
-
+ Besök webbplatsen för versionsinformation
- Versionsinfomation
+ Versionsinformation, &R
@@ -3262,22 +3262,22 @@ Output:
- %Support
+ &Support
- Om
+ Om, &A
- <h1>Välkommen till %1-installeraren.</h1>
+ <h1>Välkommen till %1-installeraren.</h1>
-
+ <h1>Välkommen till installationsprogrammet Calamares för %1.</h1>
@@ -3292,7 +3292,7 @@ Output:
-
+ Om inställningarna för %1
diff --git a/lang/calamares_tr_TR.ts b/lang/calamares_tr_TR.ts
index 371824a34..b957d2b3d 100644
--- a/lang/calamares_tr_TR.ts
+++ b/lang/calamares_tr_TR.ts
@@ -3257,7 +3257,7 @@ Kuruluma devam edebilirsiniz fakat bazı özellikler devre dışı kalabilir.
-
+ Sürüm Notları web sitesini aç
diff --git a/lang/python/ja/LC_MESSAGES/python.mo b/lang/python/ja/LC_MESSAGES/python.mo
index 462a4d73c..4722644d8 100644
Binary files a/lang/python/ja/LC_MESSAGES/python.mo and b/lang/python/ja/LC_MESSAGES/python.mo differ
diff --git a/lang/python/ja/LC_MESSAGES/python.po b/lang/python/ja/LC_MESSAGES/python.po
index e6906d289..3debe2325 100644
--- a/lang/python/ja/LC_MESSAGES/python.po
+++ b/lang/python/ja/LC_MESSAGES/python.po
@@ -92,11 +92,11 @@ msgstr ""
#: src/modules/umount/main.py:40
msgid "Unmount file systems."
-msgstr "ファイルシステムをアンマウントする。"
+msgstr "ファイルシステムをアンマウント。"
#: src/modules/unpackfs/main.py:41
msgid "Filling up filesystems."
-msgstr "ファイルシステムを埋める。"
+msgstr "ファイルシステムに書き込んでいます。"
#: src/modules/unpackfs/main.py:160
msgid "rsync failed with error code {}."
@@ -201,7 +201,7 @@ msgstr "ディスプレイマネージャの設定が不完全です"
#: src/modules/initcpiocfg/main.py:36
msgid "Configuring mkinitcpio."
-msgstr "mkinitcpioを設定中"
+msgstr "mkinitcpioを設定しています。"
#: src/modules/initcpiocfg/main.py:192
#: src/modules/luksopenswaphookcfg/main.py:100
@@ -213,7 +213,7 @@ msgstr "
{!s}
を使用するのにルートマウントポイント
#: src/modules/luksopenswaphookcfg/main.py:35
msgid "Configuring encrypted swap."
-msgstr "暗号化したswapを設定中"
+msgstr "暗号化したswapを設定しています。"
#: src/modules/rawfs/main.py:35
msgid "Installing data."
@@ -274,7 +274,7 @@ msgstr "machine-id の生成"
#: src/modules/packages/main.py:62
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
-msgstr "パッケージの処理中 (%(count)d / %(total)d)"
+msgstr "パッケージを処理しています (%(count)d / %(total)d)"
#: src/modules/packages/main.py:64 src/modules/packages/main.py:74
msgid "Install packages."
@@ -284,13 +284,13 @@ msgstr "パッケージのインストール"
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
-msgstr[0] " %(num)d パッケージのインストール中。"
+msgstr[0] " %(num)d パッケージをインストールしています。"
#: src/modules/packages/main.py:70
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
-msgstr[0] " %(num)d パッケージの削除中。"
+msgstr[0] " %(num)d パッケージを削除しています。"
#: src/modules/bootloader/main.py:51
msgid "Install bootloader."
@@ -306,7 +306,7 @@ msgstr "ハードウェアクロックの設定"
#: src/modules/dracut/main.py:36
msgid "Creating initramfs with dracut."
-msgstr "dracutとinitramfsを作成中"
+msgstr "dracutとinitramfsを作成しています。"
#: src/modules/dracut/main.py:58
msgid "Failed to run dracut on the target"
@@ -318,15 +318,15 @@ msgstr "停止コードは {} でした"
#: src/modules/initramfscfg/main.py:41
msgid "Configuring initramfs."
-msgstr "initramfsを設定中"
+msgstr "initramfsを設定しています。"
#: src/modules/openrcdmcryptcfg/main.py:34
msgid "Configuring OpenRC dmcrypt service."
-msgstr "OpenRC dmcryptサービスを設定中"
+msgstr "OpenRC dmcryptサービスを設定しています。"
#: src/modules/fstab/main.py:38
msgid "Writing fstab."
-msgstr "fstabを書き込み中"
+msgstr "fstabを書き込んでいます。"
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."
@@ -338,8 +338,8 @@ msgstr "Dummy python step {}"
#: src/modules/localecfg/main.py:39
msgid "Configuring locales."
-msgstr "ローカルを設定中"
+msgstr "ロケールを設定しています。"
#: src/modules/networkcfg/main.py:37
msgid "Saving network configuration."
-msgstr "ネットワーク設定を保存中"
+msgstr "ネットワーク設定を保存しています。"
diff --git a/lang/python/pt_BR/LC_MESSAGES/python.mo b/lang/python/pt_BR/LC_MESSAGES/python.mo
index 9341ca481..a004f563d 100644
Binary files a/lang/python/pt_BR/LC_MESSAGES/python.mo and b/lang/python/pt_BR/LC_MESSAGES/python.mo differ
diff --git a/lang/python/pt_BR/LC_MESSAGES/python.po b/lang/python/pt_BR/LC_MESSAGES/python.po
index a5da0a8fc..493d4deed 100644
--- a/lang/python/pt_BR/LC_MESSAGES/python.po
+++ b/lang/python/pt_BR/LC_MESSAGES/python.po
@@ -5,7 +5,7 @@
#
# Translators:
# André Marcelo Alvarenga , 2019
-# Guilherme Marçal Silva , 2019
+# Guilherme , 2019
#
#, fuzzy
msgid ""
@@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-15 21:54+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: Guilherme Marçal Silva , 2019\n"
+"Last-Translator: Guilherme , 2019\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/lang/python/sv/LC_MESSAGES/python.mo b/lang/python/sv/LC_MESSAGES/python.mo
index 6af85532a..f31e39ee5 100644
Binary files a/lang/python/sv/LC_MESSAGES/python.mo and b/lang/python/sv/LC_MESSAGES/python.mo differ
diff --git a/lang/python/sv/LC_MESSAGES/python.po b/lang/python/sv/LC_MESSAGES/python.po
index 995a5d124..5eafeeeec 100644
--- a/lang/python/sv/LC_MESSAGES/python.po
+++ b/lang/python/sv/LC_MESSAGES/python.po
@@ -3,6 +3,9 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
+# Translators:
+# Jan-Olof Svensson, 2019
+#
#, fuzzy
msgid ""
msgstr ""
@@ -10,6 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-15 21:54+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
+"Last-Translator: Jan-Olof Svensson, 2019\n"
"Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -208,7 +212,7 @@ msgstr ""
#: src/modules/rawfs/main.py:35
msgid "Installing data."
-msgstr ""
+msgstr "Installerar data."
#: src/modules/services-openrc/main.py:38
msgid "Configure OpenRC services"
@@ -268,21 +272,21 @@ msgstr ""
#: src/modules/packages/main.py:64 src/modules/packages/main.py:74
msgid "Install packages."
-msgstr ""
+msgstr "Installera paket."
#: src/modules/packages/main.py:67
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Installerar ett paket."
+msgstr[1] "Installerar %(num)d paket."
#: src/modules/packages/main.py:70
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tar bort ett paket."
+msgstr[1] "Tar bort %(num)d paket."
#: src/modules/bootloader/main.py:51
msgid "Install bootloader."
@@ -294,7 +298,7 @@ msgstr ""
#: src/modules/hwclock/main.py:35
msgid "Setting hardware clock."
-msgstr ""
+msgstr "Ställer hårdvaruklockan."
#: src/modules/dracut/main.py:36
msgid "Creating initramfs with dracut."
@@ -318,7 +322,7 @@ msgstr ""
#: src/modules/fstab/main.py:38
msgid "Writing fstab."
-msgstr ""
+msgstr "Skriver fstab."
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."
diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp
index 6da81e7af..68d918971 100644
--- a/src/libcalamaresui/ViewManager.cpp
+++ b/src/libcalamaresui/ViewManager.cpp
@@ -75,24 +75,6 @@ setButtonIcon( QPushButton* button, const QString& name )
}
}
-/** @brief Creates a button with a given icon-name
- *
- * Creates a new button as child of @p parent.
- * Sets the named icon, if it exists, onto the button.
- * Returns the new button.
- *
- * There is a QPushButton constructor that takes an icon,
- * but it also needs a text and we've got translations
- * to worry about as well as state.
- */
-static inline QPushButton*
-makeButton( QWidget* parent, const QString& name )
-{
- QPushButton* button = new QPushButton( parent );
- setButtonIcon( button, name );
- return button;
-}
-
ViewManager::ViewManager( QObject* parent )
: QObject( parent )
, m_currentStep( 0 )
@@ -108,9 +90,12 @@ ViewManager::ViewManager( QObject* parent )
mainLayout->addWidget( m_stack );
// Create buttons and sets an initial icon; the icons may change
- m_back = makeButton( m_widget, "go-previous" );
- m_next = makeButton( m_widget, "go-next" );
- m_quit = makeButton( m_widget, "dialog-cancel" );
+ m_back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), m_widget );
+ m_back->setObjectName( "view-button-back" );
+ m_next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), m_widget );
+ m_next->setObjectName( "view-button-next" );
+ m_quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), m_widget );
+ m_quit->setObjectName( "view-button-cancel" );
CALAMARES_RETRANSLATE_SLOT( &ViewManager::updateButtonLabels )
diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp
index 53cc1fabb..33b638e64 100644
--- a/src/libcalamaresui/modulesystem/ModuleManager.cpp
+++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp
@@ -91,17 +91,20 @@ ModuleManager::doInit()
bool success = currentDir.cd( subdir );
if ( success )
{
+ static const char bad_descriptor[] = "ModuleManager potential module descriptor is bad";
QFileInfo descriptorFileInfo( currentDir.absoluteFilePath( QLatin1String( "module.desc" ) ) );
if ( !descriptorFileInfo.exists() )
{
- cDebug() << "ModuleManager expected descriptor is missing:"
- << descriptorFileInfo.absoluteFilePath();
+ cDebug() << bad_descriptor
+ << descriptorFileInfo.absoluteFilePath()
+ << "(missing)";
continue;
}
if ( !descriptorFileInfo.isReadable() )
{
- cDebug() << "ModuleManager descriptor file is unreadable:"
- << descriptorFileInfo.absoluteFilePath();
+ cDebug() << bad_descriptor
+ << descriptorFileInfo.absoluteFilePath()
+ << "(unreadable)";
continue;
}
@@ -109,7 +112,7 @@ ModuleManager::doInit()
QVariantMap moduleDescriptorMap = CalamaresUtils::loadYaml( descriptorFileInfo, &ok );
QString moduleName = ok ? moduleDescriptorMap.value( "name" ).toString() : QString();
- if ( ok && ( moduleName == currentDir.dirName() )
+ if ( ok && !moduleName.isEmpty() && ( moduleName == currentDir.dirName() )
&& !m_availableDescriptorsByModuleName.contains( moduleName ) )
{
m_availableDescriptorsByModuleName.insert( moduleName, moduleDescriptorMap );
@@ -128,8 +131,11 @@ ModuleManager::doInit()
cDebug() << "ModuleManager module search path does not exist:" << path;
}
}
- // At this point m_availableModules is filled with whatever was found in the
- // search paths.
+ // At this point m_availableDescriptorsByModuleName is filled with
+ // the modules that were found in the search paths.
+ cDebug() << "Found"
+ << m_availableDescriptorsByModuleName.count() << "modules"
+ << m_moduleDirectoriesByModuleName.count() << "names";
emit initDone();
}
@@ -182,11 +188,15 @@ findCustomInstance( const Settings::InstanceDescriptionList& customInstances, co
void
ModuleManager::loadModules()
{
- QStringList failedModules = checkDependencies();
+ if (checkDependencies())
+ {
+ cWarning() << "Some installed modules have unmet dependencies.";
+ }
Settings::InstanceDescriptionList customInstances = Settings::instance()->customModuleInstances();
+ QStringList failedModules;
const auto modulesSequence
- = failedModules.isEmpty() ? Settings::instance()->modulesSequence() : Settings::ModuleSequence();
+ = Settings::instance()->modulesSequence() ;
for ( const auto& modulePhase : modulesSequence )
{
ModuleSystem::Action currentAction = modulePhase.first;
@@ -264,7 +274,7 @@ ModuleManager::loadModules()
continue;
}
- if ( !checkDependencies( *thisModule ) )
+ if ( !checkModuleDependencies( *thisModule ) )
{
// Error message is already printed
failedModules.append( instanceKey.toString() );
@@ -345,10 +355,10 @@ missingRequiredModules( const QStringList& required, const QMap< QString, QVaria
return l;
}
-QStringList
+size_t
ModuleManager::checkDependencies()
{
- QStringList failed;
+ size_t numberRemoved = 0;
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
// This goes through the map of available modules, and deletes those whose
@@ -367,19 +377,18 @@ ModuleManager::checkDependencies()
QString moduleName = it->value( "name" ).toString();
somethingWasRemovedBecauseOfUnmetDependencies = true;
m_availableDescriptorsByModuleName.erase( it );
- failed << moduleName;
- cWarning() << "Module" << moduleName << "requires modules" << Logger::DebugList( unmet );
- cWarning() << Logger::SubEntry << "but these are not available (listed in settings, or installed).";
+ numberRemoved++;
+ cWarning() << "Module" << moduleName << "requires missing modules" << Logger::DebugList( unmet );
break;
}
}
} while ( somethingWasRemovedBecauseOfUnmetDependencies );
- return failed;
+ return numberRemoved;
}
bool
-ModuleManager::checkDependencies( const Module& m )
+ModuleManager::checkModuleDependencies( const Module& m )
{
bool allRequirementsFound = true;
QStringList requiredModules
diff --git a/src/libcalamaresui/modulesystem/ModuleManager.h b/src/libcalamaresui/modulesystem/ModuleManager.h
index a4f28fab8..7adbb24e2 100644
--- a/src/libcalamaresui/modulesystem/ModuleManager.h
+++ b/src/libcalamaresui/modulesystem/ModuleManager.h
@@ -106,15 +106,17 @@ private slots:
private:
/**
* Check in a general sense whether the dependencies between
- * modules are valid. Returns a list of module names that
- * do **not** have their requirements met.
+ * modules are valid. Returns the number of modules that
+ * have missing dependencies -- this is **not** a problem
+ * unless any of those modules are actually used.
*
- * Returns an empty list on success.
+ * Returns 0 on success.
*
* Also modifies m_availableDescriptorsByModuleName to remove
- * all the entries that fail.
+ * all the entries that (so that later, when we try to look
+ * them up, they are not found).
*/
- QStringList checkDependencies();
+ size_t checkDependencies();
/**
* Check for this specific module if its required modules have
@@ -122,7 +124,7 @@ private:
*
* Returns true if the requirements are met.
*/
- bool checkDependencies( const Module& );
+ bool checkModuleDependencies( const Module& );
QMap< QString, QVariantMap > m_availableDescriptorsByModuleName;
QMap< QString, QString > m_moduleDirectoriesByModuleName;
diff --git a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo
index 6e1162388..dad5673f1 100644
Binary files a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo and b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo differ
diff --git a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po
index 4377e6c3e..bee7745dc 100644
--- a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po
+++ b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po
@@ -5,7 +5,7 @@
#
# Translators:
# Rodrigo de Almeida Sottomaior Macedo , 2017
-# Guilherme Marçal Silva , 2018
+# Guilherme , 2018
#
#, fuzzy
msgid ""
@@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-15 21:54+0200\n"
"PO-Revision-Date: 2016-12-16 12:18+0000\n"
-"Last-Translator: Guilherme Marçal Silva , 2018\n"
+"Last-Translator: Guilherme , 2018\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/src/modules/users/CheckPWQuality.cpp b/src/modules/users/CheckPWQuality.cpp
index 7fa13f124..3728c5a92 100644
--- a/src/modules/users/CheckPWQuality.cpp
+++ b/src/modules/users/CheckPWQuality.cpp
@@ -32,12 +32,12 @@
PasswordCheck::PasswordCheck()
: m_message()
- , m_accept( []( const QString& ){ return true; } )
+ , m_accept( []( const QString& ) { return true; } )
{
}
PasswordCheck::PasswordCheck( const QString& m, AcceptFunc a )
- : m_message( [m](){ return m; } )
+ : m_message( [m]() { return m; } )
, m_accept( a )
{
}
@@ -52,21 +52,14 @@ DEFINE_CHECK_FUNC( minLength )
{
int minLength = -1;
if ( value.canConvert( QVariant::Int ) )
+ {
minLength = value.toInt();
+ }
if ( minLength > 0 )
{
cDebug() << Logger::SubEntry << "minLength set to" << minLength;
- checks.push_back(
- PasswordCheck(
- []()
- {
- return QCoreApplication::translate( "PWQ", "Password is too short" );
- },
- [minLength]( const QString& s )
- {
- return s.length() >= minLength;
- }
- ) );
+ checks.push_back( PasswordCheck( []() { return QCoreApplication::translate( "PWQ", "Password is too short" ); },
+ [minLength]( const QString& s ) { return s.length() >= minLength; } ) );
}
}
@@ -74,21 +67,14 @@ DEFINE_CHECK_FUNC( maxLength )
{
int maxLength = -1;
if ( value.canConvert( QVariant::Int ) )
+ {
maxLength = value.toInt();
+ }
if ( maxLength > 0 )
{
cDebug() << Logger::SubEntry << "maxLength set to" << maxLength;
- checks.push_back(
- PasswordCheck(
- []()
- {
- return QCoreApplication::translate("PWQ", "Password is too long" );
- },
- [maxLength]( const QString& s )
- {
- return s.length() <= maxLength;
- }
- ) );
+ checks.push_back( PasswordCheck( []() { return QCoreApplication::translate( "PWQ", "Password is too long" ); },
+ [maxLength]( const QString& s ) { return s.length() <= maxLength; } ) );
}
}
@@ -101,15 +87,17 @@ DEFINE_CHECK_FUNC( maxLength )
*/
/// @brief Handle libpwquality using void* to represent a long
-static inline long mungeLong( void* p )
+static inline long
+mungeLong( void* p )
{
- return static_cast( reinterpret_cast( p ) );
+ return static_cast< long >( reinterpret_cast< intptr_t >( p ) );
}
/// @brief Handle libpwquality using void* to represent a char*
-static inline const char* mungeString( void* p )
+static inline const char*
+mungeString( void* p )
{
- return reinterpret_cast( p );
+ return reinterpret_cast< const char* >( p );
}
/**
@@ -128,16 +116,10 @@ public:
{
}
- ~PWSettingsHolder()
- {
- pwquality_free_settings( m_settings );
- }
+ ~PWSettingsHolder() { pwquality_free_settings( m_settings ); }
/// Sets an option via the configuration string @p v, = style.
- int set( const QString& v )
- {
- return pwquality_set_option( m_settings, v.toUtf8().constData() );
- }
+ int set( const QString& v ) { return pwquality_set_option( m_settings, v.toUtf8().constData() ); }
/// Checks the given password @p pwd against the current configuration
int check( const QString& pwd )
@@ -148,10 +130,7 @@ public:
return r;
}
- bool hasExplanation() const
- {
- return m_rv < 0;
- }
+ bool hasExplanation() const { return m_rv < 0; }
/* This is roughly the same as the function pwquality_strerror,
* only with QStrings instead, and using the Qt translation scheme.
@@ -164,16 +143,21 @@ public:
m_auxerror = nullptr;
if ( m_rv >= arbitrary_minimum_strength )
+ {
return QString();
+ }
if ( m_rv >= 0 )
- return QCoreApplication::translate( "PWQ", "Password is too weak" );
+ {
+ return QCoreApplication::translate( "PWQ", "Password is too weak" );
+ }
switch ( m_rv )
{
case PWQ_ERROR_MEM_ALLOC:
if ( auxerror )
{
- QString s = QCoreApplication::translate( "PWQ", "Memory allocation error when setting '%1'" ).arg( mungeString( auxerror ) );
+ QString s = QCoreApplication::translate( "PWQ", "Memory allocation error when setting '%1'" )
+ .arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@@ -189,58 +173,94 @@ public:
case PWQ_ERROR_USER_CHECK:
return QCoreApplication::translate( "PWQ", "The password contains the user name in some form" );
case PWQ_ERROR_GECOS_CHECK:
- return QCoreApplication::translate( "PWQ", "The password contains words from the real name of the user in some form" );
+ return QCoreApplication::translate(
+ "PWQ", "The password contains words from the real name of the user in some form" );
case PWQ_ERROR_BAD_WORDS:
return QCoreApplication::translate( "PWQ", "The password contains forbidden words in some form" );
case PWQ_ERROR_MIN_DIGITS:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains less than %1 digits" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ", "The password contains less than %1 digits" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password contains too few digits" );
case PWQ_ERROR_MIN_UPPERS:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains less than %1 uppercase letters" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ", "The password contains less than %1 uppercase letters" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password contains too few uppercase letters" );
case PWQ_ERROR_MIN_LOWERS:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains less than %1 lowercase letters" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ", "The password contains less than %1 lowercase letters" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password contains too few lowercase letters" );
case PWQ_ERROR_MIN_OTHERS:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains less than %1 non-alphanumeric characters" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ",
+ "The password contains less than %1 non-alphanumeric characters" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password contains too few non-alphanumeric characters" );
case PWQ_ERROR_MIN_LENGTH:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password is shorter than %1 characters" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ", "The password is shorter than %1 characters" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password is too short" );
case PWQ_ERROR_ROTATED:
return QCoreApplication::translate( "PWQ", "The password is just rotated old one" );
case PWQ_ERROR_MIN_CLASSES:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains less than %1 character classes" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ", "The password contains less than %1 character classes" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password does not contain enough character classes" );
case PWQ_ERROR_MAX_CONSECUTIVE:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains more than %1 same characters consecutively" ).arg( mungeLong( auxerror ) );
+ {
+ return QCoreApplication::translate( "PWQ",
+ "The password contains more than %1 same characters consecutively" )
+ .arg( mungeLong( auxerror ) );
+ }
return QCoreApplication::translate( "PWQ", "The password contains too many same characters consecutively" );
case PWQ_ERROR_MAX_CLASS_REPEAT:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains more than %1 characters of the same class consecutively" ).arg( mungeLong( auxerror ) );
- return QCoreApplication::translate( "PWQ", "The password contains too many characters of the same class consecutively" );
+ {
+ return QCoreApplication::translate(
+ "PWQ", "The password contains more than %1 characters of the same class consecutively" )
+ .arg( mungeLong( auxerror ) );
+ }
+ return QCoreApplication::translate(
+ "PWQ", "The password contains too many characters of the same class consecutively" );
case PWQ_ERROR_MAX_SEQUENCE:
if ( auxerror )
- return QCoreApplication::translate( "PWQ", "The password contains monotonic sequence longer than %1 characters" ).arg( mungeLong( auxerror ) );
- return QCoreApplication::translate( "PWQ", "The password contains too long of a monotonic character sequence" );
+ {
+ return QCoreApplication::translate(
+ "PWQ", "The password contains monotonic sequence longer than %1 characters" )
+ .arg( mungeLong( auxerror ) );
+ }
+ return QCoreApplication::translate( "PWQ",
+ "The password contains too long of a monotonic character sequence" );
case PWQ_ERROR_EMPTY_PASSWORD:
return QCoreApplication::translate( "PWQ", "No password supplied" );
case PWQ_ERROR_RNG:
return QCoreApplication::translate( "PWQ", "Cannot obtain random numbers from the RNG device" );
case PWQ_ERROR_GENERATION_FAILED:
- return QCoreApplication::translate( "PWQ", "Password generation failed - required entropy too low for settings" );
+ return QCoreApplication::translate( "PWQ",
+ "Password generation failed - required entropy too low for settings" );
case PWQ_ERROR_CRACKLIB_CHECK:
if ( auxerror )
{
/* Here the string comes from cracklib, don't free? */
- return QCoreApplication::translate( "PWQ", "The password fails the dictionary check - %1" ).arg( mungeString( auxerror ) );
+ return QCoreApplication::translate( "PWQ", "The password fails the dictionary check - %1" )
+ .arg( mungeString( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password fails the dictionary check" );
case PWQ_ERROR_UNKNOWN_SETTING:
@@ -254,7 +274,8 @@ public:
case PWQ_ERROR_INTEGER:
if ( auxerror )
{
- QString s = QCoreApplication::translate( "PWQ", "Bad integer value of setting - %1" ).arg( mungeString( auxerror ) );
+ QString s = QCoreApplication::translate( "PWQ", "Bad integer value of setting - %1" )
+ .arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@@ -262,7 +283,8 @@ public:
case PWQ_ERROR_NON_INT_SETTING:
if ( auxerror )
{
- QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of integer type" ).arg( mungeString( auxerror ) );
+ QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of integer type" )
+ .arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@@ -270,7 +292,8 @@ public:
case PWQ_ERROR_NON_STR_SETTING:
if ( auxerror )
{
- QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of string type" ).arg( mungeString( auxerror ) );
+ QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of string type" )
+ .arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@@ -290,7 +313,7 @@ private:
pwquality_settings_t* m_settings;
int m_rv;
void* m_auxerror;
-} ;
+};
DEFINE_CHECK_FUNC( libpwquality )
{
@@ -302,7 +325,7 @@ DEFINE_CHECK_FUNC( libpwquality )
QVariantList l = value.toList();
unsigned int requirement_count = 0;
- auto settings = std::make_shared();
+ auto settings = std::make_shared< PWSettingsHolder >();
for ( const auto& v : l )
{
if ( v.type() == QVariant::String )
@@ -310,7 +333,9 @@ DEFINE_CHECK_FUNC( libpwquality )
QString option = v.toString();
int r = settings->set( option );
if ( r )
+ {
cWarning() << "unrecognized libpwquality setting" << option;
+ }
else
{
cDebug() << Logger::SubEntry << "libpwquality setting" << option;
@@ -318,28 +343,27 @@ DEFINE_CHECK_FUNC( libpwquality )
}
}
else
+ {
cWarning() << "unrecognized libpwquality setting" << v;
+ }
}
/* Something actually added? */
if ( requirement_count )
{
- checks.push_back(
- PasswordCheck(
- [settings]()
- {
- return settings->explanation();
- },
- [settings]( const QString& s )
- {
- int r = settings->check( s );
- if ( r < 0 )
- cWarning() << "libpwquality error" << r;
- else if ( r < settings->arbitrary_minimum_strength )
- cDebug() << "Password strength" << r << "too low";
- return r >= settings->arbitrary_minimum_strength;
- }
- ) );
+ checks.push_back( PasswordCheck( [settings]() { return settings->explanation(); },
+ [settings]( const QString& s ) {
+ int r = settings->check( s );
+ if ( r < 0 )
+ {
+ cWarning() << "libpwquality error" << r;
+ }
+ else if ( r < settings->arbitrary_minimum_strength )
+ {
+ cDebug() << "Password strength" << r << "too low";
+ }
+ return r >= settings->arbitrary_minimum_strength;
+ } ) );
}
}
#endif
diff --git a/src/modules/users/CheckPWQuality.h b/src/modules/users/CheckPWQuality.h
index 07760c75b..046f31496 100644
--- a/src/modules/users/CheckPWQuality.h
+++ b/src/modules/users/CheckPWQuality.h
@@ -35,8 +35,8 @@ class PasswordCheck
{
public:
/** Return true if the string is acceptable. */
- using AcceptFunc = std::function;
- using MessageFunc = std::function;
+ using AcceptFunc = std::function< bool( const QString& ) >;
+ using MessageFunc = std::function< QString() >;
/** Generate a @p message if @p filter returns true */
PasswordCheck( MessageFunc message, AcceptFunc filter );
@@ -50,17 +50,14 @@ public:
* according to this filter. Returns a message describing
* what is wrong if not.
*/
- QString filter( const QString& s ) const
- {
- return m_accept( s ) ? QString() : m_message();
- }
+ QString filter( const QString& s ) const { return m_accept( s ) ? QString() : m_message(); }
private:
MessageFunc m_message;
AcceptFunc m_accept;
-} ;
+};
-using PasswordCheckList = QVector;
+using PasswordCheckList = QVector< PasswordCheck >;
/* Each of these functions adds a check (if possible) to the list
* of checks; they use the configuration value(s) from the
@@ -68,16 +65,14 @@ using PasswordCheckList = QVector;
* may skip adding a check, and do nothing (it should log
* an error, though).
*/
-#define _xDEFINE_CHECK_FUNC(x) \
- add_check_##x( PasswordCheckList& checks, const QVariant& value )
-#define DEFINE_CHECK_FUNC(x) void _xDEFINE_CHECK_FUNC(x)
-#define DECLARE_CHECK_FUNC(x) void _xDEFINE_CHECK_FUNC(x);
+#define _xDEFINE_CHECK_FUNC( x ) add_check_##x( PasswordCheckList& checks, const QVariant& value )
+#define DEFINE_CHECK_FUNC( x ) void _xDEFINE_CHECK_FUNC( x )
+#define DECLARE_CHECK_FUNC( x ) void _xDEFINE_CHECK_FUNC( x );
-DECLARE_CHECK_FUNC(minLength)
-DECLARE_CHECK_FUNC(maxLength)
+DECLARE_CHECK_FUNC( minLength )
+DECLARE_CHECK_FUNC( maxLength )
#ifdef HAVE_LIBPWQUALITY
-DECLARE_CHECK_FUNC(libpwquality)
+DECLARE_CHECK_FUNC( libpwquality )
#endif
#endif
-
diff --git a/src/modules/users/CreateUserJob.cpp b/src/modules/users/CreateUserJob.cpp
index 788ba0195..b107fb0bb 100644
--- a/src/modules/users/CreateUserJob.cpp
+++ b/src/modules/users/CreateUserJob.cpp
@@ -19,10 +19,10 @@
#include
-#include "JobQueue.h"
#include "GlobalStorage.h"
-#include "utils/Logger.h"
+#include "JobQueue.h"
#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
#include
#include
@@ -72,17 +72,20 @@ CreateUserJob::exec()
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
QDir destDir( gs->value( "rootMountPoint" ).toString() );
- if ( gs->contains( "sudoersGroup" ) &&
- !gs->value( "sudoersGroup" ).toString().isEmpty() )
+ if ( gs->contains( "sudoersGroup" ) && !gs->value( "sudoersGroup" ).toString().isEmpty() )
{
QFileInfo sudoersFi( destDir.absoluteFilePath( "etc/sudoers.d/10-installer" ) );
if ( !sudoersFi.absoluteDir().exists() )
+ {
return Calamares::JobResult::error( tr( "Sudoers dir is not writable." ) );
+ }
QFile sudoersFile( sudoersFi.absoluteFilePath() );
- if (!sudoersFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
+ if ( !sudoersFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
+ {
return Calamares::JobResult::error( tr( "Cannot create sudoers file for writing." ) );
+ }
QString sudoersGroup = gs->value( "sudoersGroup" ).toString();
@@ -96,11 +99,12 @@ CreateUserJob::exec()
QFileInfo groupsFi( destDir.absoluteFilePath( "etc/group" ) );
QFile groupsFile( groupsFi.absoluteFilePath() );
if ( !groupsFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
+ {
return Calamares::JobResult::error( tr( "Cannot open groups file for reading." ) );
+ }
QString groupsData = QString::fromLocal8Bit( groupsFile.readAll() );
QStringList groupsLines = groupsData.split( '\n' );
- for ( QStringList::iterator it = groupsLines.begin();
- it != groupsLines.end(); ++it )
+ for ( QStringList::iterator it = groupsLines.begin(); it != groupsLines.end(); ++it )
{
int indexOfFirstToDrop = it->indexOf( ':' );
it->truncate( indexOfFirstToDrop );
@@ -108,15 +112,13 @@ CreateUserJob::exec()
foreach ( const QString& group, m_defaultGroups )
if ( !groupsLines.contains( group ) )
- CalamaresUtils::System::instance()->
- targetEnvCall( { "groupadd", group } );
+ CalamaresUtils::System::instance()->targetEnvCall( { "groupadd", group } );
QString defaultGroups = m_defaultGroups.join( ',' );
if ( m_autologin )
{
QString autologinGroup;
- if ( gs->contains( "autologinGroup" ) &&
- !gs->value( "autologinGroup" ).toString().isEmpty() )
+ if ( gs->contains( "autologinGroup" ) && !gs->value( "autologinGroup" ).toString().isEmpty() )
{
autologinGroup = gs->value( "autologinGroup" ).toString();
CalamaresUtils::System::instance()->targetEnvCall( { "groupadd", autologinGroup } );
@@ -131,26 +133,20 @@ CreateUserJob::exec()
QDir existingHome( destDir.absolutePath() + shellFriendlyHome );
if ( existingHome.exists() )
{
- QString backupDirName = "dotfiles_backup_" +
- QDateTime::currentDateTime()
- .toString( "yyyy-MM-dd_HH-mm-ss" );
+ QString backupDirName = "dotfiles_backup_" + QDateTime::currentDateTime().toString( "yyyy-MM-dd_HH-mm-ss" );
existingHome.mkdir( backupDirName );
- CalamaresUtils::System::instance()->
- targetEnvCall( { "sh",
- "-c",
- "mv -f " +
- shellFriendlyHome + "/.* " +
- shellFriendlyHome + "/" +
- backupDirName
- } );
+ CalamaresUtils::System::instance()->targetEnvCall(
+ { "sh", "-c", "mv -f " + shellFriendlyHome + "/.* " + shellFriendlyHome + "/" + backupDirName } );
}
}
- QStringList useradd{ "useradd", "-m", "-U" };
+ QStringList useradd { "useradd", "-m", "-U" };
QString shell = gs->value( "userShell" ).toString();
if ( !shell.isEmpty() )
+ {
useradd << "-s" << shell;
+ }
useradd << "-c" << m_fullName;
useradd << m_userName;
@@ -161,8 +157,8 @@ CreateUserJob::exec()
return commandResult.explainProcess( useradd, std::chrono::seconds( 10 ) /* bogus timeout */ );
}
- commandResult = CalamaresUtils::System::instance()->targetEnvCommand(
- { "usermod", "-aG", defaultGroups, m_userName } );
+ commandResult
+ = CalamaresUtils::System::instance()->targetEnvCommand( { "usermod", "-aG", defaultGroups, m_userName } );
if ( commandResult.getExitCode() )
{
cError() << "usermod failed" << commandResult.getExitCode();
@@ -171,8 +167,7 @@ CreateUserJob::exec()
QString userGroup = QString( "%1:%2" ).arg( m_userName ).arg( m_userName );
QString homeDir = QString( "/home/%1" ).arg( m_userName );
- commandResult = CalamaresUtils::System::instance()->targetEnvCommand(
- { "chown", "-R", userGroup, homeDir } );
+ commandResult = CalamaresUtils::System::instance()->targetEnvCommand( { "chown", "-R", userGroup, homeDir } );
if ( commandResult.getExitCode() )
{
cError() << "chown failed" << commandResult.getExitCode();
diff --git a/src/modules/users/CreateUserJob.h b/src/modules/users/CreateUserJob.h
index d3459fc8a..98d7c001e 100644
--- a/src/modules/users/CreateUserJob.h
+++ b/src/modules/users/CreateUserJob.h
@@ -27,10 +27,7 @@ class CreateUserJob : public Calamares::Job
{
Q_OBJECT
public:
- CreateUserJob( const QString& userName,
- const QString& fullName,
- bool autologin,
- const QStringList& defaultGroups );
+ CreateUserJob( const QString& userName, const QString& fullName, bool autologin, const QStringList& defaultGroups );
QString prettyName() const override;
QString prettyDescription() const override;
QString prettyStatusMessage() const override;
diff --git a/src/modules/users/PasswordTests.cpp b/src/modules/users/PasswordTests.cpp
index d4526351a..0c1b4bffc 100644
--- a/src/modules/users/PasswordTests.cpp
+++ b/src/modules/users/PasswordTests.cpp
@@ -24,13 +24,9 @@
QTEST_GUILESS_MAIN( PasswordTests )
-PasswordTests::PasswordTests()
-{
-}
+PasswordTests::PasswordTests() {}
-PasswordTests::~PasswordTests()
-{
-}
+PasswordTests::~PasswordTests() {}
void
PasswordTests::initTestCase()
@@ -41,7 +37,7 @@ void
PasswordTests::testSalt()
{
QString s = SetPasswordJob::make_salt( 8 );
- QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $
+ QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $
QVERIFY( s.startsWith( "$6$" ) );
QVERIFY( s.endsWith( '$' ) );
qDebug() << "Obtained salt" << s;
diff --git a/src/modules/users/SetHostNameJob.cpp b/src/modules/users/SetHostNameJob.cpp
index 62b1c61a7..b03d7a200 100644
--- a/src/modules/users/SetHostNameJob.cpp
+++ b/src/modules/users/SetHostNameJob.cpp
@@ -21,11 +21,11 @@
#include "SetHostNameJob.h"
#include "GlobalStorage.h"
-#include "utils/Logger.h"
#include "JobQueue.h"
+#include "utils/Logger.h"
-#include
#include
+#include
SetHostNameJob::SetHostNameJob( const QString& hostname )
: Calamares::Job()
@@ -33,7 +33,8 @@ SetHostNameJob::SetHostNameJob( const QString& hostname )
{
}
-QString SetHostNameJob::prettyName() const
+QString
+SetHostNameJob::prettyName() const
{
return tr( "Set hostname %1" ).arg( m_hostname );
}
@@ -52,7 +53,8 @@ SetHostNameJob::prettyStatusMessage() const
return tr( "Setting hostname %1." ).arg( m_hostname );
}
-Calamares::JobResult SetHostNameJob::exec()
+Calamares::JobResult
+SetHostNameJob::exec()
{
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
@@ -90,11 +92,21 @@ Calamares::JobResult SetHostNameJob::exec()
// We also need to write the appropriate entries for /etc/hosts
QTextStream hostsfileout( &hostsfile );
// ipv4 support
- hostsfileout << "127.0.0.1" << "\t" << "localhost" << "\n";
- hostsfileout << "127.0.1.1" << "\t" << m_hostname << "\n";
+ hostsfileout << "127.0.0.1"
+ << "\t"
+ << "localhost"
+ << "\n";
+ hostsfileout << "127.0.1.1"
+ << "\t" << m_hostname << "\n";
// ipv6 support
- hostsfileout << "::1" << "\t" << "localhost ip6-localhost ip6-loopback" << "\n";
- hostsfileout << "ff02::1 ip6-allnodes" << "\n" << "ff02::2 ip6-allrouters" << "\n";
+ hostsfileout << "::1"
+ << "\t"
+ << "localhost ip6-localhost ip6-loopback"
+ << "\n";
+ hostsfileout << "ff02::1 ip6-allnodes"
+ << "\n"
+ << "ff02::2 ip6-allrouters"
+ << "\n";
hostsfile.close();
return Calamares::JobResult::ok();
diff --git a/src/modules/users/SetHostNameJob.h b/src/modules/users/SetHostNameJob.h
index 11e296fce..ca2481dd4 100644
--- a/src/modules/users/SetHostNameJob.h
+++ b/src/modules/users/SetHostNameJob.h
@@ -31,9 +31,10 @@ public:
QString prettyDescription() const override;
QString prettyStatusMessage() const override;
Calamares::JobResult exec() override;
+
private:
const QString m_hostname;
};
-#endif // SETHOSTNAMEJOB_CPP_H
+#endif // SETHOSTNAMEJOB_CPP_H
diff --git a/src/modules/users/SetPasswordJob.cpp b/src/modules/users/SetPasswordJob.cpp
index 9c560106d..325d24fe3 100644
--- a/src/modules/users/SetPasswordJob.cpp
+++ b/src/modules/users/SetPasswordJob.cpp
@@ -19,10 +19,10 @@
#include
-#include "JobQueue.h"
#include "GlobalStorage.h"
-#include "utils/Logger.h"
+#include "JobQueue.h"
#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
#include
@@ -58,29 +58,27 @@ SetPasswordJob::prettyStatusMessage() const
/// Returns a modular hashing salt for method 6 (SHA512) with a 16 character random salt.
QString
-SetPasswordJob::make_salt(int length)
+SetPasswordJob::make_salt( int length )
{
- Q_ASSERT(length >= 8);
- Q_ASSERT(length <= 128);
+ Q_ASSERT( length >= 8 );
+ Q_ASSERT( length <= 128 );
- static const char salt_chars[] = {
- '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
- 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
- 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
- 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
- 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
+ static const char salt_chars[] = { '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
+ 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+ 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
- static_assert( sizeof(salt_chars) == 64, "Missing salt_chars");
+ static_assert( sizeof( salt_chars ) == 64, "Missing salt_chars" );
std::random_device r;
- std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
- std::mt19937_64 twister(seed);
+ std::seed_seq seed { r(), r(), r(), r(), r(), r(), r(), r() };
+ std::mt19937_64 twister( seed );
std::uint64_t next;
int current_length = 0;
QString salt_string;
- salt_string.reserve(length + 10);
+ salt_string.reserve( length + 10 );
while ( current_length < length )
{
@@ -89,11 +87,13 @@ SetPasswordJob::make_salt(int length)
// to a single salt character.
for ( unsigned int char_count = 0; char_count < 10; ++char_count )
{
- char c = salt_chars[next & 0b0111111];
+ char c = salt_chars[ next & 0b0111111 ];
next >>= 6;
salt_string.append( c );
- if (++current_length >= length)
+ if ( ++current_length >= length )
+ {
break;
+ }
}
}
@@ -112,34 +112,21 @@ SetPasswordJob::exec()
return Calamares::JobResult::error( tr( "Bad destination system path." ),
tr( "rootMountPoint is %1" ).arg( destDir.absolutePath() ) );
- if ( m_userName == "root" &&
- m_newPassword.isEmpty() ) //special case for disabling root account
+ if ( m_userName == "root" && m_newPassword.isEmpty() ) //special case for disabling root account
{
- int ec = CalamaresUtils::System::instance()->
- targetEnvCall( { "passwd",
- "-dl",
- m_userName } );
+ int ec = CalamaresUtils::System::instance()->targetEnvCall( { "passwd", "-dl", m_userName } );
if ( ec )
return Calamares::JobResult::error( tr( "Cannot disable root account." ),
- tr( "passwd terminated with error code %1." )
- .arg( ec ) );
+ tr( "passwd terminated with error code %1." ).arg( ec ) );
return Calamares::JobResult::ok();
}
- QString encrypted = QString::fromLatin1(
- crypt( m_newPassword.toUtf8(),
- make_salt( 16 ).toUtf8() ) );
+ QString encrypted = QString::fromLatin1( crypt( m_newPassword.toUtf8(), make_salt( 16 ).toUtf8() ) );
- int ec = CalamaresUtils::System::instance()->
- targetEnvCall( { "usermod",
- "-p",
- encrypted,
- m_userName } );
+ int ec = CalamaresUtils::System::instance()->targetEnvCall( { "usermod", "-p", encrypted, m_userName } );
if ( ec )
- return Calamares::JobResult::error( tr( "Cannot set password for user %1." )
- .arg( m_userName ),
- tr( "usermod terminated with error code %1." )
- .arg( ec ) );
+ return Calamares::JobResult::error( tr( "Cannot set password for user %1." ).arg( m_userName ),
+ tr( "usermod terminated with error code %1." ).arg( ec ) );
return Calamares::JobResult::ok();
}
diff --git a/src/modules/users/SetPasswordJob.h b/src/modules/users/SetPasswordJob.h
index c4ec59c2a..d2ebf64aa 100644
--- a/src/modules/users/SetPasswordJob.h
+++ b/src/modules/users/SetPasswordJob.h
@@ -27,13 +27,12 @@ class SetPasswordJob : public Calamares::Job
{
Q_OBJECT
public:
- SetPasswordJob( const QString& userName,
- const QString& newPassword );
+ SetPasswordJob( const QString& userName, const QString& newPassword );
QString prettyName() const override;
QString prettyStatusMessage() const override;
Calamares::JobResult exec() override;
- static QString make_salt(int length);
+ static QString make_salt( int length );
private:
QString m_userName;
diff --git a/src/modules/users/UsersPage.cpp b/src/modules/users/UsersPage.cpp
index 62292b76c..c0965a7ed 100644
--- a/src/modules/users/UsersPage.cpp
+++ b/src/modules/users/UsersPage.cpp
@@ -27,8 +27,8 @@
#include "ui_page_usersetup.h"
#include "CreateUserJob.h"
-#include "SetPasswordJob.h"
#include "SetHostNameJob.h"
+#include "SetPasswordJob.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
@@ -45,12 +45,28 @@
#include
#include
+static const QRegExp USERNAME_RX( "^[a-z_][a-z0-9_-]*[$]?$" );
+static const QRegExp HOSTNAME_RX( "^[a-zA-Z0-9][-a-zA-Z0-9_]*$" );
+static constexpr const int USERNAME_MAX_LENGTH = 31;
+static constexpr const int HOSTNAME_MIN_LENGTH = 2;
+static constexpr const int HOSTNAME_MAX_LENGTH = 63;
+
+/** @brief How bad is the error for labelError() ? */
+enum class Badness
+{
+ Fatal,
+ Warning
+};
+
/** Add an error message and pixmap to a label. */
static inline void
-labelError( QLabel* pix, QLabel* label, const QString& message )
+labelError( QLabel* pix, QLabel* label, const QString& message, Badness bad = Badness::Fatal )
{
label->setText( message );
- pix->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::No, CalamaresUtils::Original, label->size() ) );
+ pix->setPixmap( CalamaresUtils::defaultPixmap( ( bad == Badness::Fatal ) ? CalamaresUtils::StatusError
+ : CalamaresUtils::StatusWarning,
+ CalamaresUtils::Original,
+ label->size() ) );
}
/** Clear error, indicate OK on a label. */
@@ -74,25 +90,20 @@ UsersPage::UsersPage( QWidget* parent )
ui->setupUi( this );
// Connect signals and slots
- connect( ui->textBoxFullName, &QLineEdit::textEdited,
- this, &UsersPage::onFullNameTextEdited );
- connect( ui->textBoxUsername, &QLineEdit::textEdited,
- this, &UsersPage::onUsernameTextEdited );
- connect( ui->textBoxHostname, &QLineEdit::textEdited,
- this, &UsersPage::onHostnameTextEdited );
- connect( ui->textBoxUserPassword, &QLineEdit::textChanged,
- this, &UsersPage::onPasswordTextChanged );
- connect( ui->textBoxUserVerifiedPassword, &QLineEdit::textChanged,
- this, &UsersPage::onPasswordTextChanged );
- connect( ui->textBoxRootPassword, &QLineEdit::textChanged,
- this, &UsersPage::onRootPasswordTextChanged );
- connect( ui->textBoxVerifiedRootPassword, &QLineEdit::textChanged,
- this, &UsersPage::onRootPasswordTextChanged );
- connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged,
- this, [this]( int checked )
- {
+ connect( ui->textBoxFullName, &QLineEdit::textEdited, this, &UsersPage::onFullNameTextEdited );
+ connect( ui->textBoxUsername, &QLineEdit::textEdited, this, &UsersPage::onUsernameTextEdited );
+ connect( ui->textBoxHostname, &QLineEdit::textEdited, this, &UsersPage::onHostnameTextEdited );
+ connect( ui->textBoxUserPassword, &QLineEdit::textChanged, this, &UsersPage::onPasswordTextChanged );
+ connect( ui->textBoxUserVerifiedPassword, &QLineEdit::textChanged, this, &UsersPage::onPasswordTextChanged );
+ connect( ui->textBoxRootPassword, &QLineEdit::textChanged, this, &UsersPage::onRootPasswordTextChanged );
+ connect( ui->textBoxVerifiedRootPassword, &QLineEdit::textChanged, this, &UsersPage::onRootPasswordTextChanged );
+ connect( ui->checkBoxValidatePassword, &QCheckBox::stateChanged, this, [this]( int checked ) {
+ onPasswordTextChanged( ui->textBoxUserPassword->text() );
+ onRootPasswordTextChanged( ui->textBoxRootPassword->text() );
+ checkReady( isReady() );
+ } );
+ connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged, this, [this]( int checked ) {
ui->labelChooseRootPassword->setVisible( !checked );
- ui->labelExtraRootPassword->setVisible( !checked );
ui->labelRootPassword->setVisible( !checked );
ui->labelRootPasswordError->setVisible( !checked );
ui->textBoxRootPassword->setVisible( !checked );
@@ -105,47 +116,45 @@ UsersPage::UsersPage( QWidget* parent )
setWriteRootPassword( true );
ui->checkBoxReusePassword->setChecked( true );
+ ui->checkBoxValidatePassword->setChecked( true );
- // Don't expand the explanations to "stupid wide", but keep them vaguely as-wide-as
- // the things they are explaining.
- int boxWidth = qMax( qMax( ui->textBoxUsername->width(), ui->textBoxHostname->width() ), ui->textBoxUserPassword->width() );
- ui->username_extra_label_2->setMaximumWidth( 3 * boxWidth );
- ui->hostname_extra_label_2->setMaximumWidth( 3 * boxWidth );
- ui->password_extra_label_3->setMaximumWidth( 3 * boxWidth );
+ setPasswordCheckboxVisible( false );
- CALAMARES_RETRANSLATE(
- ui->retranslateUi( this );
- if ( Calamares::Settings::instance()->isSetupMode() )
- {
- ui->username_extra_label_2->setText( tr( "If more than one person will "
- "use this computer, you can create multiple "
- "accounts after setup." ) );
- }
- else
- {
- ui->username_extra_label_2->setText( tr( "If more than one person will "
- "use this computer, you can create multiple "
- "accounts after installation." ) );
- }
- )
+ CALAMARES_RETRANSLATE_SLOT( &UsersPage::retranslate );
}
-
UsersPage::~UsersPage()
{
delete ui;
}
+void
+UsersPage::retranslate()
+{
+ ui->retranslateUi( this );
+ if ( Calamares::Settings::instance()->isSetupMode() )
+ {
+ ui->textBoxUsername->setToolTip( tr( "If more than one person will "
+ "use this computer, you can create multiple "
+ "accounts after setup." ) );
+ }
+ else
+ {
+ ui->textBoxUsername->setToolTip( tr( "If more than one person will "
+ "use this computer, you can create multiple "
+ "accounts after installation." ) );
+ }
+}
+
bool
UsersPage::isReady()
{
- bool readyFields = m_readyFullName &&
- m_readyHostname &&
- m_readyPassword &&
- m_readyUsername;
+ bool readyFields = m_readyFullName && m_readyHostname && m_readyPassword && m_readyUsername;
if ( !m_writeRootPassword || ui->checkBoxReusePassword->isChecked() )
+ {
return readyFields;
+ }
return readyFields && m_readyRootPassword;
}
@@ -156,38 +165,40 @@ UsersPage::createJobs( const QStringList& defaultGroupsList )
{
QList< Calamares::job_ptr > list;
if ( !isReady() )
+ {
return list;
+ }
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
Calamares::Job* j;
j = new CreateUserJob( ui->textBoxUsername->text(),
- ui->textBoxFullName->text().isEmpty() ?
- ui->textBoxUsername->text() :
- ui->textBoxFullName->text(),
+ ui->textBoxFullName->text().isEmpty() ? ui->textBoxUsername->text()
+ : ui->textBoxFullName->text(),
ui->checkBoxAutoLogin->isChecked(),
defaultGroupsList );
list.append( Calamares::job_ptr( j ) );
- j = new SetPasswordJob( ui->textBoxUsername->text(),
- ui->textBoxUserPassword->text() );
+ j = new SetPasswordJob( ui->textBoxUsername->text(), ui->textBoxUserPassword->text() );
list.append( Calamares::job_ptr( j ) );
if ( m_writeRootPassword )
{
gs->insert( "reuseRootPassword", ui->checkBoxReusePassword->isChecked() );
if ( ui->checkBoxReusePassword->isChecked() )
- j = new SetPasswordJob( "root",
- ui->textBoxUserPassword->text() );
+ {
+ j = new SetPasswordJob( "root", ui->textBoxUserPassword->text() );
+ }
else
- j = new SetPasswordJob( "root",
- ui->textBoxRootPassword->text() );
+ {
+ j = new SetPasswordJob( "root", ui->textBoxRootPassword->text() );
+ }
list.append( Calamares::job_ptr( j ) );
}
else
{
j = new SetPasswordJob( "root",
- "" ); //explicitly disable root password
+ "" ); //explicitly disable root password
list.append( Calamares::job_ptr( j ) );
}
@@ -196,7 +207,9 @@ UsersPage::createJobs( const QStringList& defaultGroupsList )
gs->insert( "hostname", ui->textBoxHostname->text() );
if ( ui->checkBoxAutoLogin->isChecked() )
+ {
gs->insert( "autologinUser", ui->textBoxUsername->text() );
+ }
gs->insert( "username", ui->textBoxUsername->text() );
gs->insert( "password", CalamaresUtils::obscure( ui->textBoxUserPassword->text() ) );
@@ -228,16 +241,19 @@ UsersPage::onFullNameTextEdited( const QString& textRef )
ui->labelFullNameError->clear();
ui->labelFullName->clear();
if ( !m_customUsername )
+ {
ui->textBoxUsername->clear();
+ }
if ( !m_customHostname )
+ {
ui->textBoxHostname->clear();
+ }
m_readyFullName = false;
}
else
{
- ui->labelFullName->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes,
- CalamaresUtils::Original,
- ui->labelFullName->size() ) );
+ ui->labelFullName->setPixmap(
+ CalamaresUtils::defaultPixmap( CalamaresUtils::Yes, CalamaresUtils::Original, ui->labelFullName->size() ) );
m_readyFullName = true;
fillSuggestions();
}
@@ -250,8 +266,7 @@ UsersPage::fillSuggestions()
{
QString fullName = ui->textBoxFullName->text();
QRegExp rx( "[^a-zA-Z0-9 ]", Qt::CaseInsensitive );
- QString cleanName = CalamaresUtils::removeDiacritics( fullName )
- .toLower().replace( rx, " " ).simplified();
+ QString cleanName = CalamaresUtils::removeDiacritics( fullName ).toLower().replace( rx, " " ).simplified();
QStringList cleanParts = cleanName.split( ' ' );
if ( !m_customUsername )
@@ -262,7 +277,9 @@ UsersPage::fillSuggestions()
for ( int i = 1; i < cleanParts.length(); ++i )
{
if ( !cleanParts.value( i ).isEmpty() )
+ {
usernameSuggestion.append( cleanParts.value( i ).at( 0 ) );
+ }
}
if ( USERNAME_RX.indexIn( usernameSuggestion ) != -1 )
{
@@ -301,8 +318,8 @@ void
UsersPage::validateUsernameText( const QString& textRef )
{
QString text( textRef );
- QRegExp rx( USERNAME_RX );
- QRegExpValidator val( rx );
+ QRegExpValidator val_whole( USERNAME_RX );
+ QRegExpValidator val_start( QRegExp( "[a-z_].*" ) ); // anchors are implicit in QRegExpValidator
int pos = -1;
if ( text.isEmpty() )
@@ -313,14 +330,21 @@ UsersPage::validateUsernameText( const QString& textRef )
}
else if ( text.length() > USERNAME_MAX_LENGTH )
{
- labelError( ui->labelUsername, ui->labelUsernameError,
- tr( "Your username is too long." ) );
+ labelError( ui->labelUsername, ui->labelUsernameError, tr( "Your username is too long." ) );
m_readyUsername = false;
}
- else if ( val.validate( text, pos ) == QValidator::Invalid )
+ else if ( val_start.validate( text, pos ) == QValidator::Invalid )
{
- labelError( ui->labelUsername, ui->labelUsernameError,
- tr( "Your username contains invalid characters. Only lowercase letters and numbers are allowed." ) );
+ labelError( ui->labelUsername,
+ ui->labelUsernameError,
+ tr( "Your username must start with a lowercase letter or underscore." ) );
+ m_readyUsername = false;
+ }
+ else if ( val_whole.validate( text, pos ) == QValidator::Invalid )
+ {
+ labelError( ui->labelUsername,
+ ui->labelUsernameError,
+ tr( "Only lowercase letters, numbers, underscore and hyphen are allowed." ) );
m_readyUsername = false;
}
else
@@ -345,32 +369,30 @@ void
UsersPage::validateHostnameText( const QString& textRef )
{
QString text = textRef;
- QRegExp rx( HOSTNAME_RX );
- QRegExpValidator val( rx );
+ QRegExpValidator val( HOSTNAME_RX );
int pos = -1;
if ( text.isEmpty() )
{
ui->labelHostnameError->clear();
ui->labelHostname->clear();
- m_readyHostname= false;
+ m_readyHostname = false;
}
else if ( text.length() < HOSTNAME_MIN_LENGTH )
{
- labelError( ui->labelHostname, ui->labelHostnameError,
- tr( "Your hostname is too short." ) );
+ labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname is too short." ) );
m_readyHostname = false;
}
else if ( text.length() > HOSTNAME_MAX_LENGTH )
{
- labelError( ui->labelHostname, ui->labelHostnameError,
- tr( "Your hostname is too long." ) );
+ labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname is too long." ) );
m_readyHostname = false;
}
else if ( val.validate( text, pos ) == QValidator::Invalid )
{
- labelError( ui->labelHostname, ui->labelHostnameError,
- tr( "Your hostname contains invalid characters. Only letters, numbers and dashes are allowed." ) );
+ labelError( ui->labelHostname,
+ ui->labelHostnameError,
+ tr( "Only letters, numbers, underscore and hyphen are allowed." ) );
m_readyHostname = false;
}
else
@@ -382,46 +404,59 @@ UsersPage::validateHostnameText( const QString& textRef )
emit checkReady( isReady() );
}
-void
-UsersPage::onPasswordTextChanged( const QString& )
+bool
+UsersPage::checkPasswordAcceptance( const QString& pw1, const QString& pw2, QLabel* badge, QLabel* message )
{
- QString pw1 = ui->textBoxUserPassword->text();
- QString pw2 = ui->textBoxUserVerifiedPassword->text();
-
- // TODO: 3.3: remove empty-check and leave it to passwordRequirements
if ( pw1.isEmpty() && pw2.isEmpty() )
{
- ui->labelUserPasswordError->clear();
- ui->labelUserPassword->clear();
- m_readyPassword = false;
+ // Not exactly labelOk() because we also don't want a checkmark OK
+ badge->clear();
+ message->clear();
+ return false;
}
else if ( pw1 != pw2 )
{
- labelError( ui->labelUserPassword, ui->labelUserPasswordError,
- tr( "Your passwords do not match!" ) );
- m_readyPassword = false;
+ labelError( badge, message, tr( "Your passwords do not match!" ) );
+ return false;
}
else
{
- bool ok = true;
+ bool failureIsFatal = ui->checkBoxValidatePassword->isChecked();
+ bool failureFound = false;
+
for ( auto pc : m_passwordChecks )
{
QString s = pc.filter( pw1 );
+
if ( !s.isEmpty() )
{
- labelError( ui->labelUserPassword, ui->labelUserPasswordError, s );
- ok = false;
- m_readyPassword = false;
- break;
+ labelError( badge, message, s, failureIsFatal ? Badness::Fatal : Badness::Warning );
+ failureFound = true;
+ if ( failureIsFatal )
+ {
+ return false;
+ }
}
}
- if ( ok )
+ if ( !failureFound )
{
- labelOk( ui->labelUserPassword, ui->labelUserPasswordError );
- m_readyPassword = true;
+ labelOk( badge, message );
}
+
+ // Here, if failureFound is true then we've found **warnings**,
+ // which is ok to continue but the user should know.
+ return true;
}
+}
+
+void
+UsersPage::onPasswordTextChanged( const QString& )
+{
+ m_readyPassword = checkPasswordAcceptance( ui->textBoxUserPassword->text(),
+ ui->textBoxUserVerifiedPassword->text(),
+ ui->labelUserPassword,
+ ui->labelUserPasswordError );
emit checkReady( isReady() );
}
@@ -429,48 +464,27 @@ UsersPage::onPasswordTextChanged( const QString& )
void
UsersPage::onRootPasswordTextChanged( const QString& )
{
- QString pw1 = ui->textBoxRootPassword->text();
- QString pw2 = ui->textBoxVerifiedRootPassword->text();
-
- // TODO: 3.3: remove empty-check and leave it to passwordRequirements
- if ( pw1.isEmpty() && pw2.isEmpty() )
- {
- ui->labelRootPasswordError->clear();
- ui->labelRootPassword->clear();
- m_readyRootPassword = false;
- }
- else if ( pw1 != pw2 )
- {
- labelError( ui->labelRootPassword, ui->labelRootPasswordError,
- tr( "Your passwords do not match!" ) );
- m_readyRootPassword = false;
- }
- else
- {
- bool ok = true;
- for ( auto pc : m_passwordChecks )
- {
- QString s = pc.filter( pw1 );
- if ( !s.isEmpty() )
- {
- labelError( ui->labelRootPassword, ui->labelRootPasswordError, s );
- ok = false;
- m_readyRootPassword = false;
- break;
- }
- }
-
- if ( ok )
- {
- labelOk( ui->labelRootPassword, ui->labelRootPasswordError );
- m_readyRootPassword = true;
- }
- }
-
+ m_readyRootPassword = checkPasswordAcceptance( ui->textBoxRootPassword->text(),
+ ui->textBoxVerifiedRootPassword->text(),
+ ui->labelRootPassword,
+ ui->labelRootPasswordError );
emit checkReady( isReady() );
}
+void
+UsersPage::setPasswordCheckboxVisible( bool visible )
+{
+ ui->checkBoxValidatePassword->setVisible( visible );
+}
+
+void
+UsersPage::setValidatePasswordDefault( bool checked )
+{
+ ui->checkBoxValidatePassword->setChecked( checked );
+ emit checkReady( isReady() );
+}
+
void
UsersPage::setAutologinDefault( bool checked )
{
@@ -501,7 +515,9 @@ UsersPage::addPasswordCheck( const QString& key, const QVariant& value )
{
add_check_libpwquality( m_passwordChecks, value );
}
-#endif
+#endif // CHECK_PWQUALITY
else
+ {
cWarning() << "Unknown password-check key" << key;
+ }
}
diff --git a/src/modules/users/UsersPage.h b/src/modules/users/UsersPage.h
index ac1e1f9db..a2befbd26 100644
--- a/src/modules/users/UsersPage.h
+++ b/src/modules/users/UsersPage.h
@@ -29,6 +29,8 @@
#include
+class QLabel;
+
namespace Ui
{
class Page_UserSetup;
@@ -48,6 +50,8 @@ public:
void onActivate();
void setWriteRootPassword( bool show );
+ void setPasswordCheckboxVisible( bool visible );
+ void setValidatePasswordDefault( bool checked );
void setAutologinDefault( bool checked );
void setReusePasswordDefault( bool checked );
@@ -73,16 +77,20 @@ signals:
void checkReady( bool );
private:
+ /** @brief Is the password acceptable?
+ *
+ * Checks the two copies of the password and places error messages in the
+ * given QLabels. Returns true (and clears the error messages) if the
+ * password is acceptable.
+ */
+ bool checkPasswordAcceptance( const QString& pw1, const QString& pw2, QLabel* badge, QLabel* message );
+
+ void retranslate();
+
Ui::Page_UserSetup* ui;
PasswordCheckList m_passwordChecks;
- const QRegExp USERNAME_RX = QRegExp( "^[a-z_][a-z0-9_-]*[$]?$" );
- const QRegExp HOSTNAME_RX = QRegExp( "^[a-zA-Z0-9][-a-zA-Z0-9_]*$" );
- const int USERNAME_MAX_LENGTH = 31;
- const int HOSTNAME_MIN_LENGTH = 2;
- const int HOSTNAME_MAX_LENGTH = 63;
-
bool m_readyFullName;
bool m_readyUsername;
bool m_customUsername;
@@ -94,4 +102,4 @@ private:
bool m_writeRootPassword;
};
-#endif // USERSPAGE_H
+#endif // USERSPAGE_H
diff --git a/src/modules/users/UsersViewStep.cpp b/src/modules/users/UsersViewStep.cpp
index 0d1bb593e..b898f00c8 100644
--- a/src/modules/users/UsersViewStep.cpp
+++ b/src/modules/users/UsersViewStep.cpp
@@ -29,22 +29,23 @@
#include "GlobalStorage.h"
#include "JobQueue.h"
-CALAMARES_PLUGIN_FACTORY_DEFINITION( UsersViewStepFactory, registerPlugin(); )
+CALAMARES_PLUGIN_FACTORY_DEFINITION( UsersViewStepFactory, registerPlugin< UsersViewStep >(); )
UsersViewStep::UsersViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_widget( new UsersPage() )
{
emit nextStatusChanged( true );
- connect( m_widget, &UsersPage::checkReady,
- this, &UsersViewStep::nextStatusChanged );
+ connect( m_widget, &UsersPage::checkReady, this, &UsersViewStep::nextStatusChanged );
}
UsersViewStep::~UsersViewStep()
{
if ( m_widget && m_widget->parent() == nullptr )
+ {
m_widget->deleteLater();
+ }
}
@@ -116,68 +117,71 @@ UsersViewStep::onLeave()
void
UsersViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
- if ( configurationMap.contains( "defaultGroups" ) &&
- configurationMap.value( "defaultGroups" ).type() == QVariant::List )
+ if ( configurationMap.contains( "defaultGroups" )
+ && configurationMap.value( "defaultGroups" ).type() == QVariant::List )
{
m_defaultGroups = configurationMap.value( "defaultGroups" ).toStringList();
}
else
{
cWarning() << "Using fallback groups. Please check defaultGroups in users.conf";
- m_defaultGroups = QStringList{ "lp", "video", "network", "storage", "wheel", "audio" };
+ m_defaultGroups = QStringList { "lp", "video", "network", "storage", "wheel", "audio" };
}
- if ( configurationMap.contains( "autologinGroup" ) &&
- configurationMap.value( "autologinGroup" ).type() == QVariant::String )
+ if ( configurationMap.contains( "autologinGroup" )
+ && configurationMap.value( "autologinGroup" ).type() == QVariant::String )
{
- Calamares::JobQueue::instance()->globalStorage()->insert( "autologinGroup",
- configurationMap.value( "autologinGroup" ).toString() );
+ Calamares::JobQueue::instance()->globalStorage()->insert(
+ "autologinGroup", configurationMap.value( "autologinGroup" ).toString() );
}
- if ( configurationMap.contains( "sudoersGroup" ) &&
- configurationMap.value( "sudoersGroup" ).type() == QVariant::String )
+ if ( configurationMap.contains( "sudoersGroup" )
+ && configurationMap.value( "sudoersGroup" ).type() == QVariant::String )
{
Calamares::JobQueue::instance()->globalStorage()->insert( "sudoersGroup",
- configurationMap.value( "sudoersGroup" ).toString() );
+ configurationMap.value( "sudoersGroup" ).toString() );
}
- if ( configurationMap.contains( "setRootPassword" ) &&
- configurationMap.value( "setRootPassword" ).type() == QVariant::Bool )
+ if ( configurationMap.contains( "setRootPassword" )
+ && configurationMap.value( "setRootPassword" ).type() == QVariant::Bool )
{
- Calamares::JobQueue::instance()->globalStorage()->insert( "setRootPassword",
- configurationMap.value( "setRootPassword" ).toBool() );
+ Calamares::JobQueue::instance()->globalStorage()->insert(
+ "setRootPassword", configurationMap.value( "setRootPassword" ).toBool() );
m_widget->setWriteRootPassword( configurationMap.value( "setRootPassword" ).toBool() );
}
- if ( configurationMap.contains( "doAutologin" ) &&
- configurationMap.value( "doAutologin" ).type() == QVariant::Bool )
+ if ( configurationMap.contains( "doAutologin" )
+ && configurationMap.value( "doAutologin" ).type() == QVariant::Bool )
{
m_widget->setAutologinDefault( configurationMap.value( "doAutologin" ).toBool() );
}
- if ( configurationMap.contains( "doReusePassword" ) &&
- configurationMap.value( "doReusePassword" ).type() == QVariant::Bool )
+ if ( configurationMap.contains( "doReusePassword" )
+ && configurationMap.value( "doReusePassword" ).type() == QVariant::Bool )
{
m_widget->setReusePasswordDefault( configurationMap.value( "doReusePassword" ).toBool() );
}
- if ( configurationMap.contains( "passwordRequirements" ) &&
- configurationMap.value( "passwordRequirements" ).type() == QVariant::Map )
+ if ( configurationMap.contains( "passwordRequirements" )
+ && configurationMap.value( "passwordRequirements" ).type() == QVariant::Map )
{
auto pr_checks( configurationMap.value( "passwordRequirements" ).toMap() );
- for (decltype(pr_checks)::const_iterator i = pr_checks.constBegin();
- i != pr_checks.constEnd(); ++i)
+ for ( decltype( pr_checks )::const_iterator i = pr_checks.constBegin(); i != pr_checks.constEnd(); ++i )
{
m_widget->addPasswordCheck( i.key(), i.value() );
}
}
+ m_widget->setPasswordCheckboxVisible( CalamaresUtils::getBool( configurationMap, "allowWeakPasswords", false ) );
+ m_widget->setValidatePasswordDefault( !CalamaresUtils::getBool( configurationMap, "allowWeakPasswordsDefault", false) );
+
QString shell( QLatin1String( "/bin/bash" ) ); // as if it's not set at all
if ( configurationMap.contains( "userShell" ) )
+ {
shell = CalamaresUtils::getString( configurationMap, "userShell" );
- // Now it might be explicitly set to empty, which is ok
+ }
+ // Now it might be explicitly set to empty, which is ok
Calamares::JobQueue::instance()->globalStorage()->insert( "userShell", shell );
}
-
diff --git a/src/modules/users/UsersViewStep.h b/src/modules/users/UsersViewStep.h
index a1995497c..6fced76b9 100644
--- a/src/modules/users/UsersViewStep.h
+++ b/src/modules/users/UsersViewStep.h
@@ -65,4 +65,4 @@ private:
CALAMARES_PLUGIN_FACTORY_DECLARATION( UsersViewStepFactory )
-#endif // USERSPAGEPLUGIN_H
+#endif // USERSPAGEPLUGIN_H
diff --git a/src/modules/users/page_usersetup.ui b/src/modules/users/page_usersetup.ui
index c93912c01..b778647d8 100644
--- a/src/modules/users/page_usersetup.ui
+++ b/src/modules/users/page_usersetup.ui
@@ -47,6 +47,9 @@
0
+
+ Your Full Name
+
@@ -137,6 +140,9 @@
0
+
+ login
+
@@ -191,19 +197,6 @@
-
-
-
- font-weight: normal
-
-
- <Username extra label 2 text>
-
-
- true
-
-
-
@@ -246,6 +239,12 @@
0
+
+ <small>This name will be used if you make the computer visible to others on a network.</small>
+
+
+ Computer Name
+
@@ -300,19 +299,6 @@
-
-
-
- font-weight: normal
-
-
- <small>This name will be used if you make the computer visible to others on a network.</small>
-
-
- false
-
-
-
@@ -355,9 +341,15 @@
0
+
+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small>
+ QLineEdit::Password
+
+ Password
+
@@ -374,9 +366,15 @@
0
+
+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small>
+ QLineEdit::Password
+
+ Repeat Password
+
@@ -431,19 +429,6 @@
-
-
-
- font-weight: normal
-
-
- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small>
-
-
- true
-
-
-
@@ -460,6 +445,16 @@
+
+
+
+ When this box is checked, password-strength checking is done and you will not be able to use a weak password.
+
+
+ Require strong passwords.
+
+
+
@@ -516,9 +511,15 @@
0
+
+ <small>Enter the same password twice, so that it can be checked for typing errors.</small>
+ QLineEdit::Password
+
+ Password
+
@@ -535,9 +536,15 @@
0
+
+ <small>Enter the same password twice, so that it can be checked for typing errors.</small>
+ QLineEdit::Password
+
+ Repeat Password
+
@@ -592,19 +599,6 @@
-
-
-
- font-weight: normal
-
-
- <small>Enter the same password twice, so that it can be checked for typing errors.</small>
-
-
- true
-
-
-
diff --git a/src/modules/users/users.conf b/src/modules/users/users.conf
index 0c40faeff..cae9bef0d 100644
--- a/src/modules/users/users.conf
+++ b/src/modules/users/users.conf
@@ -27,26 +27,34 @@ defaultGroups:
# the desktop environment on boot.
# Disable when your Distribution does not require such a group.
autologinGroup: autologin
-# You can control the initial state for the 'autologin checkbox' in UsersViewStep here.
-# Possible values are: true to enable or false to disable the checkbox by default
+# You can control the initial state for the 'autologin checkbox' here.
+# Possible values are:
+# - true to check or
+# - false to uncheck
+# These set the **initial** state of the checkbox.
doAutologin: true
-# When set to a non-empty string, Calamares creates a sudoers file for the user.
-# /etc/sudoers.d/10-installer
-# Remember to add sudoersGroup to defaultGroups.
+# When *sudoersGroup* is set to a non-empty string, Calamares creates a
+# sudoers file for the user. This file is located at:
+# `/etc/sudoers.d/10-installer`
+# Remember to add the (value of) *sudoersGroup* to *defaultGroups*.
#
# If your Distribution already sets up a group of sudoers in its packaging,
# remove this setting (delete or comment out the line below). Otherwise,
-# the setting will be duplicated in the /etc/sudoers.d/10-installer file,
+# the setting will be duplicated in the `/etc/sudoers.d/10-installer` file,
# potentially confusing users.
sudoersGroup: wheel
# Setting this to false , causes the root account to be disabled.
setRootPassword: true
-# You can control the initial state for the 'root password checkbox' in UsersViewStep here.
-# Possible values are: true to enable or false to disable the checkbox by default.
-# When enabled the user password is used for the root account too.
-# NOTE: doReusePassword requires setRootPassword to be enabled.
+# You can control the initial state for the 'reuse password for root'
+# checkbox here. Possible values are:
+# - true to check or
+# - false to uncheck
+#
+# When checked, the user password is used for the root account too.
+#
+# NOTE: *doReusePassword* requires *setRootPassword* to be enabled.
doReusePassword: true
# These are optional password-requirements that a distro can enforce
@@ -68,12 +76,36 @@ doReusePassword: true
#
# (additional checks may be implemented in CheckPWQuality.cpp and
# wired into UsersPage.cpp)
+#
+# - To disable specific password validations:
+# comment out the relevant 'passwordRequirements' keys below.
+# - To disable all password validations:
+# set both 'allowWeakPasswords' and 'allowWeakPasswordsDefault' to true.
+# (That will show the box *Allow weak passwords* in the user-
+# interface, and check it by default).
passwordRequirements:
minLength: -1 # Password at least this many characters
maxLength: -1 # Password at most this many characters
libpwquality:
- minlen=0
- minclass=0
+
+# You can control the visibility of the 'strong passwords' checkbox here.
+# Possible values are:
+# - true to show or
+# - false to hide (default)
+# the checkbox. This checkbox allows the user to choose to disable
+# password-strength-checks. By default the box is **hidden**, so
+# that you have to pick a password that satisfies the checks.
+allowWeakPasswords: false
+# You can control the initial state for the 'strong passwords' checkbox here.
+# Possible values are:
+# - true to uncheck or
+# - false to check (default)
+# the checkbox by default. Since the box is labeled to enforce strong
+# passwords, in order to **allow** weak ones by default, the box needs
+# to be unchecked.
+allowWeakPasswordsDefault: false
# Shell to be used for the regular user of the target system.
# There are three possible kinds of settings: