예제 #1
0
    def test_lookup_patron_affiliation_id(
        self, _, subject, expected_affiliation_id, affiliation_attributes=None
    ):
        # Arrange
        credential_manager = ProQuestCredentialManager()
        patron = self._patron()

        if subject:
            expected_token = json.dumps(subject, cls=SAMLSubjectJSONEncoder)

            data_source = DataSource.lookup(
                self._db,
                BaseSAMLAuthenticationProvider.TOKEN_DATA_SOURCE_NAME,
                autocreate=True,
            )
            Credential.temporary_token_create(
                self._db,
                data_source,
                BaseSAMLAuthenticationProvider.TOKEN_TYPE,
                patron,
                datetime.timedelta(hours=1),
                expected_token,
            )

        # Act
        if affiliation_attributes:
            token = credential_manager.lookup_patron_affiliation_id(
                self._db, patron, affiliation_attributes
            )
        else:
            token = credential_manager.lookup_patron_affiliation_id(self._db, patron)

        # Assert
        assert expected_affiliation_id == token
예제 #2
0
 def test_authdata_lookup_failure_wrong_token(self):
     temp_token, ignore = Credential.temporary_token_create(
         self._db, self.data_source, self.model.TEMPORARY_TOKEN_TYPE,
         self.bob_patron, datetime.timedelta(seconds=60))
     urn, label = self.model.authdata_lookup("nosuchauthdata")
     eq_(None, urn)
     eq_(None, label)
예제 #3
0
    def _create_token(self, db, patron, subject, cm_session_lifetime=None):
        """Create a Credential object that ties the given patron to the
            given provider token.

        :param db: Database session
        :type db: sqlalchemy.orm.session.Session

        :param patron: Patron object
        :type patron: Patron

        :param subject: SAML subject
        :type subject: api.saml.metadata.model.SAMLSubject

        :param cm_session_lifetime: (Optional) Circulation Manager's session lifetime expressed in days
        :type cm_session_lifetime: Optional[int]

        :return: Credential object
        :rtype: Credential
        """
        session_lifetime = subject.valid_till

        if cm_session_lifetime:
            session_lifetime = datetime.timedelta(
                days=int(cm_session_lifetime))

        token = self._create_token_value(subject)
        data_source, ignore = self._get_token_data_source(db)

        return Credential.temporary_token_create(db, data_source,
                                                 self.TOKEN_TYPE, patron,
                                                 session_lifetime, token)
예제 #4
0
    def test_lookup_proquest_token_returns_token(self):
        # Arrange
        credential_manager = ProQuestCredentialManager()
        patron = self._patron()
        expected_token = "12345"

        Credential.temporary_token_create(
            self._db,
            self._data_source,
            ProQuestCredentialType.PROQUEST_JWT_TOKEN.value,
            patron,
            datetime.timedelta(hours=1),
            expected_token,
        )

        # Act
        token = credential_manager.lookup_proquest_token(self._db, patron)

        # Assert
        assert True == isinstance(token, Credential)
        assert expected_token == token.credential
예제 #5
0
    def save_proquest_token(self, db, patron, duration, token):
        """Save a ProQuest JWT bearer token for later use.

        :param db: Database session
        :type db: sqlalchemy.orm.session.Session

        :param patron: Patron object
        :type patron: core.model.patron.Patron

        :param duration: How long this token can be valid
        :type duration: datetime.timedelta

        :param token: ProQuest JWT bearer token
        :type token: str

        :return: Credential object containing a new ProQuest JWT bearer token
        :rtype: Optional[core.model.credential.Credential]
        """
        if not is_session(db):
            raise ValueError('"db" argument must be a valid SQLAlchemy session')
        if not isinstance(patron, Patron):
            raise ValueError('"patron" argument must be an instance of Patron class')
        if not isinstance(duration, datetime.timedelta):
            raise ValueError(
                '"duration" argument must be an instance of datetime.timedelta class'
            )
        if not isinstance(token, str) or not token:
            raise ValueError('"token" argument must be a non-empty string')

        self._logger.debug(
            "Started saving a ProQuest JWT bearer token {0}".format(token)
        )

        data_source = DataSource.lookup(
            db, DataSourceConstants.PROQUEST, autocreate=True
        )
        credential, is_new = Credential.temporary_token_create(
            db,
            data_source,
            ProQuestCredentialType.PROQUEST_JWT_TOKEN.value,
            patron,
            duration,
            token,
        )

        self._logger.debug(
            "Finished saving a ProQuest JWT bearer token {0}: {1} (new = {2})".format(
                token, credential, is_new
            )
        )

        return credential
예제 #6
0
    def test_authdata_lookup_success(self):
        now = datetime.datetime.utcnow()
        temp_token, ignore = Credential.temporary_token_create(
            self._db, self.data_source, self.model.TEMPORARY_TOKEN_TYPE,
            self.bob_patron, datetime.timedelta(seconds=60))
        old_expires = temp_token.expires
        assert temp_token.expires > now
        urn, label = self.model.authdata_lookup(temp_token.credential)

        # There is now a UUID associated with Bob's patron account,
        # and that's the UUID returned by standard_lookup().
        bob_uuid = Credential.lookup(
            self._db, self.data_source, self.model.VENDOR_ID_UUID_TOKEN_TYPE,
            self.bob_patron, None)
        eq_(urn, bob_uuid.credential)
        eq_("Card number 5", label)

        # Having been used once, the temporary token has been expired.
        assert temp_token.expires < now
예제 #7
0
    def _create_token(self, db, patron, token, valid_till):
        """Creates a Credential object that ties the given patron to the
        given provider token.

        :param db: Database session
        :type db: sqlalchemy.orm.session.Session

        :param patron: Patron object
        :type patron: Patron

        :param token: Token containing SAML subject's metadata
        :type token: Dict

        :param valid_till: The time till which the SAML subject is valid
        :type valid_till: datetime.timedelta

        :return: Credential object
        :rtype: Credential
        """
        data_source, ignore = self._get_token_data_source(db)
        return Credential.temporary_token_create(db, data_source,
                                                 self.TOKEN_TYPE, patron,
                                                 valid_till, token)
 def create_authdata(self, patron):
     credential, is_new = Credential.temporary_token_create(
         self._db, self.data_source, self.TEMPORARY_TOKEN_TYPE,
         patron, self.temporary_token_duration)
     return credential