initial files
Αυτό το commit περιλαμβάνεται σε:
commit
c38f214152
4 αρχεία άλλαξαν με 228 προσθήκες και 0 διαγραφές
8
go.mod
Κανονικό αρχείο
8
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
|
||||||
|
)
|
43
go.sum
Κανονικό αρχείο
43
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=
|
161
main.go
Κανονικό αρχείο
161
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 = `
|
||||||
|
<node>
|
||||||
|
<interface name="org.kde.krunner1">
|
||||||
|
<method name="Actions">
|
||||||
|
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="RemoteActions" />
|
||||||
|
<arg name="matches" type="a(sss)" direction="out" />
|
||||||
|
</method>
|
||||||
|
<method name="Run">
|
||||||
|
<arg name="matchId" type="s" direction="in"/>
|
||||||
|
<arg name="actionId" type="s" direction="in"/>
|
||||||
|
</method>
|
||||||
|
<method name="Match">
|
||||||
|
<arg name="query" type="s" direction="in"/>
|
||||||
|
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="RemoteMatches"/>
|
||||||
|
<arg name="matches" type="a(sssida{sv})" direction="out"/>
|
||||||
|
</method>
|
||||||
|
</interface>` + introspect.IntrospectDataString + `</node>`
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
}
|
||||||
|
|
16
otprunner.desktop
Κανονικό αρχείο
16
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
|
||||||
|
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα