NCManageDatabase+Capabilities.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. //
  2. // NCManageDatabase+Capabilities.swift
  3. // Nextcloud
  4. //
  5. // Created by Marino Faggiana on 29/05/23.
  6. // Copyright © 2023 Marino Faggiana. All rights reserved.
  7. //
  8. // Author Marino Faggiana <marino.faggiana@nextcloud.com>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. import Foundation
  24. import RealmSwift
  25. import NextcloudKit
  26. class tableCapabilities: Object {
  27. @objc dynamic var account = ""
  28. @objc dynamic var jsondata: Data?
  29. override static func primaryKey() -> String {
  30. return "account"
  31. }
  32. }
  33. extension NCManageDatabase {
  34. func addCapabilitiesJSon(_ data: Data, account: String) {
  35. do {
  36. let realm = try Realm()
  37. try realm.write {
  38. let addObject = tableCapabilities()
  39. addObject.account = account
  40. addObject.jsondata = data
  41. realm.add(addObject, update: .all)
  42. }
  43. } catch let error {
  44. NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
  45. }
  46. }
  47. func getCapabilities(account: String) -> Data? {
  48. do {
  49. let realm = try Realm()
  50. realm.refresh()
  51. guard let result = realm.objects(tableCapabilities.self).filter("account == %@", account).first else { return nil }
  52. return result.jsondata
  53. } catch let error as NSError {
  54. NextcloudKit.shared.nkCommonInstance.writeLog("Could not access database: \(error)")
  55. }
  56. return nil
  57. }
  58. func setCapabilities(account: String, data: Data? = nil) {
  59. let jsonData: Data?
  60. struct CapabilityNextcloud: Codable {
  61. struct Ocs: Codable {
  62. let meta: Meta
  63. let data: Data
  64. struct Meta: Codable {
  65. let status: String?
  66. let message: String?
  67. let statuscode: Int?
  68. }
  69. struct Data: Codable {
  70. let version: Version
  71. let capabilities: Capabilities
  72. struct Version: Codable {
  73. let string: String
  74. let major: Int
  75. }
  76. struct Capabilities: Codable {
  77. let filessharing: FilesSharing?
  78. let theming: Theming?
  79. let endtoendencryption: EndToEndEncryption?
  80. let richdocuments: RichDocuments?
  81. let activity: Activity?
  82. let notifications: Notifications?
  83. let files: Files?
  84. let userstatus: UserStatus?
  85. let external: External?
  86. let groupfolders: GroupFolders?
  87. enum CodingKeys: String, CodingKey {
  88. case filessharing = "files_sharing"
  89. case theming
  90. case endtoendencryption = "end-to-end-encryption"
  91. case richdocuments, activity, notifications, files
  92. case userstatus = "user_status"
  93. case external, groupfolders
  94. }
  95. struct FilesSharing: Codable {
  96. let apienabled: Bool?
  97. let groupsharing: Bool?
  98. let resharing: Bool?
  99. let defaultpermissions: Int?
  100. let ncpublic: Public?
  101. enum CodingKeys: String, CodingKey {
  102. case apienabled = "api_enabled"
  103. case groupsharing = "group_sharing"
  104. case resharing
  105. case defaultpermissions = "default_permissions"
  106. case ncpublic = "public"
  107. }
  108. struct Public: Codable {
  109. let upload: Bool
  110. let enabled: Bool
  111. let password: Password?
  112. let sendmail: Bool
  113. let uploadfilesdrop: Bool
  114. let multiplelinks: Bool
  115. let expiredate: ExpireDate?
  116. let expiredateinternal: ExpireDate?
  117. let expiredateremote: ExpireDate?
  118. enum CodingKeys: String, CodingKey {
  119. case upload, enabled, password
  120. case sendmail = "send_mail"
  121. case uploadfilesdrop = "upload_files_drop"
  122. case multiplelinks = "multiple_links"
  123. case expiredate = "expire_date"
  124. case expiredateinternal = "expire_date_internal"
  125. case expiredateremote = "expire_date_remote"
  126. }
  127. struct Password: Codable {
  128. let enforced: Bool?
  129. let askForOptionalPassword: Bool?
  130. }
  131. struct ExpireDate: Codable {
  132. let enforced: Bool?
  133. let days: Int?
  134. }
  135. }
  136. }
  137. struct Theming: Codable {
  138. let color: String?
  139. let colorelement: String?
  140. let colortext: String?
  141. let colorelementbright: String?
  142. let backgrounddefault: Bool?
  143. let backgroundplain: Bool?
  144. let colorelementdark: String?
  145. let name: String?
  146. let slogan: String?
  147. let url: String?
  148. let logo: String?
  149. let background: String?
  150. let logoheader: String?
  151. let favicon: String?
  152. enum CodingKeys: String, CodingKey {
  153. case color
  154. case colorelement = "color-element"
  155. case colortext = "color-text"
  156. case colorelementbright = "color-element-bright"
  157. case backgrounddefault = "background-default"
  158. case backgroundplain = "background-plain"
  159. case colorelementdark = "color-element-dark"
  160. case name, slogan, url, logo, background, logoheader, favicon
  161. }
  162. }
  163. struct EndToEndEncryption: Codable {
  164. let enabled: Bool?
  165. let apiversion: String?
  166. let keysexist: Bool?
  167. enum CodingKeys: String, CodingKey {
  168. case enabled
  169. case apiversion = "api-version"
  170. case keysexist = "keys-exist"
  171. }
  172. }
  173. struct RichDocuments: Codable {
  174. let mimetypes: [String]?
  175. }
  176. struct Activity: Codable {
  177. let apiv2: [String]?
  178. }
  179. struct Notifications: Codable {
  180. let ocsendpoints: [String]?
  181. enum CodingKeys: String, CodingKey {
  182. case ocsendpoints = "ocs-endpoints"
  183. }
  184. }
  185. struct Files: Codable {
  186. let undelete: Bool?
  187. let locking: String?
  188. let comments: Bool?
  189. let versioning: Bool?
  190. let directEditing: DirectEditing?
  191. let bigfilechunking: Bool?
  192. let versiondeletion: Bool?
  193. let versionlabeling: Bool?
  194. enum CodingKeys: String, CodingKey {
  195. case undelete, locking, comments, versioning, directEditing, bigfilechunking
  196. case versiondeletion = "version_deletion"
  197. case versionlabeling = "version_labeling"
  198. }
  199. struct DirectEditing: Codable {
  200. let url: String?
  201. let etag: String?
  202. let supportsFileId: Bool?
  203. }
  204. }
  205. struct UserStatus: Codable {
  206. let enabled: Bool?
  207. let restore: Bool?
  208. let supportsemoji: Bool?
  209. enum CodingKeys: String, CodingKey {
  210. case enabled, restore
  211. case supportsemoji = "supports_emoji"
  212. }
  213. }
  214. struct External: Codable {
  215. let v1: [String]?
  216. }
  217. struct GroupFolders: Codable {
  218. let hasGroupFolders: Bool?
  219. }
  220. }
  221. }
  222. }
  223. let ocs: Ocs
  224. }
  225. if let data = data {
  226. jsonData = data
  227. } else {
  228. do {
  229. let realm = try Realm()
  230. guard let result = realm.objects(tableCapabilities.self).filter("account == %@", account).first,
  231. let data = result.jsondata else {
  232. return
  233. }
  234. jsonData = data
  235. } catch let error as NSError {
  236. NextcloudKit.shared.nkCommonInstance.writeLog("I cannot access to database: \(error)")
  237. return
  238. }
  239. }
  240. guard let jsonData = jsonData else { return }
  241. do {
  242. let json = try JSONDecoder().decode(CapabilityNextcloud.self, from: jsonData)
  243. NCGlobal.shared.capabilityServerVersion = json.ocs.data.version.string
  244. NCGlobal.shared.capabilityServerVersionMajor = json.ocs.data.version.major
  245. if NCGlobal.shared.capabilityServerVersionMajor > 0 {
  246. NextcloudKit.shared.setup(nextcloudVersion: NCGlobal.shared.capabilityServerVersionMajor)
  247. }
  248. NCGlobal.shared.capabilityFileSharingApiEnabled = json.ocs.data.capabilities.filessharing?.apienabled ?? false
  249. NCGlobal.shared.capabilityFileSharingDefaultPermission = json.ocs.data.capabilities.filessharing?.defaultpermissions ?? 0
  250. NCGlobal.shared.capabilityFileSharingPubPasswdEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.password?.enforced ?? false
  251. NCGlobal.shared.capabilityFileSharingPubExpireDateEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredate?.enforced ?? false
  252. NCGlobal.shared.capabilityFileSharingPubExpireDateDays = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredate?.days ?? 0
  253. NCGlobal.shared.capabilityFileSharingInternalExpireDateEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateinternal?.enforced ?? false
  254. NCGlobal.shared.capabilityFileSharingInternalExpireDateDays = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateinternal?.days ?? 0
  255. NCGlobal.shared.capabilityFileSharingRemoteExpireDateEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateremote?.enforced ?? false
  256. NCGlobal.shared.capabilityFileSharingRemoteExpireDateDays = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateremote?.days ?? 0
  257. NCGlobal.shared.capabilityThemingColor = json.ocs.data.capabilities.theming?.color ?? ""
  258. NCGlobal.shared.capabilityThemingColorElement = json.ocs.data.capabilities.theming?.colorelement ?? ""
  259. NCGlobal.shared.capabilityThemingColorText = json.ocs.data.capabilities.theming?.colortext ?? ""
  260. NCGlobal.shared.capabilityThemingName = json.ocs.data.capabilities.theming?.name ?? ""
  261. NCGlobal.shared.capabilityThemingSlogan = json.ocs.data.capabilities.theming?.slogan ?? ""
  262. NCGlobal.shared.capabilityE2EEEnabled = json.ocs.data.capabilities.endtoendencryption?.enabled ?? false
  263. NCGlobal.shared.capabilityE2EEApiVersion = json.ocs.data.capabilities.endtoendencryption?.apiversion ?? ""
  264. NCGlobal.shared.capabilityRichdocumentsMimetypes.removeAll()
  265. if let mimetypes = json.ocs.data.capabilities.richdocuments?.mimetypes {
  266. for mimetype in mimetypes {
  267. NCGlobal.shared.capabilityRichdocumentsMimetypes.append(mimetype)
  268. }
  269. }
  270. NCGlobal.shared.capabilityActivity.removeAll()
  271. if let activities = json.ocs.data.capabilities.activity?.apiv2 {
  272. for activity in activities {
  273. NCGlobal.shared.capabilityActivity.append(activity)
  274. }
  275. }
  276. NCGlobal.shared.capabilityNotification.removeAll()
  277. if let notifications = json.ocs.data.capabilities.notifications?.ocsendpoints {
  278. for notification in notifications {
  279. NCGlobal.shared.capabilityNotification.append(notification)
  280. }
  281. }
  282. NCGlobal.shared.capabilityFilesUndelete = json.ocs.data.capabilities.files?.undelete ?? false
  283. NCGlobal.shared.capabilityFilesLockVersion = json.ocs.data.capabilities.files?.locking ?? ""
  284. NCGlobal.shared.capabilityFilesComments = json.ocs.data.capabilities.files?.comments ?? false
  285. NCGlobal.shared.capabilityFilesBigfilechunking = json.ocs.data.capabilities.files?.bigfilechunking ?? false
  286. NCGlobal.shared.capabilityUserStatusEnabled = json.ocs.data.capabilities.files?.undelete ?? false
  287. if json.ocs.data.capabilities.external != nil {
  288. NCGlobal.shared.capabilityExternalSites = true
  289. }
  290. NCGlobal.shared.capabilityGroupfoldersEnabled = json.ocs.data.capabilities.groupfolders?.hasGroupFolders ?? false
  291. } catch let error as NSError {
  292. NextcloudKit.shared.nkCommonInstance.writeLog("I cannot access to database: \(error)")
  293. return
  294. }
  295. }
  296. }