git-bug: github.com/MichaelMure/git-bug/identity Index | Files

package identity

import "github.com/MichaelMure/git-bug/identity"

Package identity contains the identity data model and low-level related functions

Index

Package Files

bare.go common.go identity.go identity_actions.go identity_stub.go interface.go key.go resolver.go version.go

Variables

var ErrIdentityNotExist = errors.New("identity doesn't exist")
var ErrMultipleIdentitiesSet = errors.New("multiple user identities set")
var ErrNoIdentitySet = errors.New("No identity is set.\n" +
    "To interact with bugs, an identity first needs to be created using " +
    "\"git bug user create\"")
var ErrNonFastForwardMerge = errors.New("non fast-forward identity merge")

func Fetch Uses

func Fetch(repo repository.Repo, remote string) (string, error)

Fetch retrieve updates from a remote This does not change the local identities state

func GetUserIdentityId Uses

func GetUserIdentityId(repo repository.Repo) (entity.Id, error)

func IsUserIdentitySet Uses

func IsUserIdentitySet(repo repository.Repo) (bool, error)

IsUserIdentitySet say if the user has set his identity

func MergeAll Uses

func MergeAll(repo repository.ClockedRepo, remote string) <-chan entity.MergeResult

MergeAll will merge all the available remote identity

func NewErrMultipleMatch Uses

func NewErrMultipleMatch(matching []entity.Id) *entity.ErrMultipleMatch

func Pull Uses

func Pull(repo repository.ClockedRepo, remote string) error

Pull will do a Fetch + MergeAll This function will return an error if a merge fail

func Push Uses

func Push(repo repository.Repo, remote string) (string, error)

Push update a remote with the local changes

func ReadAllLocalIdentities Uses

func ReadAllLocalIdentities(repo repository.ClockedRepo) <-chan StreamedIdentity

ReadAllLocalIdentities read and parse all local Identity

func ReadAllRemoteIdentities Uses

func ReadAllRemoteIdentities(repo repository.ClockedRepo, remote string) <-chan StreamedIdentity

ReadAllRemoteIdentities read and parse all remote Identity for a given remote

func SetUserIdentity Uses

func SetUserIdentity(repo repository.RepoConfig, identity *Identity) error

SetUserIdentity store the user identity's id in the git config

type Bare Uses

type Bare struct {
    // contains filtered or unexported fields
}

Bare is a very minimal identity, designed to be fully embedded directly along other data.

in particular, this identity is designed to be compatible with the handling of identities in the early version of git-bug. Deprecated: legacy identity for compat, might make sense to ditch entirely for simplicity but that would be a breaking change.

func NewBare Uses

func NewBare(name string, email string) *Bare

func NewBareFull Uses

func NewBareFull(name string, email string, login string, avatarUrl string) *Bare

func (*Bare) AvatarUrl Uses

func (i *Bare) AvatarUrl() string

AvatarUrl return the last version of the Avatar URL

func (*Bare) Commit Uses

func (i *Bare) Commit(repo repository.ClockedRepo) error

Write the identity into the Repository. In particular, this ensure that the Id is properly set.

func (*Bare) CommitAsNeeded Uses

func (i *Bare) CommitAsNeeded(repo repository.ClockedRepo) error

If needed, write the identity into the Repository. In particular, this ensure that the Id is properly set.

func (*Bare) DisplayName Uses

func (i *Bare) DisplayName() string

DisplayName return a non-empty string to display, representing the identity, based on the non-empty values.

func (*Bare) Email Uses

func (i *Bare) Email() string

Email return the last version of the email

func (*Bare) Id Uses

func (i *Bare) Id() entity.Id

Id return the Identity identifier

func (*Bare) IsProtected Uses

func (i *Bare) IsProtected() bool

IsProtected return true if the chain of git commits started to be signed. If that's the case, only signed commit with a valid key for this identity can be added.

func (*Bare) Keys Uses

func (i *Bare) Keys() []*Key

Keys return the last version of the valid keys

func (*Bare) LastModification Uses

func (i *Bare) LastModification() timestamp.Timestamp

LastModification return the timestamp at which the last version of the identity became valid.

func (*Bare) LastModificationLamport Uses

func (i *Bare) LastModificationLamport() lamport.Time

LastModificationLamportTime return the Lamport time at which the last version of the identity became valid.

func (*Bare) Login Uses

