プロジェクト

全般

プロフィール

Bug(バグ) #1793

完了

【不具合報告】フレンドの数が減らない?増える?

pnetan   さんが約14年前に追加. 13年以上前に更新.

ステータス:
Invalid(無効)
優先度:
Normal(通常)
担当者:
対象バージョン:
-
開始日:
2010-11-17
期日:
進捗率:

0%

予定工数:
3.6 で発生するか:
3.8 で発生するか:

説明

http://sns.openpne.jp/diary/25574 より転記

OpenPNE3.4.7
Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。
また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。
ちなみにフレンドリストの表示は正しいようだ。

関連するチケット 1 (0件未完了1件完了)

関連している OpenPNE 3 - Backport(バックポート) #2309: 【不具合報告】フレンドの数が減らない?増える?Invalid(無効)Shingo Yamada2011-07-27

操作

Kousuke Ebihara さんがほぼ14年前に更新

  • 3.6 で発生するかYes にセット

isao sano さんがほぼ14年前に更新

以下の環境では再現せず。

  • 環境
    Windows XP
    Firefox 3.6.13/IE8
  • バージョン
    3.7.0-dev
    3.6beta8-dev
    3.4.10-dev
    3.0.9-dev

Mutsumi Imamura さんが13年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更
  • 対象バージョンOpenPNE 3.7.0 にセット

Minoru Takai さんが13年以上前に更新

  • 担当者Minoru Takai にセット
  • 対象バージョン を削除 (OpenPNE 3.7.0)

検証します。

Minoru Takai さんが13年以上前に更新

  • ステータスNew(新規) から Invalid(無効) に変更
  • 優先度High(高め) から Normal(通常) に変更
  • 3.6 で発生するか を削除 (Yes)

OpenPNE3.4.7
Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。
また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。
ちなみにフレンドリストの表示は正しいようだ。

との報告を元に、新規インストールした OpenPNE-3.4.7 を検証しました。

結論

報告の問題は再現できず、OpenPNE側の不具合に因る同様の問題が起こりうることも推測できなかった(例えば、2系からのアップグレードを行った3系などで起こりうるか等)。仮に報告のような問題が起こるとしても再現条件等の情報が足りないためこれ以上の検証ができないように思われる。

この検証結果を以て「再現せず」としてクローズします。もしこの問題(あるいはこれに類する問題)が発覚した場合は別チケットで扱うか、このチケットを再オープンしてください。

検証

まず、インストールした OpenPNE-3.4.7 にメンバーAでログインし、ブラウザから以下の一般的な操作を行った。

  • フレンドを何人か作ったが、表示されるメンバーAのフレンド数は想定通りだった。
  • そのフレンドでログインし退会したり、フレンドを強制退会させても、メンバーAのフレンド数は想定通りだった。
  • メンバーAから招待状を送ったが、フレンド数の表示には影響しなかった。招待中メールアドレス一覧から招待したアドレスを削除してもフレンド数に影響はなかった。

