ApiUtils.kt 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. /*
  2. * Nextcloud Talk - Android Client
  3. *
  4. * SPDX-FileCopyrightText: 2021-2022 Marcel Hibbe <dev@mhibbe.de>
  5. * SPDX-FileCopyrightText: 2021 Tim Krüger <t@timkrueger.me>
  6. * SPDX-FileCopyrightText: 2017-2018 Mario Danic <mario@lovelyhq.com>
  7. * SPDX-License-Identifier: GPL-3.0-or-later
  8. */
  9. package com.nextcloud.talk.utils
  10. import android.net.Uri
  11. import android.text.TextUtils
  12. import android.util.Log
  13. import com.nextcloud.talk.BuildConfig
  14. import com.nextcloud.talk.R
  15. import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
  16. import com.nextcloud.talk.data.user.model.User
  17. import com.nextcloud.talk.models.RetrofitBucket
  18. import com.nextcloud.talk.models.json.capabilities.SpreedCapability
  19. import com.nextcloud.talk.utils.CapabilitiesUtil.hasSpreedFeatureCapability
  20. import okhttp3.Credentials.basic
  21. import java.nio.charset.StandardCharsets
  22. @Suppress("TooManyFunctions")
  23. object ApiUtils {
  24. private val TAG = ApiUtils::class.java.simpleName
  25. const val API_V1 = 1
  26. private const val API_V2 = 2
  27. const val API_V3 = 3
  28. const val API_V4 = 4
  29. private const val AVATAR_SIZE_BIG = 512
  30. private const val AVATAR_SIZE_SMALL = 64
  31. private const val OCS_API_VERSION = "/ocs/v2.php"
  32. private const val SPREED_API_VERSION = "/apps/spreed/api/v1"
  33. private const val SPREED_API_BASE = "$OCS_API_VERSION/apps/spreed/api/v"
  34. @JvmStatic
  35. val userAgent = "Mozilla/5.0 (Android) Nextcloud-Talk v"
  36. get() = field + BuildConfig.VERSION_NAME
  37. @Deprecated(
  38. "This is only supported on API v1-3, in API v4+ please use " +
  39. "{@link ApiUtils#getUrlForAttendees(int, String, String)} instead."
  40. )
  41. fun getUrlForRemovingParticipantFromConversation(baseUrl: String?, roomToken: String?, isGuest: Boolean): String {
  42. var url = getUrlForParticipants(API_V1, baseUrl, roomToken)
  43. if (isGuest) {
  44. url += "/guests"
  45. }
  46. return url
  47. }
  48. private fun getRetrofitBucketForContactsSearch(baseUrl: String, searchQuery: String?): RetrofitBucket {
  49. var query = searchQuery
  50. val retrofitBucket = RetrofitBucket()
  51. retrofitBucket.url = "$baseUrl$OCS_API_VERSION/apps/files_sharing/api/v1/sharees"
  52. val queryMap: MutableMap<String, String> = HashMap()
  53. if (query == null) {
  54. query = ""
  55. }
  56. queryMap["format"] = "json"
  57. queryMap["search"] = query
  58. queryMap["itemType"] = "call"
  59. retrofitBucket.queryMap = queryMap
  60. return retrofitBucket
  61. }
  62. fun getUrlForFilePreviewWithRemotePath(baseUrl: String, remotePath: String?, px: Int): String {
  63. return (
  64. baseUrl + "/index.php/core/preview.png?file=" +
  65. Uri.encode(remotePath, "UTF-8") +
  66. "&x=" + px + "&y=" + px + "&a=1&mode=cover&forceIcon=1"
  67. )
  68. }
  69. fun getUrlForFilePreviewWithFileId(baseUrl: String, fileId: String, px: Int): String {
  70. return (
  71. baseUrl + "/index.php/core/preview?fileId=" +
  72. fileId + "&x=" + px + "&y=" + px + "&a=1&mode=cover&forceIcon=1"
  73. )
  74. }
  75. fun getSharingUrl(baseUrl: String): String {
  76. return "$baseUrl$OCS_API_VERSION/apps/files_sharing/api/v1/shares"
  77. }
  78. fun getRetrofitBucketForContactsSearchFor14(baseUrl: String, searchQuery: String?): RetrofitBucket {
  79. val retrofitBucket = getRetrofitBucketForContactsSearch(baseUrl, searchQuery)
  80. retrofitBucket.url = "$baseUrl$OCS_API_VERSION/core/autocomplete/get"
  81. retrofitBucket.queryMap?.put("itemId", "new")
  82. return retrofitBucket
  83. }
  84. @JvmStatic
  85. fun getUrlForCapabilities(baseUrl: String): String {
  86. return "$baseUrl$OCS_API_VERSION/cloud/capabilities"
  87. }
  88. @Throws(NoSupportedApiException::class)
  89. fun getCallApiVersion(capabilities: User, versions: IntArray): Int {
  90. return getConversationApiVersion(capabilities, versions)
  91. }
  92. @JvmStatic
  93. @Throws(NoSupportedApiException::class)
  94. @Suppress("ReturnCount")
  95. fun getConversationApiVersion(user: User, versions: IntArray): Int {
  96. var hasApiV4 = false
  97. for (version in versions) {
  98. hasApiV4 = hasApiV4 or (version == API_V4)
  99. }
  100. if (!hasApiV4) {
  101. val e = Exception("Api call did not try conversation-v4 api")
  102. Log.d(TAG, e.message, e)
  103. }
  104. for (version in versions) {
  105. if (user.hasSpreedFeatureCapability("conversation-v$version")) {
  106. return version
  107. }
  108. // Fallback for old API versions
  109. if (version == API_V1 || version == API_V2) {
  110. if (user.hasSpreedFeatureCapability("conversation-v2")) {
  111. return version
  112. }
  113. if (version == API_V1 &&
  114. user.hasSpreedFeatureCapability("mention-flag") &&
  115. !user.hasSpreedFeatureCapability("conversation-v4")
  116. ) {
  117. return version
  118. }
  119. }
  120. }
  121. throw NoSupportedApiException()
  122. }
  123. @JvmStatic
  124. @Throws(NoSupportedApiException::class)
  125. @Suppress("ReturnCount")
  126. fun getSignalingApiVersion(user: User, versions: IntArray): Int {
  127. val spreedCapabilities = user.capabilities!!.spreedCapability
  128. for (version in versions) {
  129. if (spreedCapabilities != null) {
  130. if (spreedCapabilities.features!!.contains("signaling-v$version")) {
  131. return version
  132. }
  133. if (version == API_V2 &&
  134. hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SIP_SUPPORT) &&
  135. !hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SIGNALING_V3)
  136. ) {
  137. return version
  138. }
  139. if (version == API_V1 &&
  140. !hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SIGNALING_V3)
  141. ) {
  142. // Has no capability, we just assume it is always there when there is no v3 or later
  143. return version
  144. }
  145. }
  146. }
  147. throw NoSupportedApiException()
  148. }
  149. @JvmStatic
  150. @Throws(NoSupportedApiException::class)
  151. fun getChatApiVersion(spreedCapabilities: SpreedCapability, versions: IntArray): Int {
  152. for (version in versions) {
  153. if (version == API_V1 && hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.CHAT_V2)) {
  154. // Do not question that chat-v2 capability shows the availability of api/v1/ endpoint *see no evil*
  155. return version
  156. }
  157. }
  158. throw NoSupportedApiException()
  159. }
  160. private fun getUrlForApi(version: Int, baseUrl: String?): String {
  161. return baseUrl + SPREED_API_BASE + version
  162. }
  163. fun getUrlForRooms(version: Int, baseUrl: String?): String {
  164. return getUrlForApi(version, baseUrl) + "/room"
  165. }
  166. @JvmStatic
  167. fun getUrlForRoom(version: Int, baseUrl: String?, token: String?): String {
  168. return getUrlForRooms(version, baseUrl) + "/" + token
  169. }
  170. fun getUrlForAttendees(version: Int, baseUrl: String?, token: String?): String {
  171. return getUrlForRoom(version, baseUrl, token) + "/attendees"
  172. }
  173. fun getUrlForParticipants(version: Int, baseUrl: String?, token: String?): String {
  174. if (token.isNullOrEmpty()) {
  175. Log.e(TAG, "token was null or empty")
  176. }
  177. return getUrlForRoom(version, baseUrl, token) + "/participants"
  178. }
  179. fun getUrlForParticipantsActive(version: Int, baseUrl: String?, token: String?): String {
  180. return getUrlForParticipants(version, baseUrl, token) + "/active"
  181. }
  182. @JvmStatic
  183. fun getUrlForParticipantsSelf(version: Int, baseUrl: String?, token: String?): String {
  184. return getUrlForParticipants(version, baseUrl, token) + "/self"
  185. }
  186. fun getUrlForParticipantsResendInvitations(version: Int, baseUrl: String?, token: String?): String {
  187. return getUrlForParticipants(version, baseUrl, token) + "/resend-invitations"
  188. }
  189. fun getUrlForRoomFavorite(version: Int, baseUrl: String?, token: String?): String {
  190. return getUrlForRoom(version, baseUrl, token) + "/favorite"
  191. }
  192. fun getUrlForRoomModerators(version: Int, baseUrl: String?, token: String?): String {
  193. return getUrlForRoom(version, baseUrl, token) + "/moderators"
  194. }
  195. @JvmStatic
  196. fun getUrlForRoomNotificationLevel(version: Int, baseUrl: String?, token: String?): String {
  197. return getUrlForRoom(version, baseUrl, token) + "/notify"
  198. }
  199. fun getUrlForRoomPublic(version: Int, baseUrl: String?, token: String?): String {
  200. return getUrlForRoom(version, baseUrl, token) + "/public"
  201. }
  202. fun getUrlForRoomPassword(version: Int, baseUrl: String?, token: String?): String {
  203. return getUrlForRoom(version, baseUrl, token) + "/password"
  204. }
  205. fun getUrlForRoomReadOnlyState(version: Int, baseUrl: String?, token: String?): String {
  206. return getUrlForRoom(version, baseUrl, token) + "/read-only"
  207. }
  208. fun getUrlForRoomWebinaryLobby(version: Int, baseUrl: String?, token: String?): String {
  209. return getUrlForRoom(version, baseUrl, token) + "/webinar/lobby"
  210. }
  211. @JvmStatic
  212. fun getUrlForRoomNotificationCalls(version: Int, baseUrl: String?, token: String?): String {
  213. return getUrlForRoom(version, baseUrl, token) + "/notify-calls"
  214. }
  215. fun getUrlForCall(version: Int, baseUrl: String?, token: String): String {
  216. return getUrlForApi(version, baseUrl) + "/call/" + token
  217. }
  218. fun getUrlForChat(version: Int, baseUrl: String?, token: String): String {
  219. return getUrlForApi(version, baseUrl) + "/chat/" + token
  220. }
  221. @JvmStatic
  222. fun getUrlForMentionSuggestions(version: Int, baseUrl: String?, token: String): String {
  223. return getUrlForChat(version, baseUrl, token) + "/mentions"
  224. }
  225. fun getUrlForChatMessage(version: Int, baseUrl: String?, token: String, messageId: String): String {
  226. return getUrlForChat(version, baseUrl, token) + "/" + messageId
  227. }
  228. fun getUrlForChatSharedItems(version: Int, baseUrl: String?, token: String): String {
  229. return getUrlForChat(version, baseUrl, token) + "/share"
  230. }
  231. fun getUrlForChatSharedItemsOverview(version: Int, baseUrl: String?, token: String): String {
  232. return getUrlForChatSharedItems(version, baseUrl, token) + "/overview"
  233. }
  234. fun getUrlForSignaling(version: Int, baseUrl: String?): String {
  235. return getUrlForApi(version, baseUrl) + "/signaling"
  236. }
  237. @JvmStatic
  238. fun getUrlForSignalingBackend(version: Int, baseUrl: String?): String {
  239. return getUrlForSignaling(version, baseUrl) + "/backend"
  240. }
  241. @JvmStatic
  242. fun getUrlForSignalingSettings(version: Int, baseUrl: String?): String {
  243. return getUrlForSignaling(version, baseUrl) + "/settings"
  244. }
  245. fun getUrlForSignaling(version: Int, baseUrl: String?, token: String): String {
  246. return getUrlForSignaling(version, baseUrl) + "/" + token
  247. }
  248. fun getUrlForOpenConversations(version: Int, baseUrl: String?): String {
  249. return getUrlForApi(version, baseUrl) + "/listed-room"
  250. }
  251. @Suppress("LongParameterList")
  252. fun getRetrofitBucketForCreateRoom(
  253. version: Int,
  254. baseUrl: String?,
  255. roomType: String,
  256. source: String?,
  257. invite: String?,
  258. conversationName: String?
  259. ): RetrofitBucket {
  260. val retrofitBucket = RetrofitBucket()
  261. retrofitBucket.url = getUrlForRooms(version, baseUrl)
  262. val queryMap: MutableMap<String, String> = HashMap()
  263. queryMap["roomType"] = roomType
  264. if (invite != null) {
  265. queryMap["invite"] = invite
  266. }
  267. if (source != null) {
  268. queryMap["source"] = source
  269. }
  270. if (conversationName != null) {
  271. queryMap["roomName"] = conversationName
  272. }
  273. retrofitBucket.queryMap = queryMap
  274. return retrofitBucket
  275. }
  276. @JvmStatic
  277. fun getRetrofitBucketForAddParticipant(
  278. version: Int,
  279. baseUrl: String?,
  280. token: String?,
  281. user: String
  282. ): RetrofitBucket {
  283. val retrofitBucket = RetrofitBucket()
  284. retrofitBucket.url = getUrlForParticipants(version, baseUrl, token)
  285. val queryMap: MutableMap<String, String> = HashMap()
  286. queryMap["newParticipant"] = user
  287. retrofitBucket.queryMap = queryMap
  288. return retrofitBucket
  289. }
  290. @JvmStatic
  291. fun getRetrofitBucketForAddParticipantWithSource(
  292. version: Int,
  293. baseUrl: String?,
  294. token: String?,
  295. source: String,
  296. id: String
  297. ): RetrofitBucket {
  298. val retrofitBucket = getRetrofitBucketForAddParticipant(version, baseUrl, token, id)
  299. retrofitBucket.queryMap?.put("source", source)
  300. return retrofitBucket
  301. }
  302. fun getUrlForUserProfile(baseUrl: String): String {
  303. return "$baseUrl$OCS_API_VERSION/cloud/user"
  304. }
  305. fun getUrlForUserData(baseUrl: String, userId: String): String {
  306. return "$baseUrl$OCS_API_VERSION/cloud/users/$userId"
  307. }
  308. fun getUrlForUserSettings(baseUrl: String): String {
  309. // FIXME Introduce API version
  310. return "$baseUrl$OCS_API_VERSION$SPREED_API_VERSION/settings/user"
  311. }
  312. fun getUrlPostfixForStatus(): String {
  313. return "/status.php"
  314. }
  315. @JvmStatic
  316. fun getUrlForAvatar(baseUrl: String?, name: String?, requestBigSize: Boolean): String {
  317. val avatarSize = if (requestBigSize) AVATAR_SIZE_BIG else AVATAR_SIZE_SMALL
  318. return baseUrl + "/index.php/avatar/" + Uri.encode(name) + "/" + avatarSize
  319. }
  320. @JvmStatic
  321. fun getUrlForFederatedAvatar(
  322. baseUrl: String,
  323. token: String,
  324. cloudId: String,
  325. darkTheme: Int,
  326. requestBigSize: Boolean
  327. ): String {
  328. val avatarSize = if (requestBigSize) AVATAR_SIZE_BIG else AVATAR_SIZE_SMALL
  329. val url = "$baseUrl$OCS_API_VERSION$SPREED_API_VERSION/proxy/$token/user-avatar/$avatarSize"
  330. return "$url?cloudId=$cloudId&darkTheme=$darkTheme"
  331. }
  332. @JvmStatic
  333. fun getUrlForGuestAvatar(baseUrl: String?, name: String?, requestBigSize: Boolean): String {
  334. val avatarSize = if (requestBigSize) AVATAR_SIZE_BIG else AVATAR_SIZE_SMALL
  335. return baseUrl + "/index.php/avatar/guest/" + Uri.encode(name) + "/" + avatarSize
  336. }
  337. fun getUrlForConversationAvatar(version: Int, baseUrl: String?, token: String?): String {
  338. return getUrlForRoom(version, baseUrl, token) + "/avatar"
  339. }
  340. fun getUrlForConversationAvatarWithVersion(
  341. version: Int,
  342. baseUrl: String?,
  343. token: String?,
  344. isDark: Boolean,
  345. avatarVersion: String?
  346. ): String {
  347. var isDarkString = ""
  348. if (isDark) {
  349. isDarkString = "/dark"
  350. }
  351. var avatarVersionString = ""
  352. if (avatarVersion != null) {
  353. avatarVersionString = "?avatarVersion=$avatarVersion"
  354. }
  355. return getUrlForRoom(version, baseUrl, token) + "/avatar" + isDarkString + avatarVersionString
  356. }
  357. @JvmStatic
  358. fun getCredentials(username: String?, token: String?): String? {
  359. return if (TextUtils.isEmpty(username) && TextUtils.isEmpty(token)) {
  360. null
  361. } else {
  362. basic(username!!, token!!, StandardCharsets.UTF_8)
  363. }
  364. }
  365. @JvmStatic
  366. fun getUrlNextcloudPush(baseUrl: String): String {
  367. return "$baseUrl$OCS_API_VERSION/apps/notifications/api/v2/push"
  368. }
  369. @JvmStatic
  370. fun getUrlPushProxy(): String {
  371. return sharedApplication!!.applicationContext.resources.getString(R.string.nc_push_server_url) + "/devices"
  372. }
  373. // see https://github.com/nextcloud/notifications/blob/master/docs/ocs-endpoint-v2.md
  374. fun getUrlForNcNotificationWithId(baseUrl: String, notificationId: String): String {
  375. return "$baseUrl$OCS_API_VERSION/apps/notifications/api/v2/notifications/$notificationId"
  376. }
  377. fun getUrlForSearchByNumber(baseUrl: String): String {
  378. return "$baseUrl$OCS_API_VERSION/cloud/users/search/by-phone"
  379. }
  380. fun getUrlForFileUpload(baseUrl: String, user: String, remotePath: String): String {
  381. return "$baseUrl/remote.php/dav/files/$user$remotePath"
  382. }
  383. fun getUrlForChunkedUpload(baseUrl: String, user: String): String {
  384. return "$baseUrl/remote.php/dav/uploads/$user"
  385. }
  386. fun getUrlForFileDownload(baseUrl: String, user: String, remotePath: String): String {
  387. return "$baseUrl/remote.php/dav/files/$user/$remotePath"
  388. }
  389. fun getUrlForTempAvatar(baseUrl: String): String {
  390. return "$baseUrl$OCS_API_VERSION/apps/spreed/temp-user-avatar"
  391. }
  392. fun getUrlForUserFields(baseUrl: String): String {
  393. return "$baseUrl$OCS_API_VERSION/cloud/user/fields"
  394. }
  395. fun getUrlToSendLocation(version: Int, baseUrl: String?, roomToken: String): String {
  396. return getUrlForChat(version, baseUrl, roomToken) + "/share"
  397. }
  398. fun getUrlForHoverCard(baseUrl: String, userId: String): String {
  399. return baseUrl + OCS_API_VERSION +
  400. "/hovercard/v1/" + userId
  401. }
  402. fun getUrlForChatReadMarker(version: Int, baseUrl: String?, roomToken: String): String {
  403. return getUrlForChat(version, baseUrl, roomToken) + "/read"
  404. }
  405. /*
  406. * OCS Status API
  407. */
  408. @JvmStatic
  409. fun getUrlForStatus(baseUrl: String): String {
  410. return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status"
  411. }
  412. fun getUrlForSetStatusType(baseUrl: String): String {
  413. return getUrlForStatus(baseUrl) + "/status"
  414. }
  415. fun getUrlForPredefinedStatuses(baseUrl: String): String {
  416. return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/predefined_statuses"
  417. }
  418. fun getUrlForStatusMessage(baseUrl: String): String {
  419. return getUrlForStatus(baseUrl) + "/message"
  420. }
  421. fun getUrlForSetCustomStatus(baseUrl: String): String {
  422. return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/message/custom"
  423. }
  424. fun getUrlForSetPredefinedStatus(baseUrl: String): String {
  425. return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/message/predefined"
  426. }
  427. fun getUrlForUserStatuses(baseUrl: String): String {
  428. return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/statuses"
  429. }
  430. fun getUrlForMessageReaction(baseUrl: String, roomToken: String, messageId: String): String {
  431. return "$baseUrl$OCS_API_VERSION$SPREED_API_VERSION/reaction/$roomToken/$messageId"
  432. }
  433. fun getUrlForUnifiedSearch(baseUrl: String, providerId: String): String {
  434. return "$baseUrl$OCS_API_VERSION/search/providers/$providerId/search"
  435. }
  436. fun getUrlForPoll(baseUrl: String, roomToken: String, pollId: String): String {
  437. return getUrlForPoll(baseUrl, roomToken) + "/" + pollId
  438. }
  439. fun getUrlForPoll(baseUrl: String, roomToken: String): String {
  440. return "$baseUrl$OCS_API_VERSION$SPREED_API_VERSION/poll/$roomToken"
  441. }
  442. @JvmStatic
  443. fun getUrlForMessageExpiration(version: Int, baseUrl: String?, token: String?): String {
  444. return getUrlForRoom(version, baseUrl, token) + "/message-expiration"
  445. }
  446. fun getUrlForOpenGraph(baseUrl: String): String {
  447. return "$baseUrl$OCS_API_VERSION/references/resolve"
  448. }
  449. fun getUrlForRecording(version: Int, baseUrl: String?, token: String): String {
  450. return getUrlForApi(version, baseUrl) + "/recording/" + token
  451. }
  452. fun getUrlForRequestAssistance(version: Int, baseUrl: String?, token: String): String {
  453. return getUrlForApi(version, baseUrl) + "/breakout-rooms/" + token + "/request-assistance"
  454. }
  455. fun getUrlForConversationDescription(version: Int, baseUrl: String?, token: String?): String {
  456. return getUrlForRoom(version, baseUrl, token) + "/description"
  457. }
  458. fun getUrlForTranslation(baseUrl: String): String {
  459. return "$baseUrl$OCS_API_VERSION/translation/translate"
  460. }
  461. fun getUrlForLanguages(baseUrl: String): String {
  462. return "$baseUrl$OCS_API_VERSION/translation/languages"
  463. }
  464. fun getUrlForReminder(user: User, roomToken: String, messageId: String, version: Int): String {
  465. val url = getUrlForChatMessage(version, user.baseUrl!!, roomToken, messageId)
  466. return "$url/reminder"
  467. }
  468. fun getUrlForRecordingConsent(version: Int, baseUrl: String?, token: String?): String {
  469. return getUrlForRoom(version, baseUrl, token) + "/recording-consent"
  470. }
  471. fun getUrlForInvitation(baseUrl: String): String {
  472. return baseUrl + OCS_API_VERSION + SPREED_API_VERSION + "/federation/invitation"
  473. }
  474. fun getUrlForInvitationAccept(baseUrl: String, id: Int): String {
  475. return getUrlForInvitation(baseUrl) + "/" + id
  476. }
  477. fun getUrlForInvitationReject(baseUrl: String, id: Int): String {
  478. return getUrlForInvitation(baseUrl) + "/" + id
  479. }
  480. @JvmStatic
  481. fun getUrlForRoomCapabilities(version: Int, baseUrl: String?, token: String?): String {
  482. return getUrlForRooms(version, baseUrl) + "/" + token + "/capabilities"
  483. }
  484. fun getUrlForBans(baseUrl: String, token: String): String {
  485. return "$baseUrl/ocs/v1.php$SPREED_API_VERSION/ban/$token"
  486. }
  487. fun getUrlForUnban(baseUrl: String, token: String, banId: Int): String {
  488. return "${getUrlForBans(baseUrl, token)}/$banId"
  489. }
  490. }