code: async def login(cls, credentials: AuthenticationCredentials,
                      config: Config) -> 'Session':
          
          user = credentials.authcid
          password = cls._get_password(config, user)
          if user != credentials.identity:
              raise InvalidAuth()
          elif not credentials.check_secret(password):
              raise InvalidAuth()
          mailbox_set, filter_set = config.set_cache.get(user, (None, None))
          if not mailbox_set or not filter_set:
              mailbox_set = MailboxSet()
              filter_set = FilterSet()
              if config.demo_data:
                  await cls._load_demo(mailbox_set, filter_set)
              config.set_cache[user] = (mailbox_set, filter_set)
          return cls(credentials.identity, config, mailbox_set, filter_set)
docs: Checks the given credentials for a valid login and returns a new
          session. The mailbox data is shared between concurrent and future
          sessions, but only for the lifetime of the process.