次に、実装を確認した。

  1. apps/pc_frontend/modules/friend/templates/_friendListBox.php
    4-  'list' => $friends,
    5-  'link_to' => 'member/profile?id=',
    6:  'moreInfo' => array(link_to(sprintf('%s(%d)', __('Show all'), $member->countFriends()), 'friend/list?id='.$member->getId())),
    7-  'type' => $sf_data->getRaw('gadget')->getConfig('type'),
    8-  'row' => $row,
    
  2. lib/model/doctrine/Member.class.php
    81:  public function countFriends()
    82-  {
    83-    return count(Doctrine::getTable('MemberRelationship')->getFriendMemberIds($this->getId()));
    84-  }
    
  3. lib/model/doctrine/MemberRelationshipTable.class.php
    47:  public function getFriendMemberIds($memberId)
    48-  {
    49-    $result = array();
    50-
    51-    $friendMemberIds = $this->createQuery()
    52-      ->select('member_id_to')
    53-      ->where('member_id_from = ?', $memberId)
    54-      ->andWhere('is_friend = ?', true)
    55-      ->execute(array(), Doctrine::HYDRATE_ARRAY);
    56-
    57-    $inactiveMemberIds = Doctrine::getTable('Member')->getInactiveMemberIds();
    58-
    59-    foreach ($friendMemberIds as $friend)
    60-    {
    61-      if (!in_array($friend['member_id_to'], $inactiveMemberIds))
    62-      {
    63-        $result[] = $friend['member_id_to'];
    64-      }
    65-    }
    66-
    67-    return $result;
    68-  }
    
  4. lib/model/doctrine/MemberTable.class.php
    50:  public function getInactiveMemberIds()
    51-  {
    52-    $e = opActivateBehavior::getEnabled();
    53-    opActivateBehavior::disable();
    54-
    55-    $members = $this->createQuery()
    56-      ->select('id')
    57-      ->andWhere('is_active = ?', false)
    58-      ->execute(array(), Doctrine::HYDRATE_ARRAY);
    59-
    60-    if ($e)
    61-    {
    62-      opActivateBehavior::enable();
    63-    }
    64-
    65-    $memberIds = array();
    66-    foreach ($members as $member)
    67-    {
    68-      $memberIds[] = $member['id'];
    69-    }
    70-
    71-    return $memberIds;
    72-  }
    
  5. plugins/opAuthMailAddressPlugin/lib/user/opAuthAdapterMailAddress.class.php
    18-class opAuthAdapterMailAddress extends opAuthAdapter
    19-{
    20-  protected $authModuleName = 'opAuthMailAddress';
    21-
    22- /**
    23-  * @see opAuthAdapter::activate()
    24-  */
    25:  public function activate()
    26-  {
    27-    parent::activate();
    28-
    29-    $member = sfContext::getInstance()->getUser()->getMember();
    30-    if ($member)
    31-    {
    32-      if ($token = Doctrine::getTable('MemberConfig')->retrieveByNameAndMemberId('mobile_address_token', $member->getId()))
    33-      {
    34-        $token->delete();
    35-      }
    36-
    37-      if ($token = Doctrine::getTable('MemberConfig')->retrieveByNameAndMemberId('pc_address_token', $member->getId()))
    38-      {
    39-        $token->delete();
    40-      }
    41-    }
    42-
    43-    return $member;
    44-  }
    
  6. lib/user/opAuthAdapter.class.php
    296- /**
    297-  * Activates the member
    298-  */
    299:  public function activate()
    300-  {
    301-    opActivateBehavior::disable();
    302-    $member = sfContext::getInstance()->getUser()->getMember();
    303-    $member->setIsActive(true);
    304-    $result = $member->save();
    305-    opActivateBehavior::enable();
    306-    return $result;
    307-  }
    
  • マイホームで表示されるフレンドリストのフレンド数部分は $member->countFriends() メソッドの結果である。
  • Member::countFriends() メソッドは内部で MemberRelationshipTable::getFriendMemberIds() をコールして、その結果を count() 関数にかけている。
  • MemberRelationshipTable::getFriendMemberIds() では、フレンド関係のメンバーの一覧から isActive が false のメンバーを除いたメンバーリストを返している
    • OpenPNE の opAuthMailAddressPlugin の仕様では、メンバーAがメンバーX(登録前なのでメンバーXというのも変だが)の招待を行った場合、 MemberRelationship テーブルにはお互いがフレンドであるようなレコードが作成され、 Member テーブルには isActive カラム値が false(=0) のレコード(メンバーXのもの)が作成される。

考察

Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。

この問題が生じる不具合は見当たらない。しかしながら、このような表示が行なわれる可能性として、ブラウザのキャッシュや、ファンクションキャッシュ(PHPアクセラレータを使用している場合など)がある場合に、キャッシュが使われていたことが考えられる。

また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。

現状のソースコードを見る限りは、メンバー登録が完了しない限りは、そのメンバー(招待を受けた仮メンバー)の isActive 値は false であり、 MemberRelationshipTable::getFriendMemberIds() でのメンバーリストに招待中のメンバーは含まれないはずである。

また、仮に招待中のメンバーの isActive 値が true であればフレンド数に影響があるが、その状況は新規登録が完了しているものと同じであり招待中とは見做されなくなるため「フレンド招待中のメールアドレスを削除」することはできない。

「フレンド招待中のメールアドレスを削除したらフレンドの数が『増える』」というのは(仮に異常なレコードが存在していたとしても)実装上起こり得ないように思う。

他の形式にエクスポート: Atom PDF