Fix account lookup for nicknames beginning with numbers
authorcascode <cascode@amplifie.red>
Tue, 2 Apr 2019 10:51:33 +0000 (10:51 +0000)
committerlambda <lain@soykaf.club>
Tue, 2 Apr 2019 10:51:33 +0000 (10:51 +0000)
lib/pleroma/flake_id.ex
test/user_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs

index 4259d57189bec86d537a345c1b9d3036a86cbd07..58ab3650dc952de4465c30a77cbcf78f06b11e66 100644 (file)
@@ -46,7 +46,7 @@ defmodule Pleroma.FlakeId do
 
   def from_string(string) when is_binary(string) and byte_size(string) < 18 do
     case Integer.parse(string) do
-      {id, _} -> <<0::integer-size(64), id::integer-size(64)>>
+      {id, ""} -> <<0::integer-size(64), id::integer-size(64)>>
       _ -> nil
     end
   end
index 8cf2ba6ab1d5251c6b71ccb783853e9d7f43564d..e31b88b28e19d55e4725d7f549410ec90969d2c2 100644 (file)
@@ -200,6 +200,13 @@ defmodule Pleroma.UserTest do
     refute User.following?(followed, user)
   end
 
+  test "fetches correct profile for nickname beginning with number" do
+    # Use old-style integer ID to try to reproduce the problem
+    user = insert(:user, %{id: 1080})
+    userwithnumbers = insert(:user, %{nickname: "#{user.id}garbage"})
+    assert userwithnumbers == User.get_cached_by_nickname_or_id(userwithnumbers.nickname)
+  end
+
   describe "user registration" do
     @full_user_data %{
       bio: "A guy",
index d9bcbf5a9e43a3f996e036f5e110ac7eb3003786..01a47055811a2776ff33e6fb3d872589089cf9dc 100644 (file)
@@ -2265,4 +2265,30 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       assert link_header =~ ~r/max_id=#{notification1.id}/
     end
   end
+
+  test "accounts fetches correct account for nicknames beginning with numbers", %{conn: conn} do
+    # Need to set an old-style integer ID to reproduce the problem
+    # (these are no longer assigned to new accounts but were preserved
+    # for existing accounts during the migration to flakeIDs)
+    user_one = insert(:user, %{id: 1212})
+    user_two = insert(:user, %{nickname: "#{user_one.id}garbage"})
+
+    resp_one =
+      conn
+      |> get("/api/v1/accounts/#{user_one.id}")
+
+    resp_two =
+      conn
+      |> get("/api/v1/accounts/#{user_two.nickname}")
+
+    resp_three =
+      conn
+      |> get("/api/v1/accounts/#{user_two.id}")
+
+    acc_one = json_response(resp_one, 200)
+    acc_two = json_response(resp_two, 200)
+    acc_three = json_response(resp_three, 200)
+    refute acc_one == acc_two
+    assert acc_two == acc_three
+  end
 end