Skip to content

Commit

Permalink
wip: add periodic policy checks
Browse files Browse the repository at this point in the history
  • Loading branch information
dufkan committed May 2, 2024
1 parent f3cb771 commit d913a5f
Showing 1 changed file with 75 additions and 18 deletions.
93 changes: 75 additions & 18 deletions meesign_core/bin/policy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,48 @@ import 'dart:convert';

import 'package:args/args.dart';
import 'package:meesign_core/meesign_core.dart';
import 'package:meta/meta.dart';

extension Range<T> on Comparable<T> {
bool within(T a, T b) => compareTo(a) >= 0 && compareTo(b) <= 0;
}

@immutable
class Time implements Comparable<Time> {
final int hour;
final int minute;

const Time({required this.hour, required this.minute});

factory Time.now() {
final now = DateTime.now();
return Time(hour: now.hour, minute: now.minute);
}

static Time parse(String string) {
final parts = string.trim().split(':');
if (parts.length != 2) throw FormatException('Invalid time format');

final hour = int.parse(parts[0]);
if (!hour.within(0, 23)) throw FormatException('Hour out of range');
final minute = int.parse(parts[1]);
if (!minute.within(0, 59)) throw FormatException('Minute out of range');

return Time(hour: hour, minute: minute);
}

@override
String toString() {
String pad(num n) => n.toString().padLeft(2, '0');
return '${pad(hour)}:${pad(minute)}';
}

@override
int compareTo(Time other) {
int encode(Time t) => 60 * t.hour + t.minute;
return encode(this) - encode(other);
}
}

Group getGroup<T>(Task<T> task) {
if (task.info is Challenge) {
Expand All @@ -30,16 +72,8 @@ extension TaskDecision<T> on TaskRepository<T> {
});
}

StreamSubscription<Task<T>> decide(Uuid did,
{required bool Function(Task<T>) agree}) {
return observeTasks(did)
.expand((tasks) => tasks)
.where((task) => !task.approved)
.listen((task) async {
var g = getGroup(task);
print("Deciding: ${g.name}, ${g.note}");
await approveTask(did, task.id, agree: agree(task));
});
void decide(Uuid did, Map<String, dynamic> policy) {
// TODO
}
}

Expand All @@ -59,9 +93,30 @@ void printUsage(ArgParser parser, IOSink sink) {
sink.writeln(parser.usage);
}

bool Function(Task<T>) constructPolicy<T>(Map<String, dynamic> policy) {
final approve = policy["deny"] != true;
return (Task _) => approve;
bool Function(Task<T>) constructPolicy<T>(Map<String, dynamic> basePolicy, Map<String, dynamic> extPolicy) {
var policy = basePolicy;
if (policy["overridable"] ?? false) {
policy = {...basePolicy, ...extPolicy};
}
if (policy["fail"] ?? false) {
return (Task<T> _) => false;
}

var policyFunc = (Task<T> _) => true;

if (policy["from"].isNotEmpty && policy["to"].isNotEmpty) {
late final Time from, to;
try {
from = Time.parse(policy['from']);
to = Time.parse(policy['to']);
} on Exception catch (e) {
print("Error parsing time: $e");
}
policyFunc = (Task<T> t) {
return policyFunc(t) && Time.now().within(from, to);
};
}
return policyFunc;
}

void main(List<String> args) async {
Expand Down Expand Up @@ -111,8 +166,6 @@ void main(List<String> args) async {
}
}

final policy = constructPolicy(policyData);

final appDir = Directory('app/');

final database = Database(appDir);
Expand Down Expand Up @@ -152,9 +205,13 @@ void main(List<String> args) async {
await decryptRepository.subscribe(device.id);

groupRepository.approveAll(device.id);
fileRepository.decide(device.id, agree: policy);
challengeRepository.decide(device.id, agree: policy);
decryptRepository.decide(device.id, agree: policy);

Timer.periodic(Duration(seconds: 1), (_) {
print("HELLO");
fileRepository.decide(device.id, policyData);
challengeRepository.decide(device.id, policyData);
decryptRepository.decide(device.id, policyData);
});

ProcessSignal.sigint.watch().listen((signal) {
database.close();
Expand Down

0 comments on commit d913a5f

Please sign in to comment.