aboutsummaryrefslogtreecommitdiffstats
path: root/lib/config.dart
blob: d3e3936a4794dfa03468b32da791ea794e2b6ed3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// SPDX-License-Identifier: Apache-2.0
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:yaml/yaml.dart';

class KuksaConfig {
  final String hostname;
  final int port;
  final String authorization;
  final bool use_tls;
  final List<int> ca_certificate;
  final String tls_server_name;

  static String configFilePath = '/etc/xdg/AGL/homescreen.yaml';
  static String defaultHostname = 'localhost';
  static int defaultPort = 55555;
  static String defaultCaCertPath = '/etc/kuksa-val/CA.pem';

  KuksaConfig({required this.hostname, required this.port, required this.authorization,
    required this.use_tls, required this.ca_certificate, required this.tls_server_name});
}

// NOTE: This may need to be changed to a FutureProvider to avoid slowing
//       down the top-level widget initState...

final kuksaConfigProvider = Provider((ref) {
  final configFile = File(KuksaConfig.configFilePath);
  try {
    print("Reading configuration ${KuksaConfig.configFilePath}");
    String content = configFile.readAsStringSync();
    final dynamic yamlMap = loadYaml(content);

    String hostname = KuksaConfig.defaultHostname;
    if (yamlMap.containsKey('hostname')) {
      hostname = yamlMap['hostname'];
    }

    int port = KuksaConfig.defaultPort;
    if (yamlMap.containsKey('port')) {
      port = yamlMap['port'];
    }

    String token = "";
    if (yamlMap.containsKey('authorization')) {
      String s = yamlMap['authorization'];
      if (s.isNotEmpty) {
        if (s.startsWith("/")) {
          debugPrint("Reading authorization token $s");
          try {
            token = File(s).readAsStringSync();
          } on Exception catch(_) {
            print("ERROR: Could not read authorization token file $token");
            token = "";
          }
        } else {
          token = s;
        }
      }
    }
    //debugPrint("authorization = $token");

    bool use_tls = false;
    if (yamlMap.containsKey('use-tls')) {
      var value = yamlMap['use-tls'];
      if (value is bool)
        use_tls = value;
    }
    //debugPrint("Use TLS = $use_tls");

    List<int> ca_cert = [];
    String ca_path = KuksaConfig.defaultCaCertPath;
    if (yamlMap.containsKey('ca-certificate')) {
      ca_path = yamlMap['ca-certificate'];
    }
    try {
      ca_cert = File(ca_path).readAsBytesSync();
    } on Exception catch(_) {
      print("ERROR: Could not read CA certificate file $ca_path");
      ca_cert = [];
    }
    //debugPrint("CA cert = $ca_cert");

    String tls_server_name = "";
    if (yamlMap.containsKey('tls-server-name')) {
      tls_server_name = yamlMap['tls_server_name'];
    }

    return KuksaConfig(
          hostname: hostname,
          port: port,
          authorization: token,
          use_tls: use_tls,
          ca_certificate: ca_cert,
          tls_server_name: tls_server_name
        );
  } on Exception catch(_) {
    return KuksaConfig(
          hostname: KuksaConfig.defaultHostname,
          port: KuksaConfig.defaultPort,
          authorization: "",
          use_tls: false,
          ca_certificate: [],
          tls_server_name: ""
        );
  }
});