TF-1645 Fix can not parse mail capability

(cherry picked from commit fcbe822f76f73cd237dd27069b5f77a1f6b02ff3)
This commit is contained in:
dab246
2023-03-24 16:53:44 +07:00
committed by Dat Vu
parent a11415ce9c
commit 6ccf0232a7
4 changed files with 126 additions and 102 deletions
@@ -377,7 +377,7 @@ class EmailAPI with HandleSetErrorMixin {
final coreCapability = moveRequest.session.getCapabilityProperties<CoreCapability>( final coreCapability = moveRequest.session.getCapabilityProperties<CoreCapability>(
accountId, CapabilityIdentifier.jmapCore); accountId, CapabilityIdentifier.jmapCore);
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt(); final maxMethodCount = coreCapability.maxCallsInRequest?.value.toInt() ?? 0;
var start = 0; var start = 0;
var end = 0; var end = 0;
@@ -185,7 +185,7 @@ class MailboxAPI with HandleSetErrorMixin {
final coreCapability = session.getCapabilityProperties<CoreCapability>( final coreCapability = session.getCapabilityProperties<CoreCapability>(
accountId, CapabilityIdentifier.jmapCore); accountId, CapabilityIdentifier.jmapCore);
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt(); final maxMethodCount = coreCapability.maxCallsInRequest?.value.toInt() ?? 0;
final Map<Id,SetError> finalDeletedMailboxErrors = {}; final Map<Id,SetError> finalDeletedMailboxErrors = {};
var start = 0; var start = 0;
@@ -64,9 +64,14 @@ class QuotasController extends BaseController {
void _handleGetQuotasSuccess(GetQuotasSuccess success) { void _handleGetQuotasSuccess(GetQuotasSuccess success) {
try { try {
final quotas = success.quotas.firstWhere((e) => e.resourceType == ResourceType.octets); final quotas = success.quotas.firstWhere((e) => e.resourceType == ResourceType.octets);
usedCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.used.value); if (quotas.used != null) {
warningLimitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit.value * warningProgressConstant); usedCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.used!.value);
limitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit.value); }
if (quotas.limit != null) {
warningLimitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit!.value * warningProgressConstant);
limitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit!.value);
}
if(usedCapacity.value >= limitCapacity.value) { if(usedCapacity.value >= limitCapacity.value) {
quotasState.value = QuotasState.runOutOfStorage; quotasState.value = QuotasState.runOutOfStorage;
} else if (usedCapacity.value >= warningLimitCapacity.value) { } else if (usedCapacity.value >= warningLimitCapacity.value) {
+116 -97
View File
@@ -24,17 +24,20 @@ void main() {
test('when session missing one capability exception should throw', () { test('when session missing one capability exception should throw', () {
final session = Session( final session = Session(
{ {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
submissionExtensions: {}
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true), CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
CapabilityIdentifier.jmapWebSocket: supportsPush: true,
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -45,20 +48,21 @@ void main() {
CapabilityIdentifier.jmapMdn: MdnCapability() CapabilityIdentifier.jmapMdn: MdnCapability()
}, },
{ {
AccountId(Id( AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): Account(AccountName('bob@domain.tld'), true, false, {
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): CapabilityIdentifier.jmapSubmission: SubmissionCapability(
Account(AccountName('bob@domain.tld'), true, false, { maxDelayedSend: UnsignedInt(0),
CapabilityIdentifier.jmapSubmission: submissionExtensions: {}
SubmissionCapability(UnsignedInt(0), {}), ),
CapabilityIdentifier.jmapWebSocket: WebSocketCapability( CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
true, Uri.parse('ws://domain.com/jmap/ws')), supportsPush: true,
url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -110,17 +114,20 @@ void main() {
test('when account capabilities is empty exception should throw', () { test('when account capabilities is empty exception should throw', () {
final session = Session( final session = Session(
{ {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
submissionExtensions: {}
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true), CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
CapabilityIdentifier.jmapWebSocket: supportsPush: true,
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -177,17 +184,20 @@ void main() {
final invalidId = Id("29883977c13473ae7cb7678ef767cbffabfc8a44a6e463d971d23a65c1dc4af6"); final invalidId = Id("29883977c13473ae7cb7678ef767cbffabfc8a44a6e463d971d23a65c1dc4af6");
final session = Session( final session = Session(
{ {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
submissionExtensions: {}
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true), CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
CapabilityIdentifier.jmapWebSocket: supportsPush: true,
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -201,17 +211,20 @@ void main() {
AccountId(Id( AccountId(Id(
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
Account(AccountName('bob@domain.tld'), true, false, { Account(AccountName('bob@domain.tld'), true, false, {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
submissionExtensions: {}
),
CapabilityIdentifier.jmapWebSocket: WebSocketCapability( CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
true, Uri.parse('ws://domain.com/jmap/ws')), supportsPush: true,
url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -263,17 +276,20 @@ void main() {
test('when accounts empty should throw exception', () { test('when accounts empty should throw exception', () {
final session = Session( final session = Session(
{ {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
submissionExtensions: {}
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true), CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
CapabilityIdentifier.jmapWebSocket: supportsPush: true,
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -325,27 +341,30 @@ void main() {
test('when session have all required capabilities exception should not throw', () { test('when session have all required capabilities exception should not throw', () {
final session = Session( final session = Session(
{ {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
submissionExtensions: {}
),
CapabilityIdentifier.jmapCore: CoreCapability( CapabilityIdentifier.jmapCore: CoreCapability(
UnsignedInt(20971520), maxSizeUpload: UnsignedInt(20971520),
UnsignedInt(4), maxConcurrentUpload: UnsignedInt(4),
UnsignedInt(10000000), maxSizeRequest: UnsignedInt(10000000),
UnsignedInt(4), maxConcurrentRequests: UnsignedInt(4),
UnsignedInt(16), maxCallsInRequest: UnsignedInt(16),
UnsignedInt(500), maxObjectsInGet: UnsignedInt(500),
UnsignedInt(500), maxObjectsInSet: UnsignedInt(500),
{CollationIdentifier("i;unicode-casemap")} collationAlgorithms: {CollationIdentifier("i;unicode-casemap")}
), ),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true), CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
CapabilityIdentifier.jmapWebSocket: supportsPush: true,
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), url: Uri.parse('ws://domain.com/jmap/ws')
),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),
@@ -359,26 +378,26 @@ void main() {
AccountId(Id( AccountId(Id(
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
Account(AccountName('bob@domain.tld'), true, false, { Account(AccountName('bob@domain.tld'), true, false, {
CapabilityIdentifier.jmapSubmission: CapabilityIdentifier.jmapSubmission: SubmissionCapability(
SubmissionCapability(UnsignedInt(0), {}), maxDelayedSend: UnsignedInt(0),
CapabilityIdentifier.jmapWebSocket: WebSocketCapability( submissionExtensions: {}
true, Uri.parse('ws://domain.com/jmap/ws')), ),
CapabilityIdentifier.jmapCore: CoreCapability( CapabilityIdentifier.jmapCore: CoreCapability(
UnsignedInt(20971520), maxSizeUpload: UnsignedInt(20971520),
UnsignedInt(4), maxConcurrentUpload: UnsignedInt(4),
UnsignedInt(10000000), maxSizeRequest: UnsignedInt(10000000),
UnsignedInt(4), maxConcurrentRequests: UnsignedInt(4),
UnsignedInt(16), maxCallsInRequest: UnsignedInt(16),
UnsignedInt(500), maxObjectsInGet: UnsignedInt(500),
UnsignedInt(500), maxObjectsInSet: UnsignedInt(500),
{CollationIdentifier("i;unicode-casemap")}), collationAlgorithms: {CollationIdentifier("i;unicode-casemap")}
),
CapabilityIdentifier.jmapMail: MailCapability( CapabilityIdentifier.jmapMail: MailCapability(
UnsignedInt(10000000), maxMailboxesPerEmail: UnsignedInt(10000000),
null, maxSizeAttachmentsPerEmail: UnsignedInt(20000000),
UnsignedInt(200), emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"},
UnsignedInt(20000000), mayCreateTopLevelMailbox: true
{"receivedAt", "sentAt", "size", "from", "to", "subject"}, ),
true),
CapabilityIdentifier( CapabilityIdentifier(
Uri.parse('urn:apache:james:params:jmap:mail:quota')): Uri.parse('urn:apache:james:params:jmap:mail:quota')):
DefaultCapability(<String, dynamic>{}), DefaultCapability(<String, dynamic>{}),