auth

Paddy 2015-05-17 Parent:73e12d5a1124

171:807d20a0b197 Go to Latest

auth/scope_postgres.go

Add login verification to Config. Keep track of how we're going to verify logins using the Config struct.

History
paddy@152 1 package auth
paddy@152 2
paddy@152 3 import (
paddy@163 4 "code.secondbit.org/pqarrays.hg"
paddy@163 5 "database/sql/driver"
paddy@153 6 "github.com/lib/pq"
paddy@152 7 "github.com/secondbit/pan"
paddy@152 8 )
paddy@152 9
paddy@152 10 func (s Scope) GetSQLTableName() string {
paddy@152 11 return "scopes"
paddy@152 12 }
paddy@152 13
paddy@163 14 func (s Scopes) Value() (driver.Value, error) {
paddy@163 15 ids := make(pqarrays.StringArray, 0, len(s))
paddy@163 16 for _, scope := range s {
paddy@163 17 ids = append(ids, scope.ID)
paddy@163 18 }
paddy@163 19 return ids.Value()
paddy@163 20 }
paddy@163 21
paddy@163 22 func (s *Scopes) Scan(value interface{}) error {
paddy@163 23 *s = (*s)[:0]
paddy@163 24 var ids pqarrays.StringArray
paddy@163 25 err := ids.Scan(value)
paddy@163 26 if err != nil {
paddy@163 27 return err
paddy@163 28 }
paddy@163 29 for _, id := range ids {
paddy@163 30 *s = append(*s, Scope{ID: id})
paddy@163 31 }
paddy@163 32 return nil
paddy@163 33 }
paddy@163 34
paddy@152 35 func (p *postgres) createScopesSQL(scopes []Scope) *pan.Query {
paddy@152 36 fields, _ := pan.GetFields(scopes[0])
paddy@152 37 query := pan.New(pan.POSTGRES, "INSERT INTO "+pan.GetTableName(scopes[0]))
paddy@152 38 query.Include("(" + pan.QueryList(fields) + ")")
paddy@152 39 query.Include("VALUES")
paddy@153 40 query.FlushExpressions(" ")
paddy@152 41 for _, scope := range scopes {
paddy@152 42 _, values := pan.GetFields(scope)
paddy@152 43 query.Include("("+pan.VariableList(len(values))+")", values...)
paddy@152 44 }
paddy@153 45 return query.FlushExpressions(", ")
paddy@152 46 }
paddy@152 47
paddy@152 48 func (p *postgres) createScopes(scopes []Scope) error {
paddy@152 49 if len(scopes) < 1 {
paddy@152 50 return nil
paddy@152 51 }
paddy@152 52 query := p.createScopesSQL(scopes)
paddy@152 53 _, err := p.db.Exec(query.String(), query.Args...)
paddy@153 54 if e, ok := err.(*pq.Error); ok && e.Constraint == "scopes_pkey" {
paddy@153 55 err = ErrScopeAlreadyExists
paddy@153 56 }
paddy@152 57 return err
paddy@152 58 }
paddy@152 59
paddy@152 60 func (p *postgres) getScopesSQL(ids []string) *pan.Query {
paddy@152 61 var scope Scope
paddy@152 62 intids := make([]interface{}, len(ids))
paddy@152 63 for pos, id := range ids {
paddy@152 64 intids[pos] = id
paddy@152 65 }
paddy@152 66 fields, _ := pan.GetFields(scope)
paddy@152 67 query := pan.New(pan.POSTGRES, "SELECT "+pan.QueryList(fields)+" FROM "+pan.GetTableName(scope))
paddy@152 68 query.IncludeWhere()
paddy@152 69 query.Include(pan.GetUnquotedColumn(scope, "ID") + " IN")
paddy@152 70 query.Include("("+pan.VariableList(len(ids))+")", intids...)
paddy@152 71 return query.FlushExpressions(" ")
paddy@152 72 }
paddy@152 73
paddy@152 74 func (p *postgres) getScopes(ids []string) ([]Scope, error) {
paddy@152 75 query := p.getScopesSQL(ids)
paddy@152 76 rows, err := p.db.Query(query.String(), query.Args...)
paddy@152 77 if err != nil {
paddy@152 78 return []Scope{}, err
paddy@152 79 }
paddy@152 80 var scopes []Scope
paddy@152 81 for rows.Next() {
paddy@152 82 var scope Scope
paddy@152 83 err := pan.Unmarshal(rows, &scope)
paddy@152 84 if err != nil {
paddy@152 85 return scopes, err
paddy@152 86 }
paddy@152 87 scopes = append(scopes, scope)
paddy@152 88 }
paddy@152 89 if err = rows.Err(); err != nil {
paddy@152 90 return scopes, err
paddy@152 91 }
paddy@152 92 return scopes, nil
paddy@152 93 }
paddy@152 94
paddy@152 95 func (p *postgres) updateScopeSQL(id string, change ScopeChange) *pan.Query {
paddy@152 96 var scope Scope
paddy@152 97 query := pan.New(pan.POSTGRES, "UPDATE "+pan.GetTableName(scope)+" SET ")
paddy@152 98 query.IncludeIfNotNil(pan.GetUnquotedColumn(scope, "Name")+" = ?", change.Name)
paddy@152 99 query.IncludeIfNotNil(pan.GetUnquotedColumn(scope, "Description")+" = ?", change.Description)
paddy@152 100 query.FlushExpressions(", ")
paddy@152 101 query.IncludeWhere()
paddy@152 102 query.Include(pan.GetUnquotedColumn(scope, "ID")+" = ?", id)
paddy@152 103 return query.FlushExpressions(" ")
paddy@152 104 }
paddy@152 105
paddy@152 106 func (p *postgres) updateScope(id string, change ScopeChange) error {
paddy@152 107 if change.Empty() {
paddy@152 108 return nil
paddy@152 109 }
paddy@152 110 query := p.updateScopeSQL(id, change)
paddy@153 111 res, err := p.db.Exec(query.String(), query.Args...)
paddy@153 112 if err != nil {
paddy@153 113 return err
paddy@153 114 }
paddy@153 115 rows, err := res.RowsAffected()
paddy@153 116 if err != nil {
paddy@153 117 return err
paddy@153 118 }
paddy@153 119 if rows < 1 {
paddy@153 120 return ErrScopeNotFound
paddy@153 121 }
paddy@152 122 return err
paddy@152 123 }
paddy@152 124
paddy@152 125 func (p *postgres) removeScopesSQL(ids []string) *pan.Query {
paddy@152 126 var scope Scope
paddy@152 127 intids := make([]interface{}, len(ids))
paddy@152 128 for pos, id := range ids {
paddy@152 129 intids[pos] = id
paddy@152 130 }
paddy@152 131 query := pan.New(pan.POSTGRES, "DELETE FROM "+pan.GetTableName(scope))
paddy@152 132 query.IncludeWhere()
paddy@152 133 query.Include(pan.GetUnquotedColumn(scope, "ID") + " IN")
paddy@152 134 query.Include("("+pan.VariableList(len(ids))+")", intids...)
paddy@152 135 return query.FlushExpressions(" ")
paddy@152 136 }
paddy@152 137
paddy@152 138 func (p *postgres) removeScopes(ids []string) error {
paddy@152 139 query := p.removeScopesSQL(ids)
paddy@153 140 res, err := p.db.Exec(query.String(), query.Args...)
paddy@152 141 if err != nil {
paddy@152 142 return err
paddy@152 143 }
paddy@153 144 rows, err := res.RowsAffected()
paddy@153 145 if err != nil {
paddy@153 146 return err
paddy@153 147 }
paddy@153 148 if rows < 1 {
paddy@153 149 return ErrScopeNotFound
paddy@153 150 }
paddy@152 151 return nil
paddy@152 152 }
paddy@152 153
paddy@152 154 func (p *postgres) listScopesSQL() *pan.Query {
paddy@152 155 var scope Scope
paddy@152 156 fields, _ := pan.GetFields(scope)
paddy@152 157 query := pan.New(pan.POSTGRES, "SELECT "+pan.QueryList(fields)+" FROM "+pan.GetTableName(scope))
paddy@152 158 return query.FlushExpressions(" ")
paddy@152 159 }
paddy@152 160
paddy@152 161 func (p *postgres) listScopes() ([]Scope, error) {
paddy@152 162 query := p.listScopesSQL()
paddy@152 163 rows, err := p.db.Query(query.String(), query.Args...)
paddy@152 164 if err != nil {
paddy@152 165 return []Scope{}, err
paddy@152 166 }
paddy@152 167 var scopes []Scope
paddy@152 168 for rows.Next() {
paddy@152 169 var scope Scope
paddy@152 170 err = pan.Unmarshal(rows, &scope)
paddy@152 171 if err != nil {
paddy@152 172 return scopes, err
paddy@152 173 }
paddy@152 174 scopes = append(scopes, scope)
paddy@152 175 }
paddy@152 176 if err = rows.Err(); err != nil {
paddy@152 177 return scopes, err
paddy@152 178 }
paddy@152 179 return scopes, nil
paddy@152 180 }