(data *osin.AccessData)
| 182 | var errSessionExpired = errors.DefineUnauthenticated("session_expired", "session expired") |
| 183 | |
| 184 | func (s *storage) SaveAccess(data *osin.AccessData) error { |
| 185 | var accessHash, refreshHash string |
| 186 | tokenType, accessID, accessKey, err := auth.SplitToken(data.AccessToken) |
| 187 | if err != nil { |
| 188 | return err |
| 189 | } |
| 190 | if tokenType != auth.AccessToken { |
| 191 | return errNoAccessToken.New() |
| 192 | } |
| 193 | accessHash, err = auth.Hash(auth.NewContextWithHashValidator(s.ctx, tokenHashSettings), accessKey) |
| 194 | if err != nil { |
| 195 | return err |
| 196 | } |
| 197 | if data.RefreshToken != "" { |
| 198 | tokenType, refreshID, refreshKey, err := auth.SplitToken(data.RefreshToken) |
| 199 | if err != nil { |
| 200 | return err |
| 201 | } |
| 202 | if tokenType != auth.RefreshToken { |
| 203 | return errNoRefreshToken.New() |
| 204 | } |
| 205 | if refreshID != accessID { |
| 206 | return errTokenMismatch.WithAttributes("refresh_token_id", refreshID, "access_token_id", accessID) |
| 207 | } |
| 208 | refreshHash, err = auth.Hash(auth.NewContextWithHashValidator(s.ctx, tokenHashSettings), refreshKey) |
| 209 | if err != nil { |
| 210 | return err |
| 211 | } |
| 212 | } |
| 213 | userSessionIDs := data.UserData.(userData).UserSessionIdentifiers |
| 214 | client := data.Client.(osinClient).Client |
| 215 | rights := rightsFromScope(data.Scope) |
| 216 | if data.CreatedAt.IsZero() { |
| 217 | data.CreatedAt = time.Now() |
| 218 | } |
| 219 | var previousID string |
| 220 | if data.AccessData != nil { |
| 221 | previousID = data.AccessData.UserData.(userData).ID |
| 222 | if data.AccessData.AccessToken != "" { |
| 223 | data.AccessData.AccessToken = previousID // Used for deleting the old access token |
| 224 | } |
| 225 | if data.AccessData.RefreshToken != "" { |
| 226 | data.AccessData.RefreshToken = previousID // Used for deleting the old access token |
| 227 | } |
| 228 | } |
| 229 | err = s.store.Transact(s.ctx, func(ctx context.Context, st oauth_store.Interface) error { |
| 230 | _, err := st.CreateAccessToken(ctx, &ttnpb.OAuthAccessToken{ |
| 231 | ClientIds: client.GetIds(), |
| 232 | UserIds: userSessionIDs.GetUserIds(), |
| 233 | UserSessionId: userSessionIDs.SessionId, |
| 234 | Rights: rights, |
| 235 | Id: accessID, |
| 236 | AccessToken: accessHash, |
| 237 | RefreshToken: refreshHash, |
| 238 | CreatedAt: timestamppb.New(data.CreatedAt), |
| 239 | ExpiresAt: timestamppb.New(data.CreatedAt.Add(time.Duration(data.ExpiresIn) * time.Second)), |
| 240 | }, previousID) |
| 241 | return err |
nothing calls this directly
no test coverage detected