User.kt 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package org.mjdev.desktop.data
  2. import org.mjdev.desktop.helpers.system.shell.Shell
  3. import okio.Path
  4. import okio.Path.Companion.toPath
  5. import org.mjdev.desktop.extensions.PathExt.lines
  6. import org.mjdev.desktop.icons.user.AccountCircle
  7. import org.mjdev.desktop.context.IDesktopContext
  8. import org.mjdev.desktop.interfaces.IUser
  9. import org.mjdev.desktop.interfaces.IUserDirs
  10. import java.io.File
  11. @Suppress("MemberVisibilityCanBePrivate", "unused")
  12. class User(
  13. val data: String,
  14. val dataItems: List<String> = data.split(":"),
  15. ) : IUser {
  16. override val userName: String
  17. get() = dataItems[0]
  18. override val password: String
  19. get() = dataItems[1]
  20. override val uid: String
  21. get() = dataItems[2]
  22. override val gid: String
  23. get() = dataItems[3]
  24. override val description: String
  25. get() = dataItems[4]
  26. override val home: String
  27. get() = dataItems[5]
  28. override val shell: String
  29. get() = dataItems[6]
  30. override val picture: Any
  31. get() = loadPicture(dataItems[5], ".face") ?: AccountCircle
  32. override val homeDir: Path
  33. get() = home.toPath()
  34. override val isLoggedIn
  35. get() = isLoggedIn(userName)
  36. override val userDirs: IUserDirs
  37. get() = UserDirs(homeDir)
  38. override val config: DesktopConfig
  39. get() = DesktopConfig.load(this) // todo load
  40. override val theme: Theme
  41. get() = Theme.load(this) // todo load
  42. override val backgrounds
  43. get() = config.desktopBackgrounds
  44. override fun toString(): String {
  45. return userName
  46. }
  47. // fun login(
  48. // context: IDesktopContext,
  49. // password: String
  50. // ): Flow<Boolean> = flow { context.login(userName, password) }
  51. companion object {
  52. val NOBODY = User(":x:-1:-1:::")
  53. val DEFAULT = NOBODY
  54. fun isLoggedIn(
  55. uname: String
  56. ): Boolean = Shell.executeAndRead("whoami").trim().contentEquals(uname)
  57. fun loadPicture(
  58. home: String,
  59. pic: String
  60. ): File? = loadPicture(File(home), pic)
  61. fun loadPicture(
  62. homeDir: File,
  63. picName: String
  64. ): File? = File(homeDir, picName).let { f ->
  65. if (f.exists()) f else null
  66. }
  67. fun allUsers(
  68. context: IDesktopContext
  69. ): List<User> = "/etc/passwd".toPath().lines
  70. .filter { t ->
  71. t.contains("/home")
  72. }.map { dir ->
  73. User(dir)
  74. }
  75. }
  76. }