Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "log"
- "os/exec"
- "strings"
- "github.com/abiosoft/ishell"
- "github.com/pkg/errors"
- "pkg.deepin.io/lib/dbus1"
- "pkg.deepin.io/lib/dbusutil"
- )
- var globalAgents = make(map[string]*Agent)
- func getAgent(id string) *Agent {
- return globalAgents[id]
- }
- type Agent struct {
- name string
- shell *ishell.Shell
- methods *struct {
- RequestEchoOff func() `in:"msg" out:"result"`
- RequestEchoOn func() `in:"msg" out:"result"`
- DisplayErrorMsg func() `in:"msg"`
- DisplayTextInfo func() `in:"msg"`
- RespondResult func() `in:"cookie" out:"result"`
- }
- txObj dbus.BusObject
- }
- func newAgent(id string, shell *ishell.Shell) *Agent {
- return &Agent{
- name: id,
- shell: shell,
- }
- }
- func (ag *Agent) getPath() dbus.ObjectPath {
- return dbus.ObjectPath(dbusAgentPathPrefix + ag.name)
- }
- const (
- authorityServiceName = "com.deepin.daemon.Authority"
- dbusAgentPathPrefix = "/user/swt/agent_"
- dbusAgentInterface = "com.deepin.daemon.Authority.Agent"
- )
- func (*Agent) GetInterfaceName() string {
- return dbusAgentInterface
- }
- func (ag *Agent) RequestEchoOff(msg string) (string, *dbus.Error) {
- ag.shell.Printf("RequestEchoOff: %q\n", msg)
- password, err := getSecretFromUI()
- if err != nil {
- ag.shell.Println("err:", err)
- return "", dbusutil.ToError(err)
- }
- ag.shell.Printf("password: %q\n", password)
- return password, nil
- }
- func (ag *Agent) RequestEchoOn(msg string) (string, *dbus.Error) {
- ag.shell.Printf("RequestEchoOn: %q\n", msg)
- input, err := getStrFromUI(msg)
- if err != nil {
- ag.shell.Println("err:", err)
- return "", dbusutil.ToError(err)
- }
- ag.shell.Printf("input: %q\n", input)
- return input, nil
- }
- func (ag *Agent) DisplayErrorMsg(msg string) *dbus.Error {
- ag.shell.Println("DisplayErrorMsg:", msg)
- return nil
- }
- func (ag *Agent) DisplayTextInfo(msg string) *dbus.Error {
- ag.shell.Println("DisplayTextInfo:", msg)
- return nil
- }
- func (ag *Agent) RespondResult(cookie string) *dbus.Error {
- ag.shell.Println("RespondResult:", cookie)
- if cookie == "" {
- ag.shell.Println("auth failed")
- }
- return nil
- }
- var authorityObj dbus.BusObject
- func authorityStart(authType, user string, dbusPath dbus.ObjectPath) (txObjPath dbus.ObjectPath, err error) {
- err = authorityObj.Call("com.deepin.daemon.Authority.Start", 0, authType, user, dbus.ObjectPath(dbusPath)).Store(&txObjPath)
- return
- }
- func main() {
- service, err := dbusutil.NewSystemService()
- if err != nil {
- log.Fatal(err)
- }
- authorityObj = service.Conn().Object(authorityServiceName, "/com/deepin/daemon/Authority")
- shell := ishell.New()
- shell.Println("i shell")
- shell.AddCmd(&ishell.Cmd{
- Name: "start",
- Help: "start $authType $user $agentId",
- Func: func(c *ishell.Context) {
- if len(c.Args) != 3 {
- c.Err(errors.New("len args != 3"))
- return
- }
- authType := c.Args[0]
- user := c.Args[1]
- agId := c.Args[2]
- c.Printf("authType: %q, user: %q, agentId: %q\n",
- authType, user, agId)
- ag := getAgent(agId)
- if ag != nil {
- c.Err(errors.New("agent existed"))
- return
- }
- ag = newAgent(agId, shell)
- agPath := ag.getPath()
- err := service.Export(agPath, ag)
- if err != nil {
- c.Err(err)
- return
- }
- txObjPath, err := authorityStart(authType, user, agPath)
- if err != nil {
- c.Err(err)
- // stop export ag
- err = service.StopExport(ag)
- if err != nil {
- c.Err(err)
- }
- return
- }
- c.Println("tx obj:", txObjPath)
- ag.txObj = service.Conn().Object(authorityServiceName, txObjPath)
- globalAgents[agId] = ag
- },
- })
- shell.AddCmd(&ishell.Cmd{
- Name: "auth",
- Help: "auth $agentId",
- Func: func(c *ishell.Context) {
- if len(c.Args) != 1 {
- c.Err(errors.New("len args != 1"))
- return
- }
- agId := c.Args[0]
- ag := getAgent(agId)
- if ag == nil {
- c.Err(errors.New("agent not found"))
- return
- }
- err = ag.txObj.Call(
- "com.deepin.daemon.Authority.Transaction.Authenticate", 0).Err
- if err != nil {
- c.Err(err)
- return
- }
- },
- })
- shell.AddCmd(&ishell.Cmd{
- Name: "end",
- Help: "end $agentId",
- Func: func(c *ishell.Context) {
- if len(c.Args) != 1 {
- c.Err(errors.New("len args != 1"))
- return
- }
- agId := c.Args[0]
- ag := getAgent(agId)
- if ag == nil {
- c.Err(errors.New("agent not found"))
- return
- }
- err = ag.txObj.Call(
- "com.deepin.daemon.Authority.Transaction.End", 0).Err
- if err != nil {
- c.Err(err)
- return
- }
- },
- })
- shell.AddCmd(&ishell.Cmd{
- Name: "set-user",
- Help: "set-user $agentId $user",
- Func: func(c *ishell.Context) {
- if len(c.Args) != 2 {
- c.Err(errors.New("len args != 2"))
- return
- }
- agId := c.Args[0]
- ag := getAgent(agId)
- if ag == nil {
- c.Err(errors.New("agent not found"))
- return
- }
- user := c.Args[1]
- err = ag.txObj.Call(
- "com.deepin.daemon.Authority.Transaction.SetUser", 0, user).Err
- if err != nil {
- c.Err(err)
- return
- }
- },
- })
- shell.AddCmd(&ishell.Cmd{
- Name: "ls",
- Help: "list agents",
- Func: func(c *ishell.Context) {
- for id, ag := range globalAgents {
- err = ag.txObj.Call("org.freedesktop.DBus.Properties.GetAll", 0,
- "com.deepin.daemon.Authority.Transaction").Err
- c.Printf("id: %q, path: %q, exist: %v\n",
- id, ag.txObj.Path(), err == nil)
- }
- },
- })
- shell.Run()
- shell.Close()
- }
- func getStrFromUI(msg string) (string, error) {
- out, err := exec.Command("zenity", "--entry", "--text="+msg).Output()
- if err != nil {
- return "", err
- }
- return strings.TrimSpace(string(out)), nil
- }
- func getSecretFromUI() (string, error) {
- out, err := exec.Command("zenity", "--password").Output()
- if err != nil {
- return "", err
- }
- return strings.TrimSpace(string(out)), nil
- }
- func getBoolFromUI(msg string) bool {
- err := exec.Command("zenity", "--question", "--text="+msg).Run()
- return err == nil
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement