   class TracAttribute < ActiveRecord::Base
        set_table_name :session_attribute
   end

  def self.find_or_create_user(username, project_member = false)
        return User.anonymous if username.blank?
        
        u = User.find_by_login(username)
        if !u
          # Create a new user if not found
          TracAttribute.find_by_sql("SELECT value FROM #{TracAttribute.table_name} WHERE sid='#{username}' AND name='email'").each do |attrib|
              @mail = attrib.value
          end
          TracAttribute.find_by_sql("SELECT value FROM #{TracAttribute.table_name} WHERE sid='#{username}' AND name='name'").each do |attrib|
              @fn = $1 if attrib.value =~ (/(\w+)/)
              @ln = $1 if attrib.value =~ (/(\s+\w+)/)
          end
          @ln2 = @ln.gsub(/^\s+/, "")
          u = User.new :firstname => @fn,
                       :lastname => @ln2,
                       :mail => @mail
          u.login = username[0,limit_for(User, 'login')].gsub(/[^a-z0-9_\-@\.]/i, '-')
          u.password = 'trac'
          u.admin = true if TracPermission.find_by_username_and_action(username, 'admin')
          @fn = ''
          @ln = ''
          @ln2 = ''
          @mail = ''
          # finally, a default user is used if the new user is not valid
          u = User.find(:first) unless u.save
        end
        # Make sure he is a member of the project
        if project_member && !u.member_of?(@target_project)
          role = DEFAULT_ROLE
          if u.admin
            role = ROLE_MAPPING['admin']
          elsif TracPermission.find_by_username_and_action(username, 'developer')
            role = ROLE_MAPPING['developer']
          end
          Member.create(:user => u, :project => @target_project, :role => role)
          u.reload
        end
        u
      end