func (i *Bare) Login() string

Login return the last version of the login

func (*Bare) MarshalJSON Uses

func (i *Bare) MarshalJSON() ([]byte, error)

func (*Bare) Name Uses

func (i *Bare) Name() string

Name return the last version of the name

func (*Bare) UnmarshalJSON Uses

func (i *Bare) UnmarshalJSON(data []byte) error

func (*Bare) ValidKeysAtTime Uses

func (i *Bare) ValidKeysAtTime(_ lamport.Time) []*Key

ValidKeysAtTime return the set of keys valid at a given lamport time

func (*Bare) Validate Uses

func (i *Bare) Validate() error

Validate check if the Identity data is valid

type Identity Uses

type Identity struct {
    // contains filtered or unexported fields
}

func GetUserIdentity Uses

func GetUserIdentity(repo repository.Repo) (*Identity, error)

GetUserIdentity read the current user identity, set with a git config entry

func NewFromGitUser Uses

func NewFromGitUser(repo repository.Repo) (*Identity, error)

NewFromGitUser will query the repository for user detail and build the corresponding Identity

func NewIdentity Uses

func NewIdentity(name string, email string) *Identity

func NewIdentityFull Uses

func NewIdentityFull(name string, email string, login string, avatarUrl string) *Identity

func ReadLocal Uses

func ReadLocal(repo repository.Repo, id entity.Id) (*Identity, error)

ReadLocal load a local Identity from the identities data available in git

func ReadRemote Uses

func ReadRemote(repo repository.Repo, remote string, id string) (*Identity, error)

ReadRemote load a remote Identity from the identities data available in git

func (*Identity) AvatarUrl Uses

func (i *Identity) AvatarUrl() string

AvatarUrl return the last version of the Avatar URL

func (*Identity) Commit Uses

func (i *Identity) Commit(repo repository.ClockedRepo) error

Write the identity into the Repository. In particular, this ensure that the Id is properly set.

func (*Identity) CommitAsNeeded Uses

func (i *Identity) CommitAsNeeded(repo repository.ClockedRepo) error

func (*Identity) DisplayName Uses

func (i *Identity) DisplayName() string

DisplayName return a non-empty string to display, representing the identity, based on the non-empty values.

func (*Identity) Email Uses

func (i *Identity) Email() string

Email return the last version of the email

func (*Identity) Id Uses

func (i *Identity) Id() entity.Id

Id return the Identity identifier

func (*Identity) ImmutableMetadata Uses

func (i *Identity) ImmutableMetadata() map[string]string

ImmutableMetadata return all metadata for this Identity, accumulated from each Version. If multiple value are found, the first defined takes precedence.

func (*Identity) IsProtected Uses

func (i *Identity) IsProtected() bool

IsProtected return true if the chain of git commits started to be signed. If that's the case, only signed commit with a valid key for this identity can be added.

func (*Identity) Keys Uses

func (i *Identity) Keys() []*Key

Keys return the last version of the valid keys

func (*Identity) LastModification Uses

func (i *Identity) LastModification() timestamp.Timestamp

LastModification return the timestamp at which the last version of the identity became valid.

func (*Identity) LastModificationLamport Uses

func (i *Identity) LastModificationLamport() lamport.Time

LastModificationLamportTime return the Lamport time at which the last version of the identity became valid.

func (*Identity) Login Uses

func (i *Identity) Login() string

Login return the last version of the login

func (*Identity) MarshalJSON Uses

func (i *Identity) MarshalJSON() ([]byte, error)

MarshalJSON will only serialize the id

func (*Identity) Merge Uses

func (i *Identity) Merge(repo repository.Repo, other *Identity) (bool, error)

Merge will merge a different version of the same Identity

To make sure that an Identity history can't be altered, a strict fast-forward only policy is applied here. As an Identity should be tied to a single user, this should work in practice but it does leave a possibility that a user would edit his Identity from two different repo concurrently and push the changes in a non-centralized network of repositories. In this case, it would result in some of the repo accepting one version and some other accepting another, preventing the network in general to converge to the same result. This would create a sort of partition of the network, and manual cleaning would be required.

An alternative approach would be to have a determinist rebase: - any commits present in both local and remote version would be kept, never changed. - newer commits would be merged in a linear chain of commits, ordered based on the

Lamport time

