Esempio n. 1
0
  def get(self, client_id_str=''):
    """AppleSUS get handler.

    Args:
      name: str, optional, catalog name to get.
    """
    session = auth.DoAnyAuth()
    client_id = handlers.GetClientIdForRequest(
            self.request, session=session, client_id_str=client_id_str)

    # get only major.minor os_version, stripping miniscule versioning.
    # i.e. 10.6.6 becomes 10.6, 10.23.6.x.x becomes 10.23
    full_os_version = client_id.get('os_version', '') or ''
    os_version = '.'.join(full_os_version.split('.', 2)[:2])
    track = client_id.get('track', 'stable')
    catalog_name = '%s_%s' % (os_version, track)

    catalog = models.AppleSUSCatalog.MemcacheWrappedGet(catalog_name)
    if not catalog:
      logging.warning('Apple SUS catalog not found: %s', catalog_name)
      self.response.set_status(404)
      return

    header_date_str = self.request.headers.get('If-Modified-Since', '')
    catalog_date = catalog.mtime
    if handlers.IsClientResourceExpired(catalog_date, header_date_str):
      self.response.headers['Last-Modified'] = catalog_date.strftime(
          handlers.HEADER_DATE_FORMAT)
      self.response.headers['Content-Type'] = 'text/xml; charset=utf-8'
      self.response.out.write(catalog.plist)
    else:
      self.response.set_status(304)
Esempio n. 2
0
    def get(self, msg='', unused_provided_by_softwareupdate=''):
        """AppleSUS get handler.

    Args:
      name: str, catalog name to get.
      unused_provided_by_softwareupdate: Apple softwareupdate appends filename
        to our url.
    """
        if msg:
            # Clients first POST to this handler and receive a URL with an embedded,
            # encrypted cookie-set containing an Auth1Token.  When GET is called on
            # this URL, we must decode and unpack the cookie/Auth1Token, and set
            # the HTTP_COOKIE environment variable for DoMunkiAuth to validate.
            try:
                d = _DecodeMsg(msg)
            except ValueError:
                self.response.set_status(httplib.BAD_REQUEST)
                return
            os.environ['HTTP_COOKIE'] = str(d['cookies'])
            self.request.headers[MUNKI_CLIENT_ID_HEADER_KEY] = d['header']

        session = gaeserver.DoMunkiAuth(require_level=gaeserver.LEVEL_APPLESUS)
        client_id = handlers.GetClientIdForRequest(self.request,
                                                   session=session)

        # get only major.minor os_version, stripping miniscule versioning.
        # i.e. 10.6.6 becomes 10.6, 10.23.6.x.x becomes 10.23
        full_os_version = client_id.get('os_version', '')
        os_version = '.'.join(full_os_version.split('.', 2)[:2])
        track = client_id.get('track', 'stable')
        catalog_name = '%s_%s' % (os_version, track)

        catalog = models.AppleSUSCatalog.MemcacheWrappedGet(catalog_name)
        if not catalog:
            logging.warning('Apple SUS catalog not found: %s', catalog_name)
            self.response.set_status(httplib.NOT_FOUND)
            return

        header_date_str = self.request.headers.get('If-Modified-Since', '')
        catalog_date = catalog.mtime
        if handlers.IsClientResourceExpired(catalog_date, header_date_str):
            self.response.headers['Last-Modified'] = catalog_date.strftime(
                handlers.HEADER_DATE_FORMAT)
            self.response.headers['Content-Type'] = 'text/xml; charset=utf-8'
            self.response.out.write(catalog.plist)
        else:
            self.response.set_status(httplib.NOT_MODIFIED)
Esempio n. 3
0
    def testGetClientIdForRequestWithoutSession(self):
        """Tests GetClientIdForRequest()."""
        track = 'stable'
        os_version = '10.6.6'
        client_id_dict = {'track': track, 'os_version': os_version}
        client_id_str = 'track=%s|os_version=%s' % (track, os_version)
        client_id_str_quoted = handlers.urllib.quote(client_id_str)
        request = self.mox.CreateMockAnything()
        request.headers = self.mox.CreateMockAnything()

        self.mox.StubOutWithMock(handlers.common, 'ParseClientId')
        handlers.common.ParseClientId(client_id_str).AndReturn(client_id_dict)

        self.mox.ReplayAll()
        r = handlers.GetClientIdForRequest(request,
                                           session=None,
                                           client_id_str=client_id_str_quoted)
        self.assertEqual(r, client_id_dict)
        self.mox.VerifyAll()
Esempio n. 4
0
    def get(self, client_id_str=''):
        """Manifest get handler.

    Args:
      client_id: optional str client_id; only needed for user requests.

    Returns:
      A webapp.Response() response.
    """
        session = auth.DoAnyAuth()
        client_id = handlers.GetClientIdForRequest(self.request,
                                                   session=session,
                                                   client_id_str=client_id_str)

        try:
            plist_xml = common.GetComputerManifest(client_id=client_id,
                                                   packagemap=False)
        except common.ManifestNotFoundError, e:
            logging.warning('Invalid manifest requested: %s', str(e))
            self.response.set_status(404)
            return
Esempio n. 5
0
    def testGetClientIdForRequestWithSession(self):
        """Tests GetClientIdForRequest()."""
        track = 'stable'
        os_version = '10.6.6'
        client_id = 'client_id'
        client_id_dict = {'track': track, 'os_version': os_version}
        session = self.mox.CreateMockAnything()
        session.uuid = 'uuid'
        request = self.mox.CreateMockAnything()
        request.headers = self.mox.CreateMockAnything()

        request.headers.get('X-munki-client-id', '').AndReturn(client_id)
        self.mox.StubOutWithMock(handlers.common, 'ParseClientId')
        handlers.common.ParseClientId(
            client_id, uuid=session.uuid).AndReturn(client_id_dict)

        self.mox.ReplayAll()
        r = handlers.GetClientIdForRequest(request,
                                           session=session,
                                           client_id_str='')
        self.assertEqual(r, client_id_dict)
        self.mox.VerifyAll()
Esempio n. 6
0
  def get(self, client_id_str=''):
    """GET

    Returns:
      None if a blob is being returned,
      or a response object
    """
    session = auth.DoAnyAuth()
    client_id = handlers.GetClientIdForRequest(
        self.request, session=session, client_id_str=client_id_str)

    logging.info('Repair client ID: %s', client_id)
    filename = None
    for pkg in models.PackageInfo.all().filter('name =', 'munkitools'):
      if client_id.get('track', '') in pkg.catalogs:
        filename = pkg.filename
        break

    if filename:
      logging.info('Sending client: %s', filename)
      super(ClientRepair, self).get(filename)
    else:
      logging.warning('No repair client found.')