You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
1.4 KiB

package spectre
import "encoding/binary"
// Spectre is a spectre client
type Spectre struct {
name string
secret string
scoper Scoper
key []byte
}
// New returns a Spectre client
func New(name, secret string, opts ...Option) (s *Spectre, err error) {
s = &Spectre{
name: name,
secret: secret,
scoper: DefaultScoper,
}
for _, opt := range opts {
opt(s)
}
s.key, err = userKey(s.name, s.secret, s.scoper)
return
}
// Option is a Spectre option
type Option func(*Spectre)
// WithScoper assigns a scoper to Spectre
func WithScoper(scoper Scoper) Option {
return func(s *Spectre) {
s.scoper = scoper
}
}
// Site returns a site password based on Options
func (s *Spectre) Site(siteName string, opts ...SiteOption) string {
return site(s.key, s.scoper, siteName, opts...)
}
type options struct {
template Template
counter int
scope Scope
}
// SiteOption is an option for Spectre.Site
type SiteOption func(*options)
// WithTemplate specifies a Template
func WithTemplate(t Template) SiteOption {
return func(opts *options) {
opts.template = t
}
}
// WithCounter specifies a counter
func WithCounter(c int) SiteOption {
return func(opts *options) {
opts.counter = c
}
}
// WithScope specifies a Scope
func WithScope(s Scope) SiteOption {
return func(opts *options) {
opts.scope = s
}
}
func bigEndian(num int) []byte {
buf := make([]byte, 4)
binary.BigEndian.PutUint32(buf, uint32(num))
return buf
}