{"record":{"id":"2799c9095ca7d122","repo":"ruby/ruby","slug":"trust-directory-dir-is-not-a-directory","errorCode":null,"errorMessage":"trust directory #{@dir} is not a directory","messagePattern":"trust directory #(.+?) is not a directory","errorType":"exception","errorClass":"Gem::Security::Exception","httpStatus":null,"severity":"error","filePath":"lib/rubygems/security/trust_dir.rb","lineNumber":108,"sourceCode":"    verify\n\n    destination = cert_path certificate\n\n    File.open destination, \"wb\", 0o600 do |io|\n      io.write certificate.to_pem\n      io.chmod(@permissions[:trusted_cert])\n    end\n  end\n\n  ##\n  # Make sure the trust directory exists.  If it does exist, make sure it's\n  # actually a directory.  If not, then create it with the appropriate\n  # permissions.\n\n  def verify\n    require \"fileutils\"\n    if File.exist? @dir\n      raise Gem::Security::Exception,\n        \"trust directory #{@dir} is not a directory\" unless\n          File.directory? @dir\n\n      FileUtils.chmod 0o700, @dir\n    else\n      FileUtils.mkdir_p @dir, mode: @permissions[:trust_dir]\n    end\n  end\nend\n","sourceCodeStart":90,"sourceCodeEnd":118,"githubUrl":"https://github.com/ruby/ruby/blob/0e5b888e1c355f3f728f2659f085820937dada48/lib/rubygems/security/trust_dir.rb#L90-L118","documentation":"Gem::Security::TrustDir#verify ensures the directory where trusted certificates live (~/.gem/trust by default) exists and is a directory with 0700 permissions. The error fires when the path exists but is a regular file (or symlink to one), so certificates cannot be stored under it. Any trust operation (gem cert --add/--list, installing with a -P policy) hits this.","triggerScenarios":"gem cert --add cert.pem or gem install -P HighSecurity when ~/.gem/trust exists as a file; a misrestored backup, editor artifact, or provisioning script that created a file named 'trust' inside ~/.gem.","commonSituations":"Dotfile-management or container images that materialize ~/.gem contents as files; HOME pointed at an odd location where 'trust' collides with something else; leftover artifacts from interrupted setups.","solutions":["Remove or rename the offending file so RubyGems can create the directory: mv ~/.gem/trust ~/.gem/trust.bak, then rerun the command","If the path is managed elsewhere, point the trust dir at a clean location via the :trust_dir opt used to construct Gem::Security::TrustDir","Check for a provisioning script creating ~/.gem/trust and fix it to mkdir -p -m 700 instead"],"exampleFix":"# before\n$ ls -la ~/.gem/trust\n-rw-r--r-- 1 user user 0 trust   # a file, not a directory\n$ gem cert --list\n#=> trust directory /home/user/.gem/trust is not a directory\n\n# after\n$ mv ~/.gem/trust ~/.gem/trust.bak\n$ gem cert --list   # RubyGems recreates the dir with 0700","handlingStrategy":"validation","validationCode":"dir = Gem::Security.trust_dir.cert_directory rescue Gem::Security.trust_dir.dir # path RubyGems will use\nif File.exist?(dir) && !File.directory?(dir)\n  raise \"#{dir} exists as a file — move it aside so RubyGems can create the trust directory\"\nend","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Let RubyGems own ~/.gem/trust: never create files at that path in provisioning scripts","In Dockerfiles/dotfile managers, mkdir -p -m 700 ~/.gem/trust rather than touching it as a file","After restores or migrations, run gem cert --list once to verify the trust dir is healthy"],"tags":["rubygems","filesystem","trust-dir","certificates","environment"],"backgroundTag":"filesystem-path-conflict","analyzedSha":"0e5b888e1c355f3f728f2659f085820937dada48","analyzedAt":"2026-08-21T14:25:43.473Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}