server: Delete links

feature/sync2
Alinson S. Xavier 4 years ago
parent 2ea6fe0570
commit 232b25bed4
No known key found for this signature in database
GPG Key ID: DCA0DAD4D2F58624

@ -1,36 +0,0 @@
/*
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.sync.links
import org.isoron.uhabits.sync.defaultMapper
/**
* A Link maps a public URL (such as https://sync.loophabits.org/links/B752A6)
* to a synchronization key. They are used to transfer sync keys between devices
* without ever exposing the original sync key. Unlike sync keys, links expire
* after a few minutes.
*/
data class Link(
val id: String,
val syncKey: String,
val createdAt: Long,
)
fun Link.toJson(): String = defaultMapper.writeValueAsString(this)

@ -1,49 +0,0 @@
/*
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.sync.links
import org.isoron.uhabits.sync.KeyNotFoundException
import org.isoron.uhabits.sync.utils.randomString
class LinkManager(
private val timeoutInMillis: Long = 900_000,
) {
private val links = HashMap<String, Link>()
fun register(syncKey: String): Link {
val link = Link(
id = randomString(64),
syncKey = syncKey,
createdAt = System.currentTimeMillis(),
)
links[link.id] = link
return link
}
fun get(id: String): Link {
val link = links[id] ?: throw KeyNotFoundException()
val ageInMillis = System.currentTimeMillis() - link.createdAt
if (ageInMillis > timeoutInMillis) {
links.remove(id)
throw KeyNotFoundException()
}
return link
}
}

@ -23,7 +23,6 @@ import org.isoron.uhabits.sync.EditConflictException
import org.isoron.uhabits.sync.KeyNotFoundException
import org.isoron.uhabits.sync.ServiceUnavailable
import org.isoron.uhabits.sync.SyncData
import org.isoron.uhabits.sync.links.Link
interface AbstractSyncServer {
/**
@ -63,22 +62,4 @@ interface AbstractSyncServer {
* to insufficient server resources or network problems.
*/
suspend fun getDataVersion(key: String): Long
/**
* Registers a new temporary link (mapping to the given sync key) and returns it.
*
* @throws ServiceUnavailable If the link cannot be generated at this time due to
* insufficient server resources.
*/
suspend fun registerLink(syncKey: String): Link
/**
* Retrieves the syncKey associated with the given link id.
*
* @throws ServiceUnavailable If the link cannot be resolved at this time due to
* insufficient server resources.
* @throws KeyNotFoundException If the link id cannot be found, or if it has
* expired.
*/
suspend fun getLink(id: String): Link
}

@ -23,8 +23,6 @@ import io.prometheus.client.Counter
import org.isoron.uhabits.sync.EditConflictException
import org.isoron.uhabits.sync.KeyNotFoundException
import org.isoron.uhabits.sync.SyncData
import org.isoron.uhabits.sync.links.Link
import org.isoron.uhabits.sync.links.LinkManager
import org.isoron.uhabits.sync.repository.Repository
import org.isoron.uhabits.sync.utils.randomString
@ -33,7 +31,6 @@ import org.isoron.uhabits.sync.utils.randomString
*/
class RepositorySyncServer(
private val repo: Repository,
private val linkManager: LinkManager = LinkManager(),
) : AbstractSyncServer {
private val requestsCounter: Counter = Counter.build()
@ -77,16 +74,6 @@ class RepositorySyncServer(
return repo.get(key).version
}
override suspend fun registerLink(syncKey: String): Link {
requestsCounter.labels("registerLink").inc()
return linkManager.register(syncKey)
}
override suspend fun getLink(id: String): Link {
requestsCounter.labels("getLink").inc()
return linkManager.get(id)
}
private suspend fun generateKey(): String {
while (true) {
val key = randomString(64)

Loading…
Cancel
Save