| 534 | } |
| 535 | |
| 536 | func (u *SSHService) EditRootCert(req dto.RootCertOperate) error { |
| 537 | currentUser, err := user.Current() |
| 538 | if err != nil { |
| 539 | return fmt.Errorf("load current user failed, err: %v", err) |
| 540 | } |
| 541 | certItem, _ := hostRepo.GetCert(repo.WithByID(req.ID)) |
| 542 | if certItem.ID == 0 { |
| 543 | return buserr.New("ErrRecordNotFound") |
| 544 | } |
| 545 | oldPublicItem, err := os.ReadFile(certItem.PublicKeyPath) |
| 546 | if err != nil { |
| 547 | return err |
| 548 | } |
| 549 | |
| 550 | var cert model.RootCert |
| 551 | if err := copier.Copy(&cert, req); err != nil { |
| 552 | return err |
| 553 | } |
| 554 | cert.PrivateKeyPath = fmt.Sprintf("%s/.ssh/%s", currentUser.HomeDir, req.Name) |
| 555 | cert.PublicKeyPath = fmt.Sprintf("%s/.ssh/%s.pub", currentUser.HomeDir, req.Name) |
| 556 | if err := os.WriteFile(cert.PrivateKeyPath, []byte(req.PrivateKey), constant.FilePerm); err != nil { |
| 557 | return err |
| 558 | } |
| 559 | if err := os.WriteFile(cert.PublicKeyPath, []byte(req.PublicKey), constant.FilePerm); err != nil { |
| 560 | return err |
| 561 | } |
| 562 | |
| 563 | authFilePath := currentUser.HomeDir + "/.ssh/authorized_keys" |
| 564 | authItem, err := os.ReadFile(authFilePath) |
| 565 | if err != nil { |
| 566 | return err |
| 567 | } |
| 568 | oldPublic := strings.ReplaceAll(string(oldPublicItem), "\n", "") |
| 569 | newPublic := strings.ReplaceAll(string(req.PublicKey), "\n", "") |
| 570 | lines := strings.Split(string(authItem), "\n") |
| 571 | var newFiles []string |
| 572 | for i := 0; i < len(lines); i++ { |
| 573 | if len(lines[i]) != 0 && lines[i] != oldPublic && lines[i] != newPublic { |
| 574 | newFiles = append(newFiles, lines[i]) |
| 575 | } |
| 576 | } |
| 577 | newFiles = append(newFiles, newPublic) |
| 578 | if err := os.WriteFile(authFilePath, []byte(strings.Join(newFiles, "\n")), constant.FilePerm); err != nil { |
| 579 | return fmt.Errorf("refresh authorized_keys failed, err: %v", err) |
| 580 | } |
| 581 | if len(cert.PassPhrase) != 0 { |
| 582 | cert.PassPhrase, _ = encrypt.StringEncrypt(cert.PassPhrase) |
| 583 | } |
| 584 | return hostRepo.SaveCert(&cert) |
| 585 | } |
| 586 | |
| 587 | func (u *SSHService) SearchRootCerts(req dto.SearchWithPage) (int64, interface{}, error) { |
| 588 | total, records, err := hostRepo.PageCert(req.Page, req.PageSize) |