• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / tigerdata-app / 9f0ef405-c062-4212-afeb-021da595930c

10 Sep 2025 04:41PM UTC coverage: 88.549% (-0.4%) from 88.921%
9f0ef405-c062-4212-afeb-021da595930c

Pull #1825

circleci

hectorcorrea
Updated test to look for new values
Pull Request #1825: Display user's roles in mediaflux in the mediaflux info page

15 of 23 new or added lines in 3 files covered. (65.22%)

1 existing line in 1 file now uncovered.

2490 of 2812 relevant lines covered (88.55%)

325.99 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

73.63
/app/models/user.rb
1
# frozen_string_literal: true
2

3
require "csv"
1✔
4
class User < ApplicationRecord
1✔
5
  # Include default devise modules. Others available are:
6
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
7
  devise :rememberable, :omniauthable
1✔
8

9
  has_many :user_requests, dependent: :destroy
1✔
10

11
  paginates_per 100
1✔
12

13
  USER_REGISTRATION_LIST = Rails.root.join("data", "user_registration_list_#{Rails.env}.csv")
1✔
14

15
  attr_accessor :mediaflux_session
1✔
16

17
  def self.from_cas(access_token)
1✔
18
    user = User.find_by(provider: access_token.provider, uid: access_token.uid)
9✔
19
    if user.present? && user.given_name.nil? # fix any users that do not have the name information loaded
9✔
20
      user.initialize_name_values(access_token.extra)
7✔
21
      user.save
7✔
22
    end
23
    user
9✔
24
  end
25

26
  # Users that can be project sponsors
27
  def self.sponsor_users
1✔
28
    if Rails.env.development? || Rails.env.staging?
2✔
29
      User.where(eligible_sponsor: true).or(User.where(developer: true))
1✔
30
    else
31
      User.where(eligible_sponsor: true)
1✔
32
    end
33
  end
34

35
  # Users that can be data managers
36
  def self.manager_users
1✔
37
    if Rails.env.development? || Rails.env.staging?
×
38
      User.where(eligible_manager: true).or(User.where(developer: true))
×
39
    else
40
      User.where(eligible_manager: true)
×
41
    end
42
  end
43

44
  def clear_mediaflux_session(session)
1✔
45
    Rails.logger.debug("!!!!!!! Clearing Mediaflux session !!!!!!!!")
3✔
46
    @mediaflux_session = nil
3✔
47
    session[:mediaflux_session] = nil
3✔
48
  end
49

50
  def mediaflux_from_session(session)
1✔
51
    logger.debug "Session Get #{session[:mediaflux_session]} cas: #{session[:active_web_user]}  user: #{uid}"
397✔
52
    if session[:mediaflux_session].blank?
397✔
53
      logger.debug("!!!! Creating a new session !!! #{uid}")
181✔
54
      session[:mediaflux_session] = SystemUser.mediaflux_session
181✔
55
      session[:active_web_user] = false
179✔
56
    end
57
    @active_web_user = session[:active_web_user]
395✔
58
    @mediaflux_session = session[:mediaflux_session]
395✔
59
  end
60

61
  def mediaflux_login(token, session)
1✔
62
    logger.debug("mediaflux session created for #{uid}")
×
63
    logon_request = Mediaflux::LogonRequest.new(identity_token: token, token_type: "cas")
×
64
    if logon_request.error?
×
65
      raise "Invalid Logon #{logon_request.response_error}"
×
66
    end
67
    @mediaflux_session = logon_request.session_token
×
68
    @active_web_user = true
×
69
    session[:mediaflux_session] = @mediaflux_session
×
70
    session[:active_web_user] = @active_web_user
×
71
    logger.debug "Login Session #{session[:mediaflux_session]} cas: #{session[:active_web_user]}  user: #{uid}"
×
NEW
72
    check_if_current_user_is_developer(session_token: @mediaflux_session)
×
73
  end
74

75
  def terminate_mediaflux_session
1✔
76
    return if @mediaflux_session.nil? # nothing to terminate
×
77
    logger.debug "!!!! Terminating mediaflux session"
×
78

79
    Mediaflux::LogoutRequest.new(session_token: @mediaflux_session).response_body
×
80
    @mediaflux_session = nil
×
81
  end
82

83
  # Initialize the name values from the CAS information.
84
  # Our name fields do not match their name fields, so we need to translate.
85
  def initialize_name_values(extra_cas_info)
1✔
86
    self.given_name = extra_cas_info.givenname
7✔
87
    self.family_name =  extra_cas_info.sn
