Skip to content

Commit 8d29fbd

Browse files
authored
Revert "Move root password menu into authentication menu (#3650)"
This reverts commit e0c3bb3.
1 parent e0c3bb3 commit 8d29fbd

7 files changed

Lines changed: 39 additions & 71 deletions

File tree

archinstall/lib/args.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
from archinstall.lib.models.packages import Repository
2424
from archinstall.lib.models.profile import ProfileConfiguration
2525
from archinstall.lib.models.users import Password, User
26-
from archinstall.lib.models.profile_model import ProfileConfiguration
27-
from archinstall.lib.models.users import Password, User, UserSerialization
2826
from archinstall.lib.output import debug, error, logger, warn
2927
from archinstall.lib.plugins import load_plugin
3028
from archinstall.lib.translationhandler import Language, tr, translation_handler
@@ -80,15 +78,14 @@ class ArchConfig:
8078

8179
# Special fields that should be handle with care due to security implications
8280
users: list[User] = field(default_factory=list)
81+
root_enc_password: Password | None = None
8382

8483
def unsafe_json(self) -> dict[str, Any]:
85-
config: dict[str, list[UserSerialization] | str | None] = {
84+
config = {
8685
'users': [user.json() for user in self.users],
86+
'root_enc_password': self.root_enc_password.enc_password if self.root_enc_password else None,
8787
}
8888

89-
if self.auth_config and self.auth_config.root_enc_password:
90-
config['root_enc_password'] = self.auth_config.root_enc_password.enc_password
91-
9289
if self.disk_config:
9390
disk_encryption = self.disk_config.disk_encryption
9491
if disk_encryption and disk_encryption.encryption_password:
@@ -225,17 +222,11 @@ def from_config(cls, args_config: dict[str, Any]) -> 'ArchConfig':
225222
arch_config.services = services
226223

227224
# DEPRECATED: backwards compatibility
228-
root_password = None
229225
if root_password := args_config.get('!root-password', None):
230-
root_password = Password(plaintext=root_password)
226+
arch_config.root_enc_password = Password(plaintext=root_password)
231227

232228
if enc_password := args_config.get('root_enc_password', None):
233-
root_password = Password(enc_password=enc_password)
234-
235-
if root_password is not None:
236-
if arch_config.auth_config is None:
237-
arch_config.auth_config = AuthenticationConfiguration()
238-
arch_config.auth_config.root_enc_password = root_password
229+
arch_config.root_enc_password = Password(enc_password=enc_password)
239230

240231
if custom_commands := args_config.get('custom_commands', []):
241232
arch_config.custom_commands = custom_commands

archinstall/lib/authentication/authentication_menu.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
from archinstall.lib.disk.fido import Fido2
44
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
55
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
6-
from archinstall.lib.models.users import Password
76
from archinstall.lib.translationhandler import tr
8-
from archinstall.lib.utils.util import get_password
97
from archinstall.tui.curses_menu import SelectMenu
108
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
119
from archinstall.tui.result import ResultType
@@ -35,12 +33,6 @@ def run(self, additional_title: str | None = None) -> AuthenticationConfiguratio
3533

3634
def _define_menu_options(self) -> list[MenuItem]:
3735
return [
38-
MenuItem(
39-
text=tr('Root password'),
40-
action=select_root_password,
41-
preview_action=self._prev_root_pwd,
42-
key='root_enc_password',
43-
),
4436
MenuItem(
4537
text=tr('U2F login setup'),
4638
action=select_u2f_login,
@@ -50,18 +42,6 @@ def _define_menu_options(self) -> list[MenuItem]:
5042
),
5143
]
5244

53-
def _prev_root_pwd(self, item: MenuItem) -> str | None:
54-
if item.value is not None:
55-
password: Password = item.value
56-
return f'{tr("Root password")}: {password.hidden()}'
57-
return None
58-
59-
def _depends_on_u2f(self) -> bool:
60-
devices = Fido2.get_fido2_devices()
61-
if not devices:
62-
return False
63-
return True
64-
6545
def _prev_u2f_login(self, item: MenuItem) -> str | None:
6646
if item.value is not None:
6747
u2f_config: U2FLoginConfiguration = item.value
@@ -81,11 +61,6 @@ def _prev_u2f_login(self, item: MenuItem) -> str | None:
8161
return None
8262

8363

84-
def select_root_password(preset: str | None = None) -> Password | None:
85-
password = get_password(text=tr('Root password'), allow_skip=True)
86-
return password
87-
88-
8964
def select_u2f_login(preset: U2FLoginConfiguration) -> U2FLoginConfiguration | None:
9065
devices = Fido2.get_fido2_devices()
9166
if not devices:

archinstall/lib/global_menu.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,10 @@
3434
from .models.packages import Repository
3535
from .models.profile import ProfileConfiguration
3636
from .models.users import Password, User
37-
from .models.profile_model import ProfileConfiguration
38-
from .models.users import User
3937
from .output import FormattedOutput
4038
from .pacman.config import PacmanConfig
4139
from .translationhandler import Language, tr, translation_handler
40+
from .utils.util import get_password
4241

4342

4443
class GlobalMenu(AbstractMenu[None]):
@@ -111,9 +110,16 @@ def _get_menu_options(self) -> list[MenuItem]:
111110
preview_action=self._prev_hostname,
112111
key='hostname',
113112
),
113+
MenuItem(
114+
text=tr('Root password'),
115+
action=self._set_root_password,
116+
preview_action=self._prev_root_pwd,
117+
key='root_enc_password',
118+
),
114119
MenuItem(
115120
text=tr('Authentication'),
116121
action=self._select_authentication,
122+
value=[],
117123
preview_action=self._prev_authentication,
118124
key='auth_config',
119125
),
@@ -224,16 +230,13 @@ def has_superuser() -> bool:
224230

