def notify_bot_owner_about_invalid_json(user_profile: UserProfile, webhook_client_name: str) -> None: send_rate_limited_pm_notification_to_bot_owner( user_profile, user_profile.realm, INVALID_JSON_MESSAGE.format(webhook_name=webhook_client_name).strip(), )
def api_uptimerobot_webhook( request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any] = REQ(argument_type="body"), ) -> HttpResponse: if payload["alert_type_friendly_name"] == "Up": event = "up" elif payload["alert_type_friendly_name"] == "Down": event = "down" try: body = get_body_for_http_request(payload) subject = get_subject_for_http_request(payload) except KeyError: message = MISCONFIGURED_PAYLOAD_ERROR_MESSAGE.format( bot_name=user_profile.full_name, support_email=FromAddress.SUPPORT, ).strip() send_rate_limited_pm_notification_to_bot_owner(user_profile, user_profile.realm, message) raise JsonableError(_("Invalid payload")) check_send_webhook_message(request, user_profile, subject, body, event) return json_success()
def validate_extract_webhook_http_header(request: HttpRequest, header: str, integration_name: str) -> str: extracted_header = request.META.get(DJANGO_HTTP_PREFIX + header) if extracted_header is None: message_body = MISSING_EVENT_HEADER_MESSAGE.format( bot_name=request.user.full_name, request_path=request.path, header_name=header, integration_name=integration_name, support_email=FromAddress.SUPPORT, ) send_rate_limited_pm_notification_to_bot_owner( request.user, request.user.realm, message_body) raise MissingHTTPEventHeader(header) return extracted_header
def validate_extract_webhook_http_header(request: HttpRequest, header: str, integration_name: str) -> str: extracted_header = request.META.get(DJANGO_HTTP_PREFIX + header) if extracted_header is None: message_body = MISSING_EVENT_HEADER_MESSAGE.format( bot_name=request.user.full_name, request_path=request.path, header_name=header, integration_name=integration_name, support_email=FromAddress.SUPPORT, ) send_rate_limited_pm_notification_to_bot_owner( request.user, request.user.realm, message_body) raise MissingHTTPEventHeader(header) return extracted_header
def api_zabbix_webhook(request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any]=REQ(argument_type='body')) -> HttpResponse: try: body = get_body_for_http_request(payload) subject = get_subject_for_http_request(payload) except KeyError: message = MISCONFIGURED_PAYLOAD_ERROR_MESSAGE.format( bot_name=user_profile.full_name, support_email=FromAddress.SUPPORT, ).strip() send_rate_limited_pm_notification_to_bot_owner( user_profile, user_profile.realm, message) return json_error(_("Invalid payload")) check_send_webhook_message(request, user_profile, subject, body) return json_success()
def api_teamcity_webhook(request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any]=REQ(argument_type='body')) -> HttpResponse: message = payload.get('build') if message is None: # Ignore third-party specific (e.g. Slack/HipChat) payload formats # and notify the bot owner message = MISCONFIGURED_PAYLOAD_TYPE_ERROR_MESSAGE.format( bot_name=user_profile.full_name, support_email=FromAddress.SUPPORT, ).strip() send_rate_limited_pm_notification_to_bot_owner( user_profile, user_profile.realm, message) return json_success() build_name = message['buildFullName'] build_url = message['buildStatusUrl'] changes_url = build_url + '&tab=buildChangesDiv' build_number = message['buildNumber'] build_result = message['buildResult'] build_result_delta = message['buildResultDelta'] build_status = message['buildStatus'] if build_result == 'success': if build_result_delta == 'fixed': status = 'has been fixed! :thumbs_up:' else: status = 'was successful! :thumbs_up:' elif build_result == 'failure': if build_result_delta == 'broken': status = 'is broken with status %s! :thumbs_down:' % (build_status,) else: status = 'is still broken with status %s! :thumbs_down:' % (build_status,) elif build_result == 'running': status = 'has started.' else: status = '(has no message specified for status %s)' % (build_status,) template = ( u'%s build %s %s\n' u'Details: [changes](%s), [build log](%s)') body = template % (build_name, build_number, status, changes_url, build_url) if 'branchDisplayName' in message: topic = build_name + ' (' + message['branchDisplayName'] + ')' else: topic = build_name # Check if this is a personal build, and if so try to private message the user who triggered it. if get_teamcity_property_value(message['teamcityProperties'], 'env.BUILD_IS_PERSONAL') == 'true': # The triggeredBy field gives us the teamcity user full name, and the # "teamcity.build.triggeredBy.username" property gives us the teamcity username. # Let's try finding the user email from both. teamcity_fullname = message['triggeredBy'].split(';')[0] teamcity_user = guess_zulip_user_from_teamcity(teamcity_fullname, user_profile.realm) if teamcity_user is None: teamcity_shortname = get_teamcity_property_value(message['teamcityProperties'], 'teamcity.build.triggeredBy.username') if teamcity_shortname is not None: teamcity_user = guess_zulip_user_from_teamcity(teamcity_shortname, user_profile.realm) if teamcity_user is None: # We can't figure out who started this build - there's nothing we can do here. logging.info("Teamcity webhook couldn't find a matching Zulip user for " "Teamcity user '%s' or '%s'" % (teamcity_fullname, teamcity_shortname)) return json_success() body = "Your personal build of " + body check_send_private_message(user_profile, request.client, teamcity_user, body) return json_success() check_send_webhook_message(request, user_profile, topic, body) return json_success()
def api_teamcity_webhook( request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any] = REQ(argument_type="body"), ) -> HttpResponse: message = payload.get("build") if message is None: # Ignore third-party specific (e.g. Slack) payload formats # and notify the bot owner message = MISCONFIGURED_PAYLOAD_TYPE_ERROR_MESSAGE.format( bot_name=user_profile.full_name, support_email=FromAddress.SUPPORT, ).strip() send_rate_limited_pm_notification_to_bot_owner(user_profile, user_profile.realm, message) return json_success() build_name = message["buildFullName"] build_url = message["buildStatusUrl"] changes_url = build_url + "&tab=buildChangesDiv" build_number = message["buildNumber"] build_result = message["buildResult"] build_result_delta = message["buildResultDelta"] build_status = message["buildStatus"] if build_result == "success": if build_result_delta == "fixed": status = "has been fixed! :thumbs_up:" else: status = "was successful! :thumbs_up:" elif build_result == "failure": if build_result_delta == "broken": status = f"is broken with status {build_status}! :thumbs_down:" else: status = f"is still broken with status {build_status}! :thumbs_down:" elif build_result == "running": status = "has started." template = """ {build_name} build {build_id} {status} See [changes]\ ({changes_url}) and [build log]({log_url}). """.strip() body = template.format( build_name=build_name, build_id=build_number, status=status, changes_url=changes_url, log_url=build_url, ) if "branchDisplayName" in message: topic = "{} ({})".format(build_name, message["branchDisplayName"]) else: topic = build_name # Check if this is a personal build, and if so try to private message the user who triggered it. if (get_teamcity_property_value(message["teamcityProperties"], "env.BUILD_IS_PERSONAL") == "true"): # The triggeredBy field gives us the teamcity user full name, and the # "teamcity.build.triggeredBy.username" property gives us the teamcity username. # Let's try finding the user email from both. teamcity_fullname = message["triggeredBy"].split(";")[0] teamcity_user = guess_zulip_user_from_teamcity(teamcity_fullname, user_profile.realm) if teamcity_user is None: teamcity_shortname = get_teamcity_property_value( message["teamcityProperties"], "teamcity.build.triggeredBy.username") if teamcity_shortname is not None: teamcity_user = guess_zulip_user_from_teamcity( teamcity_shortname, user_profile.realm) if teamcity_user is None: # We can't figure out who started this build - there's nothing we can do here. logging.info( "Teamcity webhook couldn't find a matching Zulip user for " "Teamcity user '%s' or '%s'", teamcity_fullname, teamcity_shortname, ) return json_success() body = f"Your personal build for {body}" client = get_request_notes(request).client assert client is not None check_send_private_message(user_profile, client, teamcity_user, body) return json_success() check_send_webhook_message(request, user_profile, topic, body) return json_success()