func Backend() *framework.Backend { var b backend b.MapAppId = &framework.PolicyMap{ PathMap: framework.PathMap{ Name: "app-id", Schema: map[string]*framework.FieldSchema{ "display_name": &framework.FieldSchema{ Type: framework.TypeString, Description: "A name to map to this app ID for logs.", }, "value": &framework.FieldSchema{ Type: framework.TypeString, Description: "Policies for the app ID.", }, }, }, DefaultKey: "default", } b.MapUserId = &framework.PathMap{ Name: "user-id", Schema: map[string]*framework.FieldSchema{ "cidr_block": &framework.FieldSchema{ Type: framework.TypeString, Description: "If not blank, restricts auth by this CIDR block", }, "value": &framework.FieldSchema{ Type: framework.TypeString, Description: "App IDs that this user associates with.", }, }, } b.Backend = &framework.Backend{ Help: backendHelp, PathsSpecial: &logical.Paths{ Unauthenticated: []string{ "login", }, }, Paths: framework.PathAppend([]*framework.Path{ pathLogin(&b), }, b.MapAppId.Paths(), b.MapUserId.Paths(), ), } return b.Backend }
func Backend(conf *logical.BackendConfig) (*backend, error) { // Initialize the salt salt, err := salt.NewSalt(conf.StorageView, &salt.Config{ HashFunc: salt.SHA256Hash, }) if err != nil { return nil, err } // Create a backend object b := &backend{ // Set the salt object for the backend salt: salt, // Create the map of locks to modify the registered roles roleLocksMap: make(map[string]*sync.RWMutex, 257), // Create the map of locks to modify the generated RoleIDs roleIDLocksMap: make(map[string]*sync.RWMutex, 257), // Create the map of locks to modify the generated SecretIDs secretIDLocksMap: make(map[string]*sync.RWMutex, 257), // Create the map of locks to modify the generated SecretIDAccessors secretIDAccessorLocksMap: make(map[string]*sync.RWMutex, 257), } // Create 256 locks each for managing RoleID and SecretIDs. This will avoid // a superfluous number of locks directly proportional to the number of RoleID // and SecretIDs. These locks can be accessed by indexing based on the first two // characters of a randomly generated UUID. if err = locksutil.CreateLocks(b.roleLocksMap, 256); err != nil { return nil, fmt.Errorf("failed to create role locks: %v", err) } if err = locksutil.CreateLocks(b.roleIDLocksMap, 256); err != nil { return nil, fmt.Errorf("failed to create role ID locks: %v", err) } if err = locksutil.CreateLocks(b.secretIDLocksMap, 256); err != nil { return nil, fmt.Errorf("failed to create secret ID locks: %v", err) } if err = locksutil.CreateLocks(b.secretIDAccessorLocksMap, 256); err != nil { return nil, fmt.Errorf("failed to create secret ID accessor locks: %v", err) } // Have an extra lock to use in case the indexing does not result in a lock. // This happens if the indexing value is not beginning with hex characters. // These locks can be used for listing purposes as well. b.roleLocksMap["custom"] = &sync.RWMutex{} b.roleIDLocksMap["custom"] = &sync.RWMutex{} b.secretIDLocksMap["custom"] = &sync.RWMutex{} b.secretIDAccessorLocksMap["custom"] = &sync.RWMutex{} // Attach the paths and secrets that are to be handled by the backend b.Backend = &framework.Backend{ // Register a periodic function that deletes the expired SecretID entries PeriodicFunc: b.periodicFunc, Help: backendHelp, AuthRenew: b.pathLoginRenew, PathsSpecial: &logical.Paths{ Unauthenticated: []string{ "login", }, }, Paths: framework.PathAppend( rolePaths(b), []*framework.Path{ pathLogin(b), pathTidySecretID(b), }, ), } return b, nil }
func Backend(conf *logical.BackendConfig) (*framework.Backend, error) { // Initialize the salt salt, err := salt.NewSalt(conf.View, nil) if err != nil { return nil, err } var b backend b.Salt = salt b.MapAppId = &framework.PolicyMap{ PathMap: framework.PathMap{ Name: "app-id", Salt: salt, Schema: map[string]*framework.FieldSchema{ "display_name": &framework.FieldSchema{ Type: framework.TypeString, Description: "A name to map to this app ID for logs.", }, "value": &framework.FieldSchema{ Type: framework.TypeString, Description: "Policies for the app ID.", }, }, }, DefaultKey: "default", } b.MapUserId = &framework.PathMap{ Name: "user-id", Salt: salt, Schema: map[string]*framework.FieldSchema{ "cidr_block": &framework.FieldSchema{ Type: framework.TypeString, Description: "If not blank, restricts auth by this CIDR block", }, "value": &framework.FieldSchema{ Type: framework.TypeString, Description: "App IDs that this user associates with.", }, }, } b.Backend = &framework.Backend{ Help: backendHelp, PathsSpecial: &logical.Paths{ Unauthenticated: []string{ "login", }, }, Paths: framework.PathAppend([]*framework.Path{ pathLogin(&b), }, b.MapAppId.Paths(), b.MapUserId.Paths(), ), } // Since the salt is new in 0.2, we need to handle this by migrating // any existing keys to use the salt. We can deprecate this eventually, // but for now we want a smooth upgrade experience by automatically // upgrading to use salting. if salt.DidGenerate() { if err := b.upgradeToSalted(conf.View); err != nil { return nil, err } } return b.Backend, nil }