blob: 0ab4b6ff9c7e3f6804d2689aff878a1e77bf281f [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// Various utility methods for processing on GitHub events.
library github_label_notifier.github_utils;
import 'dart:convert';
import 'package:node_interop/buffer.dart';
import 'package:node_io/node_io.dart';
import 'package:github_label_notifier/node_crypto.dart';
/// Computes the GitHub event signature for the given [body] using
/// `GITHUB_SECRET` environment variable as a key.
String signEvent(dynamic body) {
final secret = Platform.environment['GITHUB_SECRET'];
if (secret == null) {
throw 'GITHUB_SECRET is missing';
}
final bodyHmac =
crypto.createHmac('sha1', secret).update(jsonEncode(body)).digest('hex');
return 'sha1=${bodyHmac}';
}
/// Validate that the given [body] and [signature] against `GITHUB_SECRET`
/// environment variable.
bool verifyEventSignature(dynamic body, String signature) {
final expectedSignature = signEvent(body);
return signature.length == expectedSignature.length &&
crypto.timingSafeEqual(
Buffer.from(signature), Buffer.from(expectedSignature));
}