github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/externals/proof_service_github.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package externals
     5  
     6  import (
     7  	"regexp"
     8  	"strings"
     9  
    10  	libkb "github.com/keybase/client/go/libkb"
    11  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    12  	jsonw "github.com/keybase/go-jsonw"
    13  )
    14  
    15  // =============================================================================
    16  // Github
    17  //
    18  
    19  type GithubChecker struct {
    20  	proof libkb.RemoteProofChainLink
    21  }
    22  
    23  var _ libkb.ProofChecker = (*GithubChecker)(nil)
    24  
    25  func NewGithubChecker(p libkb.RemoteProofChainLink) (*GithubChecker, libkb.ProofError) {
    26  	return &GithubChecker{p}, nil
    27  }
    28  
    29  func (rc *GithubChecker) GetTorError() libkb.ProofError { return nil }
    30  
    31  func (rc *GithubChecker) CheckStatus(mctx libkb.MetaContext, h libkb.SigHint, _ libkb.ProofCheckerMode,
    32  	pvlU keybase1.MerkleStoreEntry) (*libkb.SigHint, libkb.ProofError) {
    33  	// TODO CORE-8951 see if we can populate verifiedHint with anything useful.
    34  	return nil, CheckProofPvl(mctx, keybase1.ProofType_GITHUB, rc.proof, h, pvlU)
    35  }
    36  
    37  //
    38  // =============================================================================
    39  
    40  type GithubServiceType struct{ libkb.BaseServiceType }
    41  
    42  func (t *GithubServiceType) Key() string { return t.GetTypeName() }
    43  
    44  var githubUsernameRegexp = regexp.MustCompile(`^(?i:[a-z0-9][a-z0-9-]{0,38})$`)
    45  
    46  func (t *GithubServiceType) NormalizeUsername(s string) (string, error) {
    47  	if !githubUsernameRegexp.MatchString(s) {
    48  		return "", libkb.NewBadUsernameError(s)
    49  	}
    50  	return strings.ToLower(s), nil
    51  }
    52  
    53  func (t *GithubServiceType) NormalizeRemoteName(mctx libkb.MetaContext, s string) (ret string, err error) {
    54  	// Allow a leading '@'.
    55  	s = strings.TrimPrefix(s, "@")
    56  	return t.NormalizeUsername(s)
    57  }
    58  
    59  func (t *GithubServiceType) GetPrompt() string {
    60  	return "Your username on Github"
    61  }
    62  
    63  func (t *GithubServiceType) ToServiceJSON(un string) *jsonw.Wrapper {
    64  	return t.BaseToServiceJSON(t, un)
    65  }
    66  
    67  func (t *GithubServiceType) PostInstructions(un string) *libkb.Markup {
    68  	return libkb.FmtMarkup(`Please <strong>publicly</strong> post the following Gist,
    69  and name it <strong><color name="red">keybase.md</color></strong>`)
    70  }
    71  
    72  func (t *GithubServiceType) DisplayName() string   { return "GitHub" }
    73  func (t *GithubServiceType) GetTypeName() string   { return "github" }
    74  func (t *GithubServiceType) PickerSubtext() string { return "github.com" }
    75  
    76  func (t *GithubServiceType) RecheckProofPosting(tryNumber int, status keybase1.ProofStatus, _ string) (warning *libkb.Markup, err error) {
    77  	if status == keybase1.ProofStatus_PERMISSION_DENIED {
    78  		warning = libkb.FmtMarkup("Permission denied! Make sure your gist is <strong>public</strong>.")
    79  	} else {
    80  		warning, err = t.BaseRecheckProofPosting(tryNumber, status)
    81  	}
    82  	return
    83  }
    84  func (t *GithubServiceType) GetProofType() string { return t.BaseGetProofType(t) }
    85  
    86  func (t *GithubServiceType) CheckProofText(text string, id keybase1.SigID, sig string) (err error) {
    87  	return t.BaseCheckProofTextFull(text, id, sig)
    88  }
    89  
    90  func (t *GithubServiceType) MakeProofChecker(l libkb.RemoteProofChainLink) libkb.ProofChecker {
    91  	return &GithubChecker{l}
    92  }