2018-11-01 16:41:07 +03:00
// 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"
2019-12-17 04:49:07 +03:00
"code.gitea.io/gitea/modules/private"
2018-11-01 16:41:07 +03:00
"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)" ,
} ,
} ,
}
func runKeys ( c * cli . Context ) error {
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" )
}
2021-07-14 17:43:13 +03:00
ctx , cancel := installSignals ( )
defer cancel ( )
2019-12-25 18:44:57 +03:00
setup ( "keys.log" , false )
2018-11-01 16:41:07 +03:00
2021-07-14 17:43:13 +03:00
authorizedString , err := private . AuthorizedPublicKeyByContent ( ctx , content )
2018-11-01 16:41:07 +03:00
if err != nil {
return err
}
2019-12-17 04:49:07 +03:00
fmt . Println ( strings . TrimSpace ( authorizedString ) )
2018-11-01 16:41:07 +03:00
return nil
}