www/secretary/ldap-check-banned.cgi (100 lines of code) (raw):

#!/usr/bin/env ruby =begin Check state of asf-banned accounts. An account that is asf-banned due to deceased/opted out should have: - asf-banned = yes - loginShell = /usr/bin/false - neither of the following attributes exist: host sshPublicKey =end $LOAD_PATH.unshift '/srv/whimsy/lib' require 'whimsy/asf' require 'whimsy/asf/mlist' require 'wunderbar' EXPECTED_SHELL='/usr/bin/false' NOSHELL = %w{/usr/bin/false /bin/false /home/striker/bin/no-cla /usr/sbin/nologin /bin/nologin /sbin/nologin} CHECKS = { 'asf-banned' => 'yes', 'loginShell' => EXPECTED_SHELL, 'host' => nil, 'sshPublicKey' => nil, } def singleton(attr) return attr.first if attr&.size == 1 attr end # banned or false? ATTRS=%w{uid cn asf-banned loginShell host sshPublicKey modifiersName modifyTimestamp createTimestamp} if ENV['QUERY_STRING'].include? 'checkShell' CHECKSHELL = true logins=NOSHELL.map{|k| "(loginshell=#{k})"}.join('') FILTER = "(|(asf-banned=*)#{logins})" else FILTER = '(asf-banned=*)' CHECKSHELL = false end _html do _style %{ .error {background-color: yellow} table, th, td {border: 1px solid black} td {padding: 3px 6px} tr:hover td {background-color: azure} th {background-color: #a0ddf0} } _h1 'LDAP banned checks' _p %{ This script compares the LDAP settings for asf-banned, loginShell and host. If asf-banned is set, it is expected to equal 'yes', and loginShell should be #{EXPECTED_SHELL}. Also host and sshPublicKey should be empty. } if CHECKSHELL _p %{ Likewise, if loginShell is one of #{NOSHELL.join(' ')}, asf-banned should probably be 'yes', and the other two fields empty. } else _p do _a 'Append "?checkShell"', href: "#{ENV['SCRIPT_NAME']}?checkShell" _ " to the URL to check against loginShell in one of #{NOSHELL.join(' ')}" end end _table do _tr do _th 'UID' _th 'Name' _th 'asf-banned?' _th 'loginShell' _th 'Host' _th 'sshPublicKey count' _th 'Created' _th 'LastModified' _th 'ModifiedBy' end banned = ASF::Person.ldap_search(FILTER,ATTRS) banned.sort_by {|h| h['uid']}.each do |attrs| errs = {} CHECKS.each do |k,v| attr = attrs[k] if v.nil? # special handling errs[k] = 'error' unless attr.nil? else errs[k] = 'error' unless singleton(attr) == v end end if errs.size > 0 # Found an error _tr do uid = singleton attrs['uid'] _td do _a uid, href: "https://whimsy.apache.org/roster/committer/#{uid}" end _td singleton attrs['cn'] _td singleton(attrs['asf-banned']), class: errs['asf-banned'] _td singleton(attrs['loginShell']), class: errs['loginShell'] _td attrs['host']&.join(','), class: errs['host'] _td attrs['sshPublicKey']&.size, class: errs['sshPublicKey'] _td singleton attrs['createTimestamp'] _td singleton attrs['modifyTimestamp'] _td singleton attrs['modifiersName'] end end end end end