X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3453440f95dc76db1bd39fe8c85d9a898d474c6b..2aa58f31ac8fc696361214a05ab9ba75a5140b08:/services/api/app/models/api_client_authorization.rb diff --git a/services/api/app/models/api_client_authorization.rb b/services/api/app/models/api_client_authorization.rb index 12ef8eb3eb..53ae6af464 100644 --- a/services/api/app/models/api_client_authorization.rb +++ b/services/api/app/models/api_client_authorization.rb @@ -98,11 +98,31 @@ class ApiClientAuthorization < ArvadosModel case token[0..2] when 'v2/' - _, uuid, secret = token.split('/') + _, uuid, secret, optional = token.split('/') unless uuid.andand.length == 27 && secret.andand.length.andand > 0 return nil end + if !optional.nil? + # if "optional" is a container uuid, check that it + # matches expections. + c = Container.where(uuid: optional).first + if !c.nil? + if !c.auth_uuid.nil? and c.auth_uuid != uuid + # token doesn't match the container's token + return nil + end + if !c.runtime_token.nil? and "v2/#{uuid}/#{secret}" != c.runtime_token + # token doesn't match the container's token + return nil + end + if ![Container::Locked, Container::Running].include?(c.state) + # container isn't locked or running, token shouldn't be used + return nil + end + end + end + auth = ApiClientAuthorization. includes(:user, :api_client). where('uuid=? and (expires_at is null or expires_at > CURRENT_TIMESTAMP)', uuid).