mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Swift
		
	
| 
								 
											3 years ago
										 
									 | 
							
								// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import Foundation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extension SnodeAPI {
							 | 
						||
| 
								 | 
							
								    public class DeleteAllBeforeRequest: SnodeAuthenticatedRequestBody {
							 | 
						||
| 
								 | 
							
								        enum CodingKeys: String, CodingKey {
							 | 
						||
| 
								 | 
							
								            case beforeMs = "before"
							 | 
						||
| 
								 | 
							
								            case namespace
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        let beforeMs: UInt64
							 | 
						||
| 
								 | 
							
								        let namespace: SnodeAPI.Namespace?
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        // MARK: - Init
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        public init(
							 | 
						||
| 
								 | 
							
								            beforeMs: UInt64,
							 | 
						||
| 
								 | 
							
								            namespace: SnodeAPI.Namespace?,
							 | 
						||
| 
								 | 
							
								            pubkey: String,
							 | 
						||
| 
								 | 
							
								            timestampMs: UInt64,
							 | 
						||
| 
								 | 
							
								            ed25519PublicKey: [UInt8],
							 | 
						||
| 
								 | 
							
								            ed25519SecretKey: [UInt8]
							 | 
						||
| 
								 | 
							
								        ) {
							 | 
						||
| 
								 | 
							
								            self.beforeMs = beforeMs
							 | 
						||
| 
								 | 
							
								            self.namespace = namespace
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            super.init(
							 | 
						||
| 
								 | 
							
								                pubkey: pubkey,
							 | 
						||
| 
								 | 
							
								                ed25519PublicKey: ed25519PublicKey,
							 | 
						||
| 
								 | 
							
								                ed25519SecretKey: ed25519SecretKey,
							 | 
						||
| 
								 | 
							
								                timestampMs: timestampMs
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        // MARK: - Coding
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        override public func encode(to encoder: Encoder) throws {
							 | 
						||
| 
								 | 
							
								            var container: KeyedEncodingContainer<CodingKeys> = encoder.container(keyedBy: CodingKeys.self)
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            try container.encode(beforeMs, forKey: .beforeMs)
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            // If no namespace is specified it defaults to the default namespace only (namespace
							 | 
						||
| 
								 | 
							
								            // 0), so instead in this case we want to explicitly delete from `all` namespaces
							 | 
						||
| 
								 | 
							
								            switch namespace {
							 | 
						||
| 
								 | 
							
								                case .some(let namespace): try container.encode(namespace, forKey: .namespace)
							 | 
						||
| 
								 | 
							
								                case .none: try container.encode("all", forKey: .namespace)
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            try super.encode(to: encoder)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        // MARK: - Abstract Methods
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        override func generateSignature() throws -> [UInt8] {
							 | 
						||
| 
								 | 
							
								            /// Ed25519 signature of `("delete_before" || namespace || before)`, signed by
							 | 
						||
| 
								 | 
							
								            /// `pubkey`.  Must be base64 encoded (json) or bytes (OMQ).  `namespace` is the stringified
							 | 
						||
| 
								 | 
							
								            /// version of the given non-default namespace parameter (i.e. "-42" or "all"), or the empty
							 | 
						||
| 
								 | 
							
								            /// string for the default namespace (whether explicitly given or not).
							 | 
						||
| 
								 | 
							
								            let verificationBytes: [UInt8] = SnodeAPI.Endpoint.deleteAllBefore.rawValue.bytes
							 | 
						||
| 
								 | 
							
								                .appending(
							 | 
						||
| 
								 | 
							
								                    contentsOf: (namespace == nil ?
							 | 
						||
| 
								 | 
							
								                        "all" :
							 | 
						||
| 
								 | 
							
								                        namespace?.verificationString
							 | 
						||
| 
								 | 
							
								                    )?.bytes
							 | 
						||
| 
								 | 
							
								                )
							 | 
						||
| 
								 | 
							
								                .appending(contentsOf: "\(beforeMs)".data(using: .ascii)?.bytes)
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            guard
							 | 
						||
| 
								 | 
							
								                let signatureBytes: [UInt8] = sodium.wrappedValue.sign.signature(
							 | 
						||
| 
								 | 
							
								                    message: verificationBytes,
							 | 
						||
| 
								 | 
							
								                    secretKey: ed25519SecretKey
							 | 
						||
| 
								 | 
							
								                )
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                throw SnodeAPIError.signingFailed
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            return signatureBytes
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |