From c38f214152848e0ce0b07cdc637bf373aaee6fb1 Mon Sep 17 00:00:00 2001 From: infl00p Date: Tue, 20 Jul 2021 18:20:29 +0300 Subject: [PATCH] initial files --- go.mod | 8 +++ go.sum | 43 +++++++++++++ main.go | 161 ++++++++++++++++++++++++++++++++++++++++++++++ otprunner.desktop | 16 +++++ 4 files changed, 228 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 otprunner.desktop diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..47b553c --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/infl00p/otprunner + +go 1.16 + +require ( + github.com/99designs/keyring v1.1.6 + github.com/godbus/dbus v4.1.0+incompatible +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..dfa90ec --- /dev/null +++ b/go.sum @@ -0,0 +1,43 @@ +github.com/99designs/keyring v1.1.6 h1:kVDC2uCgVwecxCk+9zoCt2uEL6dt+dfVzMvGgnVcIuM= +github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus v4.1.0+incompatible h1:WqqLRTsQic3apZUK9qC5sGNfXthmPXzUZ7nQPrNITa4= +github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/main.go b/main.go new file mode 100644 index 0000000..27cafde --- /dev/null +++ b/main.go @@ -0,0 +1,161 @@ +package main + +import ( + "log" + "os/exec" + "strings" + + "github.com/godbus/dbus" + "github.com/godbus/dbus/introspect" + "github.com/99designs/keyring" +) + +var messages = map[string]string{ + "errconn": "DBus Connection Problem", + "errname": "DBus Unable to request name or name taken", +} + +const servicename = "labs.infl00p.otp" +const ifacename = "org.kde.krunner1" +const ifacepath = "/krunner" + +const intro = ` + + + + + + + + + + + + + + + + ` + introspect.IntrospectDataString + `` + +type runner struct { + wallet keyring.Keyring +} + +type match struct { + ID string + Text string + IconName string + Type int32 + Relevance float64 + Properties map[string]interface{} +} + +func main() { + + var r runner + + // Open Dbus Connection + conn, err := dbus.SessionBus() + if err != nil { + log.Fatal(messages["errconn"]) + } + + rep, err := conn.RequestName(servicename, dbus.NameFlagDoNotQueue) + if err != nil || rep != dbus.RequestNameReplyPrimaryOwner { + log.Fatal(messages["errname"]) + } + + // KWallet + wallet, err := keyring.Open(keyring.Config{ + AllowedBackends: []keyring.BackendType{keyring.KWalletBackend}, + ServiceName: "kdewallet", + KWalletFolder: "otprunner", + }) + if err != nil { + log.Fatal("Unable to Open KDE Wallet ", err.Error()) + } + r.wallet = wallet + + conn.Export(r, ifacepath, ifacename) + conn.Export(introspect.Introspectable(intro), ifacepath, "org.freedesktop.DBus.Introspectable") + + // block + select {} +} + +func (r runner) Actions() ([]string, *dbus.Error) { + return []string{}, nil +} + +func (r runner) Match(query string) ([]match, *dbus.Error) { + key := strings.Split(query, " ") + matches := make([]match,0,100) + + // List all keys in keyring + keys, err := r.wallet.Keys() + if err != nil { + log.Fatal("List Keys ", err.Error()) + } + + if len(key) > 1 && key[0] == "otp" { + if len(keys) > 0 { + size:=0 + rel:=1.0 + for i, v := range(keys) { + if v != "" && strings.Contains(v,key[1]) { + log.Println(size) + matches=matches[:size+1] + matches[size].ID = strings.ToLower(strings.Replace(v," ", "_",-1)) + matches[size].Text = v + matches[size].IconName = "document-export-key" + matches[size].Type = 100 + matches[size].Relevance = rel + rel= rel/1.1 + size+=1 + log.Println(i, matches[i]) + } + } + return matches, nil + } + } + return matches, nil +} + +func (r runner) Run(selection string, id string) *dbus.Error { + code, _ := r.wallet.Get(selection) + log.Println(code.Data) + err := AddToClipboard(string(code.Data)) + if err != nil { + log.Fatal(err) + } + + return nil +} + +func AddToClipboard(s string) error { + cmd := exec.Command("xclip","-r","-selection","clipboard") + stdin, err := cmd.StdinPipe() + if err != nil { + return err + } + err = cmd.Start() + if err != nil { + return err + } + _, err = stdin.Write([]byte(s)) + if err != nil { + return err + } + err = stdin.Close() + if err != nil { + return err + } + err = cmd.Wait() + if err != nil { + return err + } + + return nil + +} + diff --git a/otprunner.desktop b/otprunner.desktop new file mode 100644 index 0000000..252113e --- /dev/null +++ b/otprunner.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Name=OTPrunner +Comment=OTP Runner +X-KDE-ServiceTypes=Plasma/Runner +Type=Service +Icon=internet-web-browser +X-KDE-PluginInfo-Author=infL00p Labs +X-KDE-PluginInfo-Email=infl00p@gmail.com +X-KDE-PluginInfo-Name=otprunner +X-KDE-PluginInfo-Version=0.1 +X-KDE-PluginInfo-License=GPL-3.0 +X-KDE-PluginInfo-EnabledByDefault=true +X-Plasma-API=DBus +X-Plasma-DBusRunner-Service=labs.infl00p.otp +X-Plasma-DBusRunner-Path=/krunner +