github.com/dbernstein1/tyk@v2.9.0-beta9-dl-apic+incompatible/gateway/coprocess_helpers.go (about) 1 // +build coprocess 2 3 package gateway 4 5 import ( 6 "encoding/json" 7 8 "github.com/sirupsen/logrus" 9 10 "github.com/TykTechnologies/tyk/coprocess" 11 "github.com/TykTechnologies/tyk/user" 12 ) 13 14 // TykSessionState takes a coprocess.SessionState (as returned by the Protocol Buffer binding), and outputs a standard Tyk SessionState. 15 func TykSessionState(session *coprocess.SessionState) *user.SessionState { 16 accessDefinitions := make(map[string]user.AccessDefinition, len(session.AccessRights)) 17 18 for key, protoAccDef := range session.AccessRights { 19 allowedUrls := make([]user.AccessSpec, len(protoAccDef.AllowedUrls)) 20 for _, protoAllowedURL := range protoAccDef.AllowedUrls { 21 allowedUrls = append(allowedUrls, user.AccessSpec{ 22 URL: protoAllowedURL.Url, 23 Methods: protoAllowedURL.Methods, 24 }) 25 } 26 accessDefinitions[key] = user.AccessDefinition{ 27 APIName: protoAccDef.ApiName, 28 APIID: protoAccDef.ApiId, 29 Versions: protoAccDef.Versions, 30 AllowedURLs: allowedUrls, 31 } 32 } 33 34 var basicAuthData struct { 35 Password string `json:"password" msg:"password"` 36 Hash user.HashType `json:"hash_type" msg:"hash_type"` 37 } 38 if session.BasicAuthData != nil { 39 basicAuthData.Password = session.BasicAuthData.Password 40 basicAuthData.Hash = user.HashType(session.BasicAuthData.Hash) 41 } 42 43 var jwtData struct { 44 Secret string `json:"secret" msg:"secret"` 45 } 46 if session.JwtData != nil { 47 jwtData.Secret = session.JwtData.Secret 48 } 49 50 var monitor struct { 51 TriggerLimits []float64 `json:"trigger_limits" msg:"trigger_limits"` 52 } 53 54 if session.Monitor != nil { 55 monitor.TriggerLimits = session.Monitor.TriggerLimits 56 } 57 58 metadata := make(map[string]interface{}) 59 if session.Metadata != nil { 60 for k, v := range session.Metadata { 61 metadata[k] = v 62 } 63 } 64 65 return &user.SessionState{ 66 LastCheck: session.LastCheck, 67 Allowance: session.Allowance, 68 Rate: session.Rate, 69 Per: session.Per, 70 Expires: session.Expires, 71 QuotaMax: session.QuotaMax, 72 QuotaRenews: session.QuotaRenews, 73 QuotaRemaining: session.QuotaRemaining, 74 QuotaRenewalRate: session.QuotaRenewalRate, 75 AccessRights: accessDefinitions, 76 OrgID: session.OrgId, 77 OauthClientID: session.OauthClientId, 78 OauthKeys: session.OauthKeys, 79 Certificate: session.Certificate, 80 BasicAuthData: basicAuthData, 81 JWTData: jwtData, 82 HMACEnabled: session.HmacEnabled, 83 HmacSecret: session.HmacSecret, 84 IsInactive: session.IsInactive, 85 ApplyPolicyID: session.ApplyPolicyId, 86 ApplyPolicies: session.ApplyPolicies, 87 DataExpires: session.DataExpires, 88 MetaData: metadata, 89 Monitor: monitor, 90 EnableDetailedRecording: session.EnableDetailedRecording, 91 Tags: session.Tags, 92 Alias: session.Alias, 93 LastUpdated: session.LastUpdated, 94 IdExtractorDeadline: session.IdExtractorDeadline, 95 SessionLifetime: session.SessionLifetime, 96 } 97 } 98 99 // ProtoSessionState takes a standard SessionState and outputs a SessionState object compatible with Protocol Buffers. 100 func ProtoSessionState(session *user.SessionState) *coprocess.SessionState { 101 102 accessDefinitions := make(map[string]*coprocess.AccessDefinition, len(session.AccessRights)) 103 104 for key, accessDefinition := range session.AccessRights { 105 var allowedUrls []*coprocess.AccessSpec 106 for _, allowedURL := range accessDefinition.AllowedURLs { 107 accessSpec := &coprocess.AccessSpec{ 108 Url: allowedURL.URL, 109 Methods: allowedURL.Methods, 110 } 111 allowedUrls = append(allowedUrls, accessSpec) 112 } 113 114 accessDefinitions[key] = &coprocess.AccessDefinition{ 115 ApiName: accessDefinition.APIName, 116 ApiId: accessDefinition.APIID, 117 Versions: accessDefinition.Versions, 118 AllowedUrls: allowedUrls, 119 } 120 } 121 122 basicAuthData := &coprocess.BasicAuthData{ 123 Password: session.BasicAuthData.Password, 124 Hash: string(session.BasicAuthData.Hash), 125 } 126 jwtData := &coprocess.JWTData{ 127 Secret: session.JWTData.Secret, 128 } 129 monitor := &coprocess.Monitor{ 130 TriggerLimits: session.Monitor.TriggerLimits, 131 } 132 133 metadata := make(map[string]string) 134 if len(session.MetaData) > 0 { 135 for k, v := range session.MetaData { 136 switch v.(type) { 137 case string: 138 metadata[k] = v.(string) 139 default: 140 jsonValue, err := json.Marshal(v) 141 if err != nil { 142 log.WithFields(logrus.Fields{ 143 "prefix": "coprocess", 144 }).WithError(err).Error("Couldn't encode session metadata") 145 continue 146 } 147 metadata[k] = string(jsonValue) 148 } 149 } 150 } 151 152 return &coprocess.SessionState{ 153 LastCheck: session.LastCheck, 154 Allowance: session.Allowance, 155 Rate: session.Rate, 156 Per: session.Per, 157 Expires: session.Expires, 158 QuotaMax: session.QuotaMax, 159 QuotaRenews: session.QuotaRenews, 160 QuotaRemaining: session.QuotaRemaining, 161 QuotaRenewalRate: session.QuotaRenewalRate, 162 AccessRights: accessDefinitions, 163 OrgId: session.OrgID, 164 OauthClientId: session.OauthClientID, 165 OauthKeys: session.OauthKeys, 166 BasicAuthData: basicAuthData, 167 JwtData: jwtData, 168 HmacEnabled: session.HMACEnabled, 169 HmacSecret: session.HmacSecret, 170 IsInactive: session.IsInactive, 171 ApplyPolicyId: session.ApplyPolicyID, 172 ApplyPolicies: session.ApplyPolicies, 173 DataExpires: session.DataExpires, 174 Monitor: monitor, 175 Metadata: metadata, 176 EnableDetailedRecording: session.EnableDetailedRecording, 177 Tags: session.Tags, 178 Alias: session.Alias, 179 LastUpdated: session.LastUpdated, 180 IdExtractorDeadline: session.IdExtractorDeadline, 181 SessionLifetime: session.SessionLifetime, 182 } 183 } 184 185 // ProtoMap is a helper function for maps with string slice values. 186 func ProtoMap(inputMap map[string][]string) map[string]string { 187 newMap := make(map[string]string) 188 189 if inputMap != nil { 190 for k, v := range inputMap { 191 newMap[k] = v[0] 192 } 193 } 194 195 return newMap 196 }