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)
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)
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()
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
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()
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.')