However, this approach leave the possibility, in the case of a compromised crypto keys, of forging a new version with a bogus Lamport time to be inserted before a legit version, invalidating the correct version and hijacking the Identity. There would only be a short period of time where this would be possible (before the network converge) but I'm not confident enough to implement that. I choose the strict fast-forward only approach, despite it's potential problem with two different version as mentioned above.

func (*Identity) MutableMetadata Uses

func (i *Identity) MutableMetadata() map[string]string

MutableMetadata return all metadata for this Identity, accumulated from each Version. If multiple value are found, the last defined takes precedence.

func (*Identity) Mutate Uses

func (i *Identity) Mutate(f func(orig Mutator) Mutator)

Mutate allow to create a new version of the Identity in one go

func (*Identity) Name Uses

func (i *Identity) Name() string

Name return the last version of the name

func (*Identity) NeedCommit Uses

func (i *Identity) NeedCommit() bool

func (*Identity) SetMetadata Uses

func (i *Identity) SetMetadata(key string, value string)

SetMetadata store arbitrary metadata along the last not-commit Version. If the Version has been commit to git already, a new identical version is added and will need to be commit.

func (*Identity) UnmarshalJSON Uses

func (i *Identity) UnmarshalJSON(data []byte) error

UnmarshalJSON will only read the id Users of this package are expected to run Load() to load the remaining data from the identities data in git.

func (*Identity) ValidKeysAtTime Uses

func (i *Identity) ValidKeysAtTime(time lamport.Time) []*Key

ValidKeysAtTime return the set of keys valid at a given lamport time

func (*Identity) Validate Uses

func (i *Identity) Validate() error

Validate check if the Identity data is valid

type IdentityStub Uses

type IdentityStub struct {
    // contains filtered or unexported fields
}

IdentityStub is an almost empty Identity, holding only the id. When a normal Identity is serialized into JSON, only the id is serialized. All the other data are stored in git in a chain of commit + a ref. When this JSON is deserialized, an IdentityStub is returned instead, to be replaced later by the proper Identity, loaded from the Repo.

func (IdentityStub) AvatarUrl Uses

func (IdentityStub) AvatarUrl() string

func (IdentityStub) Commit Uses

func (IdentityStub) Commit(repo repository.ClockedRepo) error

func (*IdentityStub) CommitAsNeeded Uses

func (i *IdentityStub) CommitAsNeeded(repo repository.ClockedRepo) error

func (IdentityStub) DisplayName Uses

func (IdentityStub) DisplayName() string

func (IdentityStub) Email Uses

func (IdentityStub) Email() string

func (*IdentityStub) Id Uses

func (i *IdentityStub) Id() entity.Id

Id return the Identity identifier

func (IdentityStub) IsProtected Uses

func (IdentityStub) IsProtected() bool

func (IdentityStub) Keys Uses

func (IdentityStub) Keys() []*Key

func (*IdentityStub) LastModification Uses

func (i *IdentityStub) LastModification() timestamp.Timestamp

func (*IdentityStub) LastModificationLamport Uses

func (i *IdentityStub) LastModificationLamport() lamport.Time

func (IdentityStub) Login Uses

func (IdentityStub) Login() string

func (*IdentityStub) MarshalJSON Uses

func (i *IdentityStub) MarshalJSON() ([]byte, error)

func (IdentityStub) Name Uses

func (IdentityStub) Name() string

func (*IdentityStub) UnmarshalJSON Uses

func (i *IdentityStub) UnmarshalJSON(data []byte) error

func (IdentityStub) ValidKeysAtTime Uses

func (IdentityStub) ValidKeysAtTime(_ lamport.Time) []*Key

func (IdentityStub) Validate Uses

func (IdentityStub) Validate() error

type Interface Uses