7✔
88
    self.display_name = extra_cas_info.pudisplayname
7✔
89
  end
90

91
  # Return the display name if it exists, otherwise return the uid
92
  # @return [String]
93
  def display_name_safe
1✔
94
    return uid if display_name.blank?
119✔
95

96
    display_name
117✔
97
  end
98

99
  # Is this user eligible to be a data sponsor in this environment?
100
  # @return [Boolean]
101
  def eligible_sponsor?
1✔
102
    return true if developer
62✔
103
    super
61✔
104
  end
105

106
  # Is this user eligible to be a data manger in this environment?
107
  # @return [Boolean]
108
  def eligible_manager?
1✔
109
    return true if developer
22✔
110
    super
21✔
111
  end
112

113
  def developer?
1✔
114
    return true if developer
10✔
115
    super
9✔
116
  end
117

118
  # Is this user eligible to be a data user in this environment?
119
  # @return [Boolean]
120
  def eligible_data_user?
1✔
121
    return true if developer
25✔
122
    return true if !eligible_sponsor? && !eligible_manager
25✔
123
  end
124

125
  # Is this user eligible to be a sysadmin in this environment?
126
  # @return [Boolean]
127
  def eligible_sysadmin?
1✔
128
    return true if developer || sysadmin
463✔
129
  end
130

131
  def eligible_to_create_new?
1✔
132
    return true if eligible_sysadmin?
6✔
133

134
    !Rails.env.production? && (eligible_sponsor? && trainer?)
4✔
135
  end
136

137
  # Methods serialize_into_session() and serialize_from_session() are called by Warden/Devise
138
  # to calculate what information will be stored in the session and to serialize an object
139
  # back from the session.
140
  #
141
  # By default Warden/Devise store the database ID of the record (e.g. User.id) but this causes
142
  # problems if we repopulate our User table and the IDs change. The implementation provided below
143
  # uses the User.uid field (which is unique, does not change, and it's required) as the value to
144
  # store in the session to prevent this issue.
145
  #
146
  # References:
147
  #   https://stackoverflow.com/questions/23597718/what-is-the-warden-data-in-a-rails-devise-session-composed-of/23683925#23683925
148
  #   https://web.archive.org/web/20211028103224/https://tadas-s.github.io/ruby-on-rails/2020/08/02/devise-serialize-into-session-trick/
149
  #   https://github.com/wardencommunity/warden/wiki/Setup
150
  def self.serialize_into_session(record)
1✔
151
    # The return value _must_ have at least two elements since the serialize_from_session() requires
152
    # two arguments (see below)
153
    [record.uid, ""]
192✔
154
  end
155

156
  def self.serialize_from_session(key, _salt, _opts = {})
1✔
157
    User.where(uid: key)&.first
225✔
158
  end
159

160
  # Fetches the most recent download jobs for the user
161
  def latest_downloads(limit: 10)
1✔
162
    @latest_downloads ||= UserRequest.where(user_id: id).where(["completion_time > ?", 7.days.ago]).order(created_at: "DESC").limit(limit)
62✔
163
  end
164

165
  def check_if_current_user_is_developer(session_token:)
1✔
NEW
166
    roles = current_user_mediaflux_roles(session_token:)
×
167
    # TODO: Figure out why the role name is different in staging from production:
168
    #   production:   "pu-smb-group:PU:tigerdata:librarydevelopers"
169
    #   staging:      "pu-oit-group:PU:tigerdata:librarydevelopers"
170
    #   development:  "pu-lib:developer"
NEW
171
    developer_now = roles.include?("pu-smb-group:PU:tigerdata:librarydevelopers") ||
×
172
      roles.include?("pu-oit-group:PU:tigerdata:librarydevelopers") ||
173
      roles.include?("pu-lib:developer")
NEW
174
    if developer != developer_now
×
175
      # Only update the record in the database if there is a change
NEW
176
      Rails.logger.info("Updating developer role for user #{self.id} to #{developer_now}")
×
NEW
177
      self.developer = developer_now
×
NEW
178
      save!
×
179
    end
180
  rescue => ex
NEW
181
    Rails.logger.error("Error determining if user is a developer (id: #{self.id}), error: #{ex.message}")
×
182
  end
183

184
  # Returns the roles in Mediaflux for the user in the session.
185
  # This is meant to be used only for the current_user, hence the name.
186
  def current_user_mediaflux_roles(session_token:)
1✔
187
    request = Mediaflux::ActorSelfDescribeRequest.new(session_token:)
61✔
188
    request.resolve
61✔
189
    request.roles
61✔
190
  end
191
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc