String path, [
Map<String, String> queryParameters,
]) async {
- if (!path.startsWith("/api2/json")) {
- path = "/api2/json" + path;
+ if (!path.startsWith('/api2/json')) {
+ path = '/api2/json' + path;
}
final baseUrl = Uri.parse(await getPlatformAwareOrigin());
queryParameters
String path, [
Map<String, String> parameters,
]) async {
- if (!path.startsWith("/api2/json")) {
- path = "/api2/json" + path;
+ if (!path.startsWith('/api2/json')) {
+ path = '/api2/json' + path;
}
final baseUrl = Uri.parse(await getPlatformAwareOrigin());
parameters?.removeWhere((key, value) => value == null || value.isEmpty);
String path, [
Map<String, String> parameters,
]) async {
- if (!path.startsWith("/api2/json")) {
- path = "/api2/json" + path;
+ if (!path.startsWith('/api2/json')) {
+ path = '/api2/json' + path;
}
final baseUrl = Uri.parse(await getPlatformAwareOrigin());
parameters?.removeWhere((key, value) => value == null || value.isEmpty);
Future<ProxmoxApiClient> finishTfaChallenge(String code) async {
if (!credentials.tfa) {
- throw StateError("No tfa challange expected");
+ throw StateError('No tfa challange expected');
}
_credentials = await credentials.tfaChallenge(code, httpClient: this);
Future<http.Response> _getWithValidation(
String path, Map<String, dynamic> queryParameters,
{bool extensiveResponseValidation = false}) async {
- if (!path.startsWith("/api2/json")) {
- path = "/api2/json" + path;
+ if (!path.startsWith('/api2/json')) {
+ path = '/api2/json' + path;
}
final baseUrl = Uri.parse(await getPlatformAwareOrigin());
Future<http.Response> _postWithValidation(
String path, Map<String, dynamic> queryParameters,
{bool extensiveResponseValidation = false}) async {
- if (!path.startsWith("/api2/json")) {
- path = "/api2/json" + path;
+ if (!path.startsWith('/api2/json')) {
+ path = '/api2/json' + path;
}
final baseUrl = Uri.parse(await getPlatformAwareOrigin());
Future<http.Response> _deleteWithValidation(
String path, Map<String, dynamic> queryParameters,
{bool extensiveResponseValidation = false}) async {
- if (!path.startsWith("/api2/json")) {
- path = "/api2/json" + path;
+ if (!path.startsWith('/api2/json')) {
+ path = '/api2/json' + path;
}
final baseUrl = Uri.parse(await getPlatformAwareOrigin());
if (ticket == null || ticket.isEmpty)
throw ArgumentError('Ticket not found');
- final matches = RegExp(r"(?:PVE|PMG|PMGQUAR):(?:(\S+):)?([A-Z0-9]{8})")
+ final matches = RegExp(r'(?:PVE|PMG|PMGQUAR):(?:(\S+):)?([A-Z0-9]{8})')
.firstMatch(ticket);
if (matches == null) throw FormatException('invalid cookie format');
final body = {'response': code};
final response =
- await httpClient.post(origin + "/api2/json/access/tfa", body: body);
+ await httpClient.post(origin + '/api2/json/access/tfa', body: body);
final credentials = await handleTfaChallengeResponse(response, this);
return credentials;
}
final bodyJson = jsonDecode(response.body)['data'];
final ticket = bodyJson['ticket'];
final csrfToken = bodyJson['CSRFPreventionToken'];
- final ticketRegex = RegExp(r"(PVE|PMG)(?:QUAR)?:(?:(\S+):)?([A-Z0-9]{8})::")
+ final ticketRegex = RegExp(r'(PVE|PMG)(?:QUAR)?:(?:(\S+):)?([A-Z0-9]{8})::')
.firstMatch(bodyJson['ticket']);
final time = DateTime.fromMillisecondsSinceEpoch(
int.parse(ticketRegex.group(3), radix: 16) * 1000);
print(response.body);
final bodyJson = jsonDecode(response.body)['data'];
final ticket = bodyJson['ticket'];
- final ticketRegex = RegExp(r"(PVE|PMG)(?:QUAR)?:(?:(\S+):)?([A-Z0-9]{8})::")
+ final ticketRegex = RegExp(r'(PVE|PMG)(?:QUAR)?:(?:(\S+):)?([A-Z0-9]{8})::')
.firstMatch(bodyJson['ticket']);
final time = DateTime.fromMillisecondsSinceEpoch(
int.parse(ticketRegex.group(3), radix: 16) * 1000);
String get displayName {
switch (type) {
- case "node":
+ case 'node':
return node;
- case "qemu":
+ case 'qemu':
return "$vmid ${name ?? ''}";
- case "lxc":
+ case 'lxc':
return "$vmid ${name ?? ''}";
- case "storage":
+ case 'storage':
return storage;
- case "pool":
+ case 'pool':
return pool;
default:
return id;
PveNodesModel._();
String renderMemoryUsagePercent() {
- if(memoryUsage == null ) return '';
+ if (memoryUsage == null) return '';
if (memoryUsage == -1) {
return '';
}
return '';
}
- return ((memoryUsage * 100) / memoryCount).toStringAsFixed(1) + " %";
+ return ((memoryUsage * 100) / memoryCount).toStringAsFixed(1) + ' %';
}
- return (memoryUsage * 100).toStringAsFixed(1) + " %";
+ return (memoryUsage * 100).toStringAsFixed(1) + ' %';
}
String renderCpuUsage() {
RegExp(r'(?:(?:^|.*;\s*)' + name + r'AuthCookie\s*\=\s*([^;]*).*$)|^.*$')
.firstMatch(document.cookie)
?.group(1) ??
- "");
+ '');
}
Future<void> storeTicket(String ticket, [String name = 'PVE']) async {
.having((e) => e.statusCode, 'http status code', statusCode));
void main() {
- Uri dummyEndpoint = Uri.parse("https://localhost/auth");
+ Uri dummyEndpoint = Uri.parse('https://localhost/auth');
setUp(() {});
- group("Response validation", () {
+ group('Response validation', () {
test('pass validation', () {
- var response = http.Response("no error", 200).validate(false);
- expect(response.body, equals("no error"));
+ var response = http.Response('no error', 200).validate(false);
+ expect(response.body, equals('no error'));
});
test('fail >= 400', () {
- var response = http.Response("", 400);
+ var response = http.Response('', 400);
expect(
() => response.validate(false),
throwsProxmoxApiException(
- "Request failed with status 400", equals(400)));
+ 'Request failed with status 400', equals(400)));
});
test('fail >= 400 with reason phrase', () {
- var response = http.Response("", 400, reasonPhrase: "this did not work");
+ var response = http.Response('', 400, reasonPhrase: 'this did not work');
expect(() => response.validate(false),
- throwsProxmoxApiException("400: this did not work", equals(400)));
+ throwsProxmoxApiException('400: this did not work', equals(400)));
});
test('valid credentials extraction', () {
final ticket =
- "PVE:root@pam:5DF8EC22::STV4HNO1wplmsyMDM5s6SUsU4cS7sBBBw+HOCEhSSV+6WGtz3zwIzHqBhq/ziJoBs7NqqyLXG4wn9jXJCMdYht+ndqwxtdFQsUNOF1Q/eTWwcyl+Q1fmPNOIIUoxMY8OqGBVozgIimiAJxdqm+2SJnrPEmlJge6m3yf/OEVAkKFCfRMOtSuyVnIbuLx6h6obvezBUP5+ZHzeTMmmXcH4rOsOKgW9XfwryLHbkjjq9Ennx0xjQaBD9Bo5ERquY0hNmWcdPC/p7ZzILTr4xH9sJe9Na2z6GhgJyTgOCAMengyIegySMq7IKIkmsp8odF4/iIC3005/XLF4w/DjPYQUMA==";
- final csrfToken = "5DF8EDEC:/bb44xdHyVQDo2eD/8ty0WVXwMgwt1HjhVHLZX2YbxQ";
+ 'PVE:root@pam:5DF8EC22::STV4HNO1wplmsyMDM5s6SUsU4cS7sBBBw+HOCEhSSV+6WGtz3zwIzHqBhq/ziJoBs7NqqyLXG4wn9jXJCMdYht+ndqwxtdFQsUNOF1Q/eTWwcyl+Q1fmPNOIIUoxMY8OqGBVozgIimiAJxdqm+2SJnrPEmlJge6m3yf/OEVAkKFCfRMOtSuyVnIbuLx6h6obvezBUP5+ZHzeTMmmXcH4rOsOKgW9XfwryLHbkjjq9Ennx0xjQaBD9Bo5ERquY0hNmWcdPC/p7ZzILTr4xH9sJe9Na2z6GhgJyTgOCAMengyIegySMq7IKIkmsp8odF4/iIC3005/XLF4w/DjPYQUMA==';
+ final csrfToken = '5DF8EDEC:/bb44xdHyVQDo2eD/8ty0WVXwMgwt1HjhVHLZX2YbxQ';
var response = http.Response(
'{"data":{"clustername":"testcluster","username":"root@pam","CSRFPreventionToken":"5DF8EDEC:/bb44xdHyVQDo2eD/8ty0WVXwMgwt1HjhVHLZX2YbxQ","cap":{"nodes":{"Sys.Modify":1,"Sys.PowerMgmt":1,"Sys.Audit":1,"Sys.Syslog":1,"Sys.Console":1,"Permissions.Modify":1},"access":{"Permissions.Modify":1,"User.Modify":1,"Group.Allocate":1},"vms":{"VM.Backup":1,"Permissions.Modify":1,"VM.Snapshot":1,"VM.Config.Network":1,"VM.Config.Disk":1,"VM.Clone":1,"VM.Config.CDROM":1,"VM.Monitor":1,"VM.Allocate":1,"VM.Config.Options":1,"VM.Console":1,"VM.Migrate":1,"VM.Snapshot.Rollback":1,"VM.PowerMgmt":1,"VM.Audit":1,"VM.Config.CPU":1,"VM.Config.Memory":1,"VM.Config.HWType":1},"storage":{"Permissions.Modify":1,"Datastore.Audit":1,"Datastore.Allocate":1,"Datastore.AllocateTemplate":1,"Datastore.AllocateSpace":1},"dc":{"Sys.Audit":1}},"ticket":"PVE:root@pam:5DF8EC22::STV4HNO1wplmsyMDM5s6SUsU4cS7sBBBw+HOCEhSSV+6WGtz3zwIzHqBhq/ziJoBs7NqqyLXG4wn9jXJCMdYht+ndqwxtdFQsUNOF1Q/eTWwcyl+Q1fmPNOIIUoxMY8OqGBVozgIimiAJxdqm+2SJnrPEmlJge6m3yf/OEVAkKFCfRMOtSuyVnIbuLx6h6obvezBUP5+ZHzeTMmmXcH4rOsOKgW9XfwryLHbkjjq9Ennx0xjQaBD9Bo5ERquY0hNmWcdPC/p7ZzILTr4xH9sJe9Na2z6GhgJyTgOCAMengyIegySMq7IKIkmsp8odF4/iIC3005/XLF4w/DjPYQUMA=="}}',
200);
expect(
- handleAccessTicketResponse(response, "root", dummyEndpoint),
+ handleAccessTicketResponse(response, 'root', dummyEndpoint),
isA<Credentials>()
.having((e) => e.ticket, 'Ticket', ticket)
- .having((e) => e.csrfToken, "CSRF Token", csrfToken)
+ .having((e) => e.csrfToken, 'CSRF Token', csrfToken)
.having(
(e) => e.expiration,
- "Token expiration time",
+ 'Token expiration time',
DateTime.fromMillisecondsSinceEpoch(
- int.parse("5DF8EC22", radix: 16) * 1000)));
+ int.parse('5DF8EC22', radix: 16) * 1000)));
});
});
}