root.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // package root -- объект рута
  2. package root
  3. import (
  4. "fmt"
  5. "log"
  6. "strings"
  7. "time"
  8. "wartank/desktop/root/win_root_login"
  9. "wartank/desktop/root/win_root_set"
  10. "wartank/pkg/components/safebool"
  11. "wartank/pkg/types"
  12. )
  13. // Root -- объект рута
  14. type Root struct {
  15. desktop types.IDesktop
  16. ws types.IWebSocket
  17. isLogin *safebool.SafeBool
  18. isPassSet *safebool.SafeBool
  19. winRootMake *win_root_set.WinRootMake
  20. winRootLogin *win_root_login.WinRootLogin
  21. }
  22. // NewRoot -- вовзращает новый объект рута
  23. func NewRoot(desktop types.IDesktop) (*Root, error) {
  24. log.Println("NewRoot()")
  25. if desktop == nil {
  26. return nil, fmt.Errorf("NewRoot(): IDesktop == nil")
  27. }
  28. sf := &Root{
  29. desktop: desktop,
  30. ws: desktop.Ws(),
  31. isLogin: safebool.NewSafeBool(),
  32. isPassSet: safebool.NewSafeBool(),
  33. }
  34. sf.checkRoot()
  35. return sf, nil
  36. }
  37. // Проверяет, есть ли рут в системе
  38. func (sf *Root) checkRoot() {
  39. log.Println("Root.checkRoot()")
  40. for { // Цикл ожидания рут-пароля (если его нет)
  41. isExists := sf.checkIsExists()
  42. if !isExists {
  43. sf.makePassRoot() // Раз пользователь сам создал пароль, то и проверка логина не нужна
  44. return
  45. }
  46. // Пароля уже есть, проверяем логин
  47. sf.checkLogin()
  48. return
  49. }
  50. // Запрос пароля рута
  51. // winUsers, err := win_users.NewWinUsers(sf.desktop)
  52. // if err != nil {
  53. // log.Printf("Root.checkRoot(): in create WinUsers, err=\n\t%v\n", err)
  54. // return
  55. // }
  56. // go winUsers.Run()
  57. }
  58. // Проверка логина
  59. func (sf *Root) checkLogin() {
  60. log.Println("Root.checkLogin()")
  61. sf.makeWinLogin()
  62. strPass := sf.winRootLogin.GetPass()
  63. dictReq := make(map[string]string)
  64. dictReq["pass"] = strPass
  65. for {
  66. dictResp, err := sf.ws.Call("/root/password/check", dictReq)
  67. if err != nil {
  68. err = fmt.Errorf("Root.checkLogin(): при выполнении запроса, err=\n\t%w", err)
  69. sf.winRootLogin.SetError(err)
  70. time.Sleep(time.Second * 2)
  71. continue
  72. }
  73. log.Printf("WinRootLogin.onCheckPass(): resp=%q\n", dictResp)
  74. strErr := dictResp["err"]
  75. if strErr != "" {
  76. err = fmt.Errorf("Root.checkLogin(): при сравнении паролей, err=\n\t%q", strErr)
  77. sf.winRootLogin.SetError(err)
  78. time.Sleep(time.Second * 2)
  79. for {
  80. oldPass := strPass
  81. strPass = sf.winRootLogin.GetPass()
  82. if oldPass != strPass {
  83. break
  84. }
  85. time.Sleep(time.Millisecond * 100)
  86. }
  87. dictReq["pass"] = strPass
  88. continue
  89. }
  90. // Всё ништяк
  91. sf.winRootLogin.Close()
  92. sf.isPassSet.Set()
  93. return
  94. }
  95. }
  96. // Показывает окно логина
  97. func (sf *Root) makeWinLogin() {
  98. log.Println("Root.makeWinLogin()")
  99. var err error
  100. for {
  101. sf.winRootLogin, err = win_root_login.NewWinRootLogin(sf.desktop)
  102. if err != nil {
  103. log.Printf("Root.makeWinLogin(): in create WinRootLogin, err=\n\t%v\n", err)
  104. time.Sleep(time.Second * 2)
  105. continue
  106. }
  107. break
  108. }
  109. go sf.winRootLogin.Run()
  110. }
  111. // Проверка на существование пароля рута
  112. func (sf *Root) checkIsExists() bool {
  113. log.Println("Root.checkIsExists()")
  114. var strErr string
  115. for {
  116. dictRoot, err := sf.ws.Read("/root/password/is_exists")
  117. if err != nil {
  118. log.Printf("Root.checkRoot(): in get password root, err=\n\t%v\n", err)
  119. time.Sleep(time.Second * 2)
  120. continue
  121. }
  122. strErr = dictRoot["err"]
  123. if strings.Contains(strErr, "leveldb: not found") {
  124. log.Printf("Root.checkRoot(): первый запуск, пароль рута не задан\n")
  125. return false
  126. }
  127. strIsExists := dictRoot["/root/password/is_exists"]
  128. if strIsExists == "true" {
  129. return true
  130. }
  131. return false
  132. }
  133. }
  134. // Создаёт пароль рута
  135. func (sf *Root) makePassRoot() {
  136. log.Println("Root.makePassRoot()")
  137. sf.makeWinRootMake()
  138. strPass := sf.winRootMake.GetPass()
  139. dictReq := make(map[string]string)
  140. dictReq["pass"] = strPass
  141. for {
  142. err := sf.ws.Write("/root/password/set", dictReq)
  143. if err != nil {
  144. sf.winRootMake.SetError(err)
  145. time.Sleep(time.Second * 2)
  146. continue
  147. }
  148. sf.winRootMake.Close()
  149. break
  150. }
  151. }
  152. // Показывает окно создания пароля рута
  153. func (sf *Root) makeWinRootMake() {
  154. var err error
  155. for {
  156. sf.winRootMake, err = win_root_set.NewWinRootMake(sf.desktop)
  157. if err == nil {
  158. go sf.winRootMake.Run()
  159. return
  160. }
  161. log.Printf("Root.makeWinRootMake(): in create WinRoot, err=\n\t%v\n", err)
  162. time.Sleep(time.Second * 2)
  163. continue
  164. }
  165. }