17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci# Copyright 2014 The Chromium Authors. All rights reserved. 27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci# Use of this source code is governed by a BSD-style license that can be 37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci# found in the LICENSE file. 47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciimport datetime 67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciimport alerts 77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciimport json 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciimport webapp2 97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccifrom google.appengine.api import users 117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass InternalAlertsHandler(alerts.AlertsHandler): 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci MEMCACHE_INTERNAL_ALERTS_KEY = 'internal-alerts' 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci # Has no 'request' member. 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci # Has no 'response' member. 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci # Use of super on an old style class. 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci # pylint: disable=E1002,E1101 207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci def get(self): 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci # Require users to be logged to see builder alerts from private/internal 227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci # trees. 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci user = users.get_current_user() 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if not user: 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci alerts = {} 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci alerts.update({ 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 'date': datetime.datetime.utcnow(), 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 'redirect-url': users.create_login_url(self.request.uri)}) 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci uncompressed = super(InternalAlertsHandler, 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci self).generate_json_dump(alerts) 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci super(InternalAlertsHandler, self).send_json_data(uncompressed) 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci email = user.email() 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if not email.endswith('@google.com'): 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci self.response.set_status(403, 'invalid user') 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci super(InternalAlertsHandler, self).get_from_memcache( 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci InternalAlertsHandler.MEMCACHE_INTERNAL_ALERTS_KEY) 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci def post(self): 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci super(InternalAlertsHandler, self).post_to_memcache( 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci InternalAlertsHandler.MEMCACHE_INTERNAL_ALERTS_KEY) 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciapp = webapp2.WSGIApplication([ 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ('/internal-alerts', InternalAlertsHandler)]) 49