···2020 self.profile_dir = profile_dir
2121 self.root = self.profile_dir / name
22222323- def check(self) -> Optional["Profile"]:
2424- if "/" in self.name:
2525- error("profile name cannot contain slashes")
2626- return None
2727- return self
2828-2929- def exists(self) -> bool:
3030- return self.root.exists() and self.root.is_dir()
2323+ def check_name(self) -> bool:
2424+ if "/" in self.name or self.name in [".", ".."]:
2525+ error("profile name cannot be a path")
2626+ return False
2727+ return True
31283229 def cmdline(self) -> list[str]:
3330 return [
+3-2
src/qbpm/main.py
···190190191191 All QB_ARGS are passed on to qutebrowser."""
192192 profile = Profile(profile_name, **vars(context))
193193+ if not profiles.check(profile):
194194+ sys.exit(1)
193195 exit_with(launch_qutebrowser(profile, foreground, qb_args))
194196195197···223225def edit(context: Context, profile_name: str) -> None:
224226 """Edit a profile's config.py."""
225227 profile = Profile(profile_name, **vars(context))
226226- if not profile.exists():
227227- error(f"profile {profile.name} not found at {profile.root}")
228228+ if not profiles.check(profile):
228229 sys.exit(1)
229230 click.edit(filename=str(profile.root / "config" / "config.py"))
230231
+1-3
src/qbpm/operations.py
···242425252626def desktop(profile: Profile) -> bool:
2727- exists = profile.exists()
2727+ exists = profiles.check(profile)
2828 if exists:
2929 create_desktop_file(profile)
3030- else:
3131- error(f"profile {profile.name} not found at {profile.root}")
3230 return exists
+11-5
src/qbpm/profiles.py
···232324242525def create_profile(profile: Profile, overwrite: bool = False) -> bool:
2626- if not profile.check():
2626+ if not profile.check_name():
2727 return False
28282929 if not overwrite and profile.root.exists():
···5353 out(f"config.source(r'{qb_config_dir / 'config.py'}')")
545455555656-def exists(profile: Profile) -> bool:
5757- if profile.root.exists() and not profile.root.is_dir():
5858- error(f"{profile.root} is not a directory")
5656+def check(profile: Profile) -> bool:
5757+ if not profile.check_name():
5958 return False
6060- if not profile.root.exists():
5959+ exists = profile.root.exists()
6060+ if not exists:
6161 error(f"{profile.root} does not exist")
6262+ return False
6363+ if not profile.root.is_dir():
6464+ error(f"{profile.root} is not a directory")
6565+ return False
6666+ if not (profile.root / "config").is_dir():
6767+ error(f"no config directory in {profile.root}, is it a profile?")
6268 return False
6369 return True
6470