225231
missing = set()
226232

227-
item: MenuItem = self._item_group.find_by_key('auth_config')
228-
auth_config: AuthenticationConfiguration | None = item.value
229-
230-
if (auth_config is None or auth_config.root_enc_password is None) and not has_superuser():
231-
missing.add(
232-
tr('Either root-password or at least 1 user with sudo privileges must be specified'),
233-
)
234-
235233
for item in self._item_group.items:
236-
if item.mandatory:
234+
if item.key in ['root_enc_password', 'users']:
235+
if not check('root_enc_password') and not has_superuser():
236+
missing.add(
237+
tr('Either root-password or at least 1 user with sudo privileges must be specified'),
238+
)
239+
elif item.mandatory:
237240
assert item.key is not None
238241
if not check(item.key):
239242
missing.add(item.text)
@@ -311,9 +314,6 @@ def _prev_authentication(self, item: MenuItem) -> str | None:
311314
auth_config: AuthenticationConfiguration = item.value
312315
output = ''
313316

314-
if auth_config.root_enc_password:
315-
output += f'{tr("Root password")}: {auth_config.root_enc_password.hidden()}\n'
316-
317317
if auth_config.u2f_config:
318318
u2f_config = auth_config.u2f_config
319319
login_method = u2f_config.u2f_login_method.display_value()
@@ -400,6 +400,12 @@ def _prev_hostname(self, item: MenuItem) -> str | None:
400400
return f'{tr("Hostname")}: {item.value}'
401401
return None
402402

403+
def _prev_root_pwd(self, item: MenuItem) -> str | None:
404+
if item.value is not None:
405+
password: Password = item.value
406+
return f'{tr("Root password")}: {password.hidden()}'
407+
return None
408+
403409
def _prev_parallel_dw(self, item: MenuItem) -> str | None:
404410
if item.value is not None:
405411
return f'{tr("Parallel Downloads")}: {item.value}'
@@ -504,6 +510,10 @@ def _prev_profile(self, item: MenuItem) -> str | None:
504510

505511
return None
506512

513+
def _set_root_password(self, preset: str | None = None) -> Password | None:
514+
password = get_password(text=tr('Root password'), allow_skip=True)
515+
return password
516+
507517
def _select_disk_config(
508518
self,
509519
preset: DiskLayoutConfiguration | None = None,

archinstall/lib/models/authentication.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from enum import Enum
33
from typing import Any, NotRequired, TypedDict
44

5-
from archinstall.lib.models.users import Password
65
from archinstall.lib.translationhandler import tr
76

87

@@ -59,7 +58,6 @@ def parse_arg(args: U2FLoginConfigSerialization) -> 'U2FLoginConfiguration | Non
5958

6059
@dataclass
6160
class AuthenticationConfiguration:
62-
root_enc_password: Password | None = None
6361
u2f_config: U2FLoginConfiguration | None = None
6462

6563
@staticmethod
@@ -69,9 +67,6 @@ def parse_arg(args: dict[str, Any]) -> 'AuthenticationConfiguration':
6967
if (u2f_config := args.get('u2f_config')) is not None:
7068
auth_config.u2f_config = U2FLoginConfiguration.parse_arg(u2f_config)
7169

72-
if enc_password := args.get('root_enc_password'):
73-
auth_config.root_enc_password = Password(enc_password=enc_password)
74-
7570
return auth_config
7671

7772
def json(self) -> AuthenticationSerialization:

archinstall/lib/models/users.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ def _check_password_strength(
100100
return PasswordStrength.VERY_WEAK
101101

102102

103-
UserSerialization = TypedDict(
104-
'UserSerialization',
103+
_UserSerialization = TypedDict(
104+
'_UserSerialization',
105105
{
106106
'username': str,
107107
'!password': NotRequired[str],
@@ -173,7 +173,7 @@ def table_data(self) -> dict[str, str | bool | list[str]]:
173173
'groups': self.groups,
174174
}
175175

176-
def json(self) -> UserSerialization:
176+
def json(self) -> _UserSerialization:
177177
return {
178178
'username': self.username,
179179
'enc_password': self.password.enc_password,
@@ -184,7 +184,7 @@ def json(self) -> UserSerialization:
184184
@classmethod
185185
def parse_arguments(
186186
cls,
187-
args: list[UserSerialization],
187+
args: list[_UserSerialization],
188188
) -> list['User']:
189189
users: list[User] = []
190190

archinstall/scripts/guided.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ def perform_installation(mountpoint: Path) -> None:
138138
if accessibility_tools_in_use():
139139
installation.enable_espeakup()
140140

141-
if config.auth_config and config.auth_config.root_enc_password:
142-
root_user = User('root', config.auth_config.root_enc_password, False)
141+
if root_pw := config.root_enc_password:
142+
root_user = User('root', root_pw, False)
143143
installation.set_user_password(root_user)
144144

145145
if (profile_config := config.profile_config) and profile_config.profile:

tests/test_args.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ def test_config_file_parsing(
134134
audio_config=AudioConfiguration(audio=Audio.PIPEWIRE),
135135
),
136136
auth_config=AuthenticationConfiguration(
137-
root_enc_password=Password(enc_password='password_hash'),
138137
u2f_config=U2FLoginConfiguration(
139138
u2f_login_method=U2FLoginMethod.Passwordless,
140139
passwordless_sudo=True,
@@ -224,6 +223,7 @@ def test_config_file_parsing(
224223
),
225224
],
226225
services=['service_1', 'service_2'],
226+
root_enc_password=Password(enc_password='password_hash'),
227227
custom_commands=["echo 'Hello, World!'"],
228228
)
229229

@@ -280,8 +280,7 @@ def test_deprecated_creds_config_parsing(
280280
handler = ArchConfigHandler()
281281
arch_config = handler.config
282282

283-
assert arch_config.auth_config is not None
284-
assert arch_config.auth_config.root_enc_password == Password(plaintext='rootPwd')
283+
assert arch_config.root_enc_password == Password(plaintext='rootPwd')
285284

286285
assert arch_config.users == [
287286
User(
@@ -332,8 +331,7 @@ def test_encrypted_creds_with_arg(
332331
handler = ArchConfigHandler()
333332
arch_config = handler.config
334333

335-
assert arch_config.auth_config is not None
336-
assert arch_config.auth_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7')
334+
assert arch_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7')
337335
assert arch_config.users == [
338336
User(
339337
username='t',
@@ -361,8 +359,7 @@ def test_encrypted_creds_with_env_var(
361359
handler = ArchConfigHandler()
362360
arch_config = handler.config
363361

364-
assert arch_config.auth_config is not None
365-
assert arch_config.auth_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7')
362+
assert arch_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7')
366363
assert arch_config.users == [
367364
User(
368365
username='t',

0 commit comments

Comments
 (0)