type Interface interface {
    // Id return the Identity identifier
    Id() entity.Id

    // Name return the last version of the name
    // Can be empty.
    Name() string

    // Email return the last version of the email
    // Can be empty.
    Email() string

    // Login return the last version of the login
    // Can be empty.
    // Warning: this login can be defined when importing from a bridge but should *not* be
    // used to identify an identity as multiple bridge with different login can map to the same
    // identity. Use the metadata system for that usage instead.
    Login() string

    // AvatarUrl return the last version of the Avatar URL
    // Can be empty.
    AvatarUrl() string

    // Keys return the last version of the valid keys
    // Can be empty.
    Keys() []*Key

    // ValidKeysAtTime return the set of keys valid at a given lamport time
    // Can be empty.
    ValidKeysAtTime(time lamport.Time) []*Key

    // DisplayName return a non-empty string to display, representing the
    // identity, based on the non-empty values.
    DisplayName() string

    // Validate check if the Identity data is valid
    Validate() error

    // Write the identity into the Repository. In particular, this ensure that
    // the Id is properly set.
    Commit(repo repository.ClockedRepo) error

    // If needed, write the identity into the Repository. In particular, this
    // ensure that the Id is properly set.
    CommitAsNeeded(repo repository.ClockedRepo) error

    // IsProtected return true if the chain of git commits started to be signed.
    // If that's the case, only signed commit with a valid key for this identity can be added.
    IsProtected() bool

    // LastModificationLamportTime return the Lamport time at which the last version of the identity became valid.
    LastModificationLamport() lamport.Time

    // LastModification return the timestamp at which the last version of the identity became valid.
    LastModification() timestamp.Timestamp
}

func UnmarshalJSON Uses

func UnmarshalJSON(raw json.RawMessage) (Interface, error)

Custom unmarshaling function to allow package user to delegate the decoding of an Identity and distinguish between an Identity and a Bare.

If the given message has a "id" field, it's considered being a proper Identity.

type Key Uses

type Key struct {
    // The GPG fingerprint of the key
    Fingerprint string `json:"fingerprint"`
    PubKey      string `json:"pub_key"`
}

func (*Key) Clone Uses

func (k *Key) Clone() *Key

func (*Key) Validate Uses

func (k *Key) Validate() error

type Mutator Uses

type Mutator struct {
    Name      string
    Login     string
    Email     string
    AvatarUrl string
    Keys      []*Key
}

type Resolver Uses

type Resolver interface {
    ResolveIdentity(id entity.Id) (Interface, error)
}

Resolver define the interface of an Identity resolver, able to load an identity from, for example, a repo or a cache.

type SimpleResolver Uses

type SimpleResolver struct {
    // contains filtered or unexported fields
}

DefaultResolver is a Resolver loading Identities directly from a Repo

func NewSimpleResolver Uses

func NewSimpleResolver(repo repository.Repo) *SimpleResolver

func (*SimpleResolver) ResolveIdentity Uses

func (r *SimpleResolver) ResolveIdentity(id entity.Id) (Interface, error)

type StreamedIdentity Uses

type StreamedIdentity struct {
    Identity *Identity
    Err      error
}

type Version Uses

type Version struct {
    // contains filtered or unexported fields
}

Version is a complete set of information about an Identity at a point in time.

func (*Version) AllMetadata Uses

func (v *Version) AllMetadata() map[string]string

AllMetadata return all metadata for this Version

func (*Version) Clone Uses

func (v *Version) Clone() *Version

Make a deep copy

func (*Version) GetMetadata Uses

func (v *Version) GetMetadata(key string) (string, bool)

GetMetadata retrieve arbitrary metadata about the Version

func (*Version) MarshalJSON Uses

func (v *Version) MarshalJSON() ([]byte, error)

func (*Version) SetMetadata Uses

func (v *Version) SetMetadata(key string, value string)

SetMetadata store arbitrary metadata about a version or an Identity in general If the Version has been commit to git already, it won't be overwritten.

func (*Version) UnmarshalJSON Uses

func (v *Version) UnmarshalJSON(data []byte) error

func (*Version) Validate Uses

func (v *Version) Validate() error

func (*Version) Write Uses

func (v *Version) Write(repo repository.Repo) (repository.Hash, error)

Write will serialize and store the Version as a git blob and return its hash

type VersionJSON Uses

type VersionJSON struct {
    // Additional field to version the data
    FormatVersion uint `json:"version"`

    Time      lamport.Time      `json:"time"`
    UnixTime  int64             `json:"unix_time"`
    Name      string            `json:"name,omitempty"`
    Email     string            `json:"email,omitempty"`
    Login     string            `json:"login,omitempty"`
    AvatarUrl string            `json:"avatar_url,omitempty"`
    Keys      []*Key            `json:"pub_keys,omitempty"`
    Nonce     []byte            `json:"nonce,omitempty"`
    Metadata  map[string]string `json:"metadata,omitempty"`
}

Package identity imports 15 packages (graph) and is imported by 10 packages. Updated 2020-07-11. Refresh now. Tools for package owners.