From 7d9a191a3c78f7135e7ce3e314290e844fb7edfe Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 1 Nov 2018 13:41:07 +0000 Subject: Create AuthorizedKeysCommand (#5236) --- cmd/cmd.go | 6 ++++- cmd/keys.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 cmd/keys.go (limited to 'cmd') diff --git a/cmd/cmd.go b/cmd/cmd.go index 15dd085247..1ca885a42b 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -27,10 +27,14 @@ func argsSet(c *cli.Context, args ...string) error { } func initDB() error { + return initDBDisableConsole(false) +} + +func initDBDisableConsole(disableConsole bool) error { setting.NewContext() models.LoadConfigs() - setting.NewXORMLogService(false) + setting.NewXORMLogService(disableConsole) if err := models.SetEngine(); err != nil { return fmt.Errorf("models.SetEngine: %v", err) } diff --git a/cmd/keys.go b/cmd/keys.go new file mode 100644 index 0000000000..66565cc563 --- /dev/null +++ b/cmd/keys.go @@ -0,0 +1,85 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package cmd + +import ( + "errors" + "fmt" + "strings" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" + + "github.com/urfave/cli" +) + +// CmdKeys represents the available keys sub-command +var CmdKeys = cli.Command{ + Name: "keys", + Usage: "This command queries the Gitea database to get the authorized command for a given ssh key fingerprint", + Action: runKeys, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "expected, e", + Value: "git", + Usage: "Expected user for whom provide key commands", + }, + cli.StringFlag{ + Name: "username, u", + Value: "", + Usage: "Username trying to log in by SSH", + }, + cli.StringFlag{ + Name: "type, t", + Value: "", + Usage: "Type of the SSH key provided to the SSH Server (requires content to be provided too)", + }, + cli.StringFlag{ + Name: "content, k", + Value: "", + Usage: "Base64 encoded content of the SSH key provided to the SSH Server (requires type to be provided too)", + }, + cli.StringFlag{ + Name: "config, c", + Value: "custom/conf/app.ini", + Usage: "Custom configuration file path", + }, + }, +} + +func runKeys(c *cli.Context) error { + if c.IsSet("config") { + setting.CustomConf = c.String("config") + } + + if !c.IsSet("username") { + return errors.New("No username provided") + } + // Check username matches the expected username + if strings.TrimSpace(c.String("username")) != strings.TrimSpace(c.String("expected")) { + return nil + } + + content := "" + + if c.IsSet("type") && c.IsSet("content") { + content = fmt.Sprintf("%s %s", strings.TrimSpace(c.String("type")), strings.TrimSpace(c.String("content"))) + } + + if content == "" { + return errors.New("No key type and content provided") + } + + if err := initDBDisableConsole(true); err != nil { + return err + } + + publicKey, err := models.SearchPublicKeyByContent(content) + if err != nil { + return err + } + fmt.Println(publicKey.AuthorizedString()) + return nil +} -- cgit v1.2.3