summaryrefslogtreecommitdiffstats
path: root/models/publickey.go
blob: 49863d8c0b8faf53a7f0171d533743c4e17c3497 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package models

import (
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"time"

	"github.com/Unknwon/com"
)

var (
	//publicKeyRootPath string
	sshPath       string
	appPath       string
	tmplPublicKey = "### autogenerated by gitgos, DO NOT EDIT\n" +
		"command=\"%s serv key-%d\",no-port-forwarding," +
		"no-X11-forwarding,no-agent-forwarding,no-pty %s\n"
)

func exePath() (string, error) {
	file, err := exec.LookPath(os.Args[0])
	if err != nil {
		return "", err
	}
	return filepath.Abs(file)
}

func homeDir() string {
	home, err := com.HomeDir()
	if err != nil {
		return "/"
	}
	return home
}

func init() {
	var err error
	appPath, err = exePath()
	if err != nil {
		println(err.Error())
		os.Exit(2)
	}

	sshPath = filepath.Join(homeDir(), ".ssh")
}

type PublicKey struct {
	Id      int64
	OwnerId int64     `xorm:"index"`
	Name    string    `xorm:"unique not null"`
	Content string    `xorm:"text not null"`
	Created time.Time `xorm:"created"`
	Updated time.Time `xorm:"updated"`
}

func GenAuthorizedKey(keyId int64, key string) string {
	return fmt.Sprintf(tmplPublicKey, appPath, keyId, key)
}

func AddPublicKey(key *PublicKey) error {
	_, err := orm.Insert(key)
	if err != nil {
		return err
	}

	err = SaveAuthorizedKeyFile(key)
	if err != nil {
		_, err2 := orm.Delete(key)
		if err2 != nil {
			// TODO: log the error
		}
		return err
	}

	return nil
}

func SaveAuthorizedKeyFile(key *PublicKey) error {
	p := filepath.Join(sshPath, "authorized_keys")
	f, err := os.OpenFile(p, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
	if err != nil {
		return err
	}
	//os.Chmod(p, 0600)
	_, err = f.WriteString(GenAuthorizedKey(key.Id, key.Content))
	return err
}