2014-02-17 19:57:23 +04:00
package models
import (
"fmt"
"os"
2014-02-25 12:13:47 +04:00
"os/exec"
2014-02-25 14:58:55 +04:00
"os/user"
2014-02-17 19:57:23 +04:00
"path/filepath"
"time"
)
var (
2014-02-25 14:58:55 +04:00
//publicKeyRootPath string
sshPath string
appPath string
tmplPublicKey = "### autogenerated by gitgos, DO NOT EDIT\n" +
2014-02-25 12:13:47 +04:00
"command=\"%s serv key-%d\",no-port-forwarding," +
"no-X11-forwarding,no-agent-forwarding,no-pty %s\n"
2014-02-17 19:57:23 +04:00
)
2014-02-25 12:13:47 +04:00
func exePath ( ) ( string , error ) {
file , err := exec . LookPath ( os . Args [ 0 ] )
if err != nil {
return "" , err
}
return filepath . Abs ( file )
}
2014-02-25 14:58:55 +04:00
func homeDir ( ) string {
user , err := user . Current ( )
if err != nil {
return "/"
}
return user . HomeDir
}
2014-02-25 12:13:47 +04:00
func init ( ) {
var err error
appPath , err = exePath ( )
if err != nil {
println ( err . Error ( ) )
os . Exit ( 2 )
}
2014-02-25 14:58:55 +04:00
sshPath = filepath . Join ( homeDir ( ) , ".ssh" )
2014-02-25 12:13:47 +04:00
}
2014-02-17 19:57:23 +04:00
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" `
}
2014-02-25 12:13:47 +04:00
func GenAuthorizedKey ( keyId int64 , key string ) string {
return fmt . Sprintf ( tmplPublicKey , appPath , keyId , key )
2014-02-17 19:57:23 +04:00
}
2014-02-25 14:30:48 +04:00
func AddPublicKey ( key * PublicKey ) error {
2014-02-17 19:57:23 +04:00
_ , err := orm . Insert ( key )
if err != nil {
return err
}
2014-02-25 12:13:47 +04:00
err = SaveAuthorizedKeyFile ( key )
2014-02-17 19:57:23 +04:00
if err != nil {
_ , err2 := orm . Delete ( key )
if err2 != nil {
// TODO: logo the error
}
return err
}
return nil
}
2014-02-25 12:13:47 +04:00
func SaveAuthorizedKeyFile ( key * PublicKey ) error {
p := filepath . Join ( sshPath , "authorized_keys" )
2014-02-25 14:30:48 +04:00
f , err := os . OpenFile ( p , os . O_CREATE | os . O_WRONLY | os . O_APPEND , 0600 )
2014-02-17 19:57:23 +04:00
if err != nil {
return err
}
2014-02-25 14:30:48 +04:00
//os.Chmod(p, 0600)
2014-02-25 12:13:47 +04:00
_ , err = f . WriteString ( GenAuthorizedKey ( key . Id , key . Content ) )
2014-02-17 19:57:23 +04:00
return err
}