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  }