Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Modules/CryptoLib/Sources/CryptoObjC/include/Decrypt.mm
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ @implementation Addressee (label)

- (instancetype)initWithLabel:(const std::string &)label pub:(NSData*)pub concatKDFAlgorithmURI:(NSString *)concatKDFAlgorithmURI {
std::map<std::string, std::string> info = libcdoc::Recipient::parseLabel(label);
id cn = info.contains("cn") ? [NSString stringWithStdString:info["cn"]] : nil;
id cn = info.contains("cn") ? [NSString stringWithStdString:info["cn"]] : [NSString stringWithStdString:label];
id type = info.contains("type") ? [NSString stringWithStdString:info["type"]] : nil;
id serial = info.contains("serial_number") ? [NSString stringWithStdString:info["serial_number"]] : nil;
CertType certType = CertTypeUnknownType;
Expand Down
87 changes: 80 additions & 7 deletions Modules/CryptoLib/Sources/CryptoSwift/CryptoContainer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,74 @@ public actor CryptoContainer: CryptoContainerProtocol, Loggable {
return containerFile
}

public func addDataFiles(_ filesToAdd: [URL]) async {
dataFiles?.append(contentsOf: filesToAdd)
public func addDataFiles(_ filesToAdd: [URL]) async throws {
let cryptoContainersDirectory = try Directories.getCacheDirectory(
subfolders: [Constants.Folder.ContainerFolder, Constants.Folder.Temp],
fileManager: fileManager
)

var movedFiles: [URL] = []
var duplicateFileCount = 0
var failedFileCount = 0
let totalFileCount = filesToAdd.count

let existingDataFiles = Set(dataFiles?.compactMap { $0?.lastPathComponent } ?? [])

var duplicateFileName: String?

for fileToAdd in filesToAdd {
let fileName = fileToAdd.lastPathComponent
let destinationURL = cryptoContainersDirectory.appendingPathComponent(fileName)

if existingDataFiles.contains(fileName) ||
movedFiles.contains(where: { $0.lastPathComponent == fileName }) {

duplicateFileCount += 1

if duplicateFileCount == 1 {
duplicateFileName = fileName
}

continue
}

do {
if fileManager.fileExists(atPath: destinationURL.path) {
try fileManager.removeItem(at: destinationURL)
}

try fileManager.copyItem(at: fileToAdd, to: destinationURL)
movedFiles.append(destinationURL)

} catch {
failedFileCount += 1
}
}

if dataFiles == nil {
dataFiles = movedFiles
} else {
dataFiles?.append(contentsOf: movedFiles)
}

if duplicateFileCount > 0 || failedFileCount > 0 {
var userInfo: [String: String] = [
"totalFileCount": String(totalFileCount),
"failedFileCount": String(failedFileCount),
"duplicateFileCount": String(duplicateFileCount)
]

if duplicateFileCount == 1, let name = duplicateFileName {
userInfo["fileName"] = name
}

throw CryptoError.addingFilesToContainerFailed(
CryptoErrorDetail(
message: "Unable to add files to container",
userInfo: userInfo
)
)
}
}

public func addRecipients(_ recipientsToAdd: [Addressee]) async {
Expand Down Expand Up @@ -216,7 +282,6 @@ extension CryptoContainer {
CryptoContainer.logger().info("Is single file: \(isSingleFile, privacy: .public)")
CryptoContainer.logger().info("Is crypto container: \(isCryptoContainer, privacy: .public)")


guard isSingleFile && isCryptoContainer else {
var defaultExtension = CommonsLib.Constants.Extension.DefaultCrypto
if CDoc2Setting.isEncryptionEnabled {
Expand Down Expand Up @@ -362,17 +427,25 @@ extension CryptoContainer {
fileManager: fileManager
)

let isFileInTempCryptoContainersDirectory = containerFile.absoluteString.hasPrefix(
cryptoContainersDirectory.appending(path: Constants.Folder.Temp, directoryHint: .isDirectory).absoluteString
let savedContainersDirectory = try Directories.getCacheDirectory(
subfolders: [Constants.Folder.SavedFiles],
fileManager: fileManager
)

// Do not rename when nested container opened
let isFileInSavedContainersDirectory = containerFile.absoluteString.hasPrefix(
savedContainersDirectory.absoluteString
)

let isFileInRecentDocuments = containerFile.absoluteString.hasPrefix(
cryptoContainersDirectory.absoluteString
) && !isFileInTempCryptoContainersDirectory
)

let shouldRenameContainer = isFileInRecentDocuments && !isFileInSavedContainersDirectory

var renamedContainerFile = containerFile

if !isFileInRecentDocuments {
if shouldRenameContainer {
renamedContainerFile = Container.shared.containerUtil().getContainerFile(
for: containerFile,
in: isFileInRecentDocuments ? containerFile.deletingLastPathComponent() :
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public protocol CryptoContainerProtocol: GeneralContainer, Sendable {
func getContainerName() async -> String
func getContainerMimetype() async -> String
func getRawContainerFile() async -> URL?
func addDataFiles(_ filesToAdd: [URL]) async
func addDataFiles(_ filesToAdd: [URL]) async throws
func addRecipients(_ recipientsToAdd: [Addressee]) async

func getDataFiles() async -> [URL]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,6 @@ extension SignedContainer {
@MainActor
public static func openOrCreate(
dataFiles: [URL],
containerUtil: ContainerUtilProtocol = Container.shared.containerUtil(),
isSivaConfirmed: Bool
) async throws -> SignedContainerProtocol {
logger().info("Opening or creating container. Found \(dataFiles.count) datafile(s)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,8 @@ final class XMLParserHandler: NSObject, XMLParserDelegate {
) {
let formatAttribute = attributeDict["format"]
let nameAttribute = attributeDict["Name"]
if elementName == "SignedDoc", (
formatAttribute == "DIGIDOC-XML" || formatAttribute == "SK-XML"
) {
if elementName == "SignedDoc",
formatAttribute == "DIGIDOC-XML" || formatAttribute == "SK-XML" {
foundElement = .ddoc
parser.abortParsing()
} else if elementName == "denc:EncryptionProperty" &&
Expand Down
22 changes: 12 additions & 10 deletions RIADigiDoc/UI/Component/Container/Crypto/EncryptView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ struct EncryptView: View {
isEditContainerButtonShown: viewModel.isEditButtonShown,
isSaveButtonShown: viewModel.isContainerEncrypted || viewModel.isContainerDecrypted,
isSignButtonShown: viewModel.isSignButtonShown,
isEncryptButtonShown: viewModel.isEncryptButtonShown,
isEncryptButtonShown: false,
showLeftActionButton: false,
showRightActionButton: viewModel.isEncryptButtonShown ||
viewModel.isDecryptButtonShown,
Expand Down Expand Up @@ -324,7 +324,8 @@ struct EncryptView: View {
viewModel: viewModel,
showOpenFileButton: viewModel.isContainerUnlocked,
showSaveFileButton: viewModel.isContainerUnlocked,
showRemoveFileButton: viewModel.isContainerWithoutRecipients,
showRemoveFileButton: !viewModel.isContainerEncrypted &&
!viewModel.isContainerDecrypted,
isNestedContainer: isNestedContainer,
selectedDataFile: $selectedDataFile,
showSivaMessage: $showSivaMessage,
Expand Down Expand Up @@ -353,6 +354,7 @@ struct EncryptView: View {
}
}
.padding(Dimensions.Padding.SPadding)

if viewModel.isShareButtonShown {
if let containerFile = viewModel.containerURL {
ShareButtonBottomBar(
Expand All @@ -362,25 +364,25 @@ struct EncryptView: View {
containerUrl: containerFile
)
}
} else if !viewModel.isContainerEncrypted && !viewModel.isContainerDecrypted {
let rightButtonLabel = viewModel.isContainerWithoutRecipients ? nextLabel : encryptLabel
let rightButtonIconName = viewModel.isContainerWithoutRecipients
? "ic_m3_arrow_forward_48pt_wght400"
: "ic_m3_encrypted_48pt_wght400"
} else if viewModel.isContainerUnencrypted {
let rightButtonLabel = viewModel.isContainerUnencrypted ? nextLabel : encryptLabel
let rightButtonIconName = viewModel.isContainerUnencrypted
? "ic_m3_arrow_forward_48pt_wght400"
: "ic_m3_encrypted_48pt_wght400"
UnsignedBottomBarView(
showLeftButton: viewModel.isContainerWithoutRecipients,
showLeftButton: viewModel.isContainerUnencrypted,
leftButtonIconName: "ic_m3_add_48pt_wght400",
leftButtonLabel: addMoreFilesLabel,
leftButtonAccessibilityLabel: addMoreFilesLabel.lowercased(),
leftButtonAction: {
isImportingAddedFiles = true
},
rightButtonEnabled: viewModel.isContainerWithoutRecipients || encryptionButtonEnabled,
rightButtonEnabled: viewModel.isContainerUnencrypted || encryptionButtonEnabled,
rightButtonIconName: rightButtonIconName,
rightButtonLabel: rightButtonLabel,
rightButtonAccessibilityLabel: rightButtonLabel.lowercased(),
rightButtonAction: {
if viewModel.isContainerWithoutRecipients {
if viewModel.isContainerUnencrypted {
pathManager.replaceLast(to: .encryptRecipientView)
} else {
if encryptionButtonEnabled {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,11 @@ struct EncryptRecipientView: View {

var body: some View {
TopBarContainer(
isTopBarHidden: isSearchExpanded,
title: nil,
onLeftClick: {
pathManager.replaceLast(to: .encryptView(isWithEncryption: false))
},
showRightIcons: true,
showRightIcons: !isSearchExpanded,
content: {
ZStack {
VStack(alignment: .leading, spacing: Dimensions.Padding.ZeroPadding) {
Expand Down
16 changes: 9 additions & 7 deletions RIADigiDoc/UI/Component/Container/Crypto/RecipientView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,15 @@ struct RecipientView: View {
)

let certType = recipientUtil.getRecipientCertTypeText(certType: recipient.certType)
Text(verbatim:
"\(languageSettings.localized(certType)) " +
"\(languageSettings.localized("Valid to", [validToDate]))")
.font(typography.bodyMedium)
.foregroundStyle(theme.onSurfaceVariant)
.fixedSize(horizontal: false, vertical: true)
.multilineTextAlignment(.leading)
let validPart = validToDate.isEmpty
? ""
: " " + languageSettings.localized("Valid to", [validToDate])

Text(verbatim: languageSettings.localized(certType) + validPart)
.font(typography.bodyMedium)
.foregroundStyle(theme.onSurfaceVariant)
.fixedSize(horizontal: false, vertical: true)
.multilineTextAlignment(.leading)
}
.accessibilityElement(children: .combine)

Expand Down
4 changes: 2 additions & 2 deletions RIADigiDoc/UI/Component/Container/UnsignedBottomBarView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ struct UnsignedBottomBarView: View {
.disabled(!rightButtonEnabled)
.foregroundStyle(theme.surfaceContainer)
}
.padding(.vertical,Dimensions.Padding.SPadding)
.padding(.horizontal,Dimensions.Padding.MPadding)
.padding(.vertical, Dimensions.Padding.SPadding)
.padding(.horizontal, Dimensions.Padding.MPadding)
.background(theme.surfaceContainer)
}
}
Expand Down
69 changes: 33 additions & 36 deletions RIADigiDoc/UI/Component/Shared/TopBar/TopBar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ struct TopBarContainer<Content: View>: View {
@Environment(\.openURL) var openURL
@Environment(LanguageSettings.self) private var languageSettings

var isTopBarHidden = false
var title: String?
var titleAccessibility: String?

Expand Down Expand Up @@ -85,42 +84,40 @@ struct TopBarContainer<Content: View>: View {

var body: some View {
VStack(spacing: Dimensions.Padding.ZeroPadding) {
if !isTopBarHidden {
TopBar(
title: title,
titleAccessibility: titleAccessibility,
leftIcon: leftIcon,
leftIconAccessibility: leftIconAccessibility,
leftIconAccessibilityInput: leftIconAccessibilityInput,
onLeftClick: onLeftClick,

rightPrimaryIcon: rightPrimaryIcon,
rightPrimaryIconAccessibility: rightPrimaryIconAccessibilityLabel,
rightPrimaryIconAccessibilityInput: rightPrimaryIconAccessibilityInput,
isRightPrimaryLink: isRightPrimaryLink,
onRightPrimaryClick: onRightPrimaryClick ?? {
if let url = URL(string: helpUrlString) {
openURL(url)
}
},

rightSecondaryIcon: rightSecondaryIcon,
rightSecondaryIconAccessibility: rightSecondaryIconAccessibility,
rightSecondaryIconAccessibilityInput: rightSecondaryIconAccessibilityInput,
onRightSecondaryClick: onRightSecondaryClick ?? {
showSettingsSheet = true
},

extraButtonIcon: extraButtonIcon,
extraButtonIconAccessibility: extraButtonIconAccessibility,
extraButtonIconAccessibilityInput: extraButtonIconAccessibilityInput,
showExtraButton: showExtraButton,
extraBadgeCount: extraBadgeCount,
onExtraButtonClick: onExtraButtonClick,
showRightIcons: showRightIcons
)
TopBar(
title: title,
titleAccessibility: titleAccessibility,
leftIcon: leftIcon,
leftIconAccessibility: leftIconAccessibility,
leftIconAccessibilityInput: leftIconAccessibilityInput,
onLeftClick: onLeftClick,

rightPrimaryIcon: rightPrimaryIcon,
rightPrimaryIconAccessibility: rightPrimaryIconAccessibilityLabel,
rightPrimaryIconAccessibilityInput: rightPrimaryIconAccessibilityInput,
isRightPrimaryLink: isRightPrimaryLink,
onRightPrimaryClick: onRightPrimaryClick ?? {
if let url = URL(string: helpUrlString) {
openURL(url)
}
},

rightSecondaryIcon: rightSecondaryIcon,
rightSecondaryIconAccessibility: rightSecondaryIconAccessibility,
rightSecondaryIconAccessibilityInput: rightSecondaryIconAccessibilityInput,
onRightSecondaryClick: onRightSecondaryClick ?? {
showSettingsSheet = true
},

extraButtonIcon: extraButtonIcon,
extraButtonIconAccessibility: extraButtonIconAccessibility,
extraButtonIconAccessibilityInput: extraButtonIconAccessibilityInput,
showExtraButton: showExtraButton,
extraBadgeCount: extraBadgeCount,
onExtraButtonClick: onExtraButtonClick,
showRightIcons: showRightIcons
)

}
content()
}
.bottomSheet(isPresented: $showSettingsSheet, actions: buildBottomSheetActions())
Expand Down
1 change: 1 addition & 0 deletions RIADigiDoc/UI/Component/Toast/ToastOverlay.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ struct ToastOverlay: View {
height: Dimensions.Icon.IconSizeXXS
)
.foregroundStyle(style.foreground)
.accessibilityHidden(true)

Text(verbatim: message)
.lineLimit(nil)
Expand Down
Loading
Loading