added email notification upon a new commit
This commit is contained in:
		| @ -15,7 +15,7 @@ Group: Applications/Utilities | |||||||
| #BuildArch: noarch | #BuildArch: noarch | ||||||
| Source0: %{name}-%{version}.tar.gz | Source0: %{name}-%{version}.tar.gz | ||||||
|  |  | ||||||
| Requires: httpd %{php_package_name} %{php_package_name}-ldap %{php_package_name}-mysql %{php_package_name}-gd subversion subversion-perl mod_dav_svn mod_perl perl perl-LDAP perl-Config-Simple perl-URI perl-DBI perl-Digest-SHA1 | Requires: httpd %{php_package_name} %{php_package_name}-ldap %{php_package_name}-mysql %{php_package_name}-gd subversion subversion-perl mod_dav_svn mod_perl perl perl-LDAP perl-Config-Simple perl-URI perl-DBI perl-Digest-SHA1 perl-Mail-Sendmail | ||||||
| # %{php_package_name}-pecl-svn > 1.2.0 | # %{php_package_name}-pecl-svn > 1.2.0 | ||||||
| # %{php_package_name}-pgsql perl-DBD-Pg | # %{php_package_name}-pgsql perl-DBD-Pg | ||||||
|  |  | ||||||
|  | |||||||
| @ -11,6 +11,11 @@ use SVN::Core; | |||||||
| use SVN::Repos; | use SVN::Repos; | ||||||
| use SVN::Fs; | use SVN::Fs; | ||||||
|  |  | ||||||
|  | use Net::LDAP; | ||||||
|  | use Net::LDAP qw(LDAP_SUCCESS); | ||||||
|  | use URI; | ||||||
|  | use Mail::Sendmail; | ||||||
|  |  | ||||||
| my $CFG_FILE = '@CFGDIR@/codepot.ini'; | my $CFG_FILE = '@CFGDIR@/codepot.ini'; | ||||||
| my $REPOFS = $ARGV[0]; | my $REPOFS = $ARGV[0]; | ||||||
| my $REPOBASE = basename($REPOFS); | my $REPOBASE = basename($REPOFS); | ||||||
| @ -28,13 +33,28 @@ sub get_config | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	my $config = { | 	my $config = { | ||||||
|  | 		login_model => $cfg->param ('login_model'), | ||||||
|  | 		 | ||||||
|  | 		ldap_server_uri => $cfg->param ('ldap_server_uri'), | ||||||
|  | 		ldap_server_protocol_version => $cfg->param ('ldap_server_protocol_version'), | ||||||
|  | 		ldap_auth_mode => $cfg->param ('ldap_auth_mode'), | ||||||
|  | 		ldap_userid_format => $cfg->param ('ldap_userid_format'), | ||||||
|  | 		ldap_password_format => $cfg->param ('ldap_password_format'), | ||||||
|  | 		ldap_admin_binddn => $cfg->param ('ldap_admin_binddn'), | ||||||
|  | 		ldap_admin_password => $cfg->param ('ldap_admin_password'), | ||||||
|  | 		ldap_userid_search_base => $cfg->param ('ldap_userid_search_base'), | ||||||
|  | 		ldap_userid_search_filter => $cfg->param ('ldap_userid_search_filter'), | ||||||
|  | 		ldap_mail_attribute_name => $cfg->param ('ldap_mail_attribute_name'), | ||||||
|  |  | ||||||
| 		database_hostname => $cfg->param ("database_hostname"), | 		database_hostname => $cfg->param ("database_hostname"), | ||||||
| 		database_port => $cfg->param ("database_port"), | 		database_port => $cfg->param ("database_port"), | ||||||
| 		database_username => $cfg->param ("database_username"), | 		database_username => $cfg->param ("database_username"), | ||||||
| 		database_password => $cfg->param ("database_password"), | 		database_password => $cfg->param ("database_password"), | ||||||
| 		database_name => $cfg->param ("database_name"), | 		database_name => $cfg->param ("database_name"), | ||||||
| 		database_driver => $cfg->param ("database_driver"), | 		database_driver => $cfg->param ("database_driver"), | ||||||
| 		database_prefix => $cfg->param ("database_prefix") | 		database_prefix => $cfg->param ("database_prefix"), | ||||||
|  |  | ||||||
|  | 		email_sender => $cfg->param ("email_sender") | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	return $config; | 	return $config; | ||||||
| @ -146,6 +166,154 @@ sub get_author | |||||||
| 	return $author; | 	return $author; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | sub format_string  | ||||||
|  | { | ||||||
|  | 	my ($fmt, $userid, $password) = @_; | ||||||
|  |  | ||||||
|  | 	my $out = $fmt; | ||||||
|  | 	$out =~ s/\$\{userid\}/$userid/g; | ||||||
|  | 	$out =~ s/\$\{password\}/$password/g; | ||||||
|  |  | ||||||
|  | 	return $out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub get_author_email_ldap | ||||||
|  | { | ||||||
|  | 	my ($cfg, $userid) = @_; | ||||||
|  |  | ||||||
|  | 	my $uri = URI->new ($cfg->{ldap_server_uri}); | ||||||
|  | 	my $ldap = Net::LDAP->new ( | ||||||
|  | 		$uri->host,  | ||||||
|  | 		scheme => $uri->scheme, | ||||||
|  | 		port => $uri->port, | ||||||
|  | 		version => $cfg->{ldap_server_protocol_version} | ||||||
|  | 	); | ||||||
|  | 	if (!defined($ldap)) | ||||||
|  | 	{ | ||||||
|  | 		print (STDERR 'Cannot create LDAP'); | ||||||
|  | 		return (-1, undef); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	my $f_rootdn = format_string ($cfg->{ldap_admin_binddn}, $userid, ''); | ||||||
|  | 	my $f_rootpw = format_string ($cfg->{ldap_admin_password}, $userid, ''); | ||||||
|  |  | ||||||
|  | 	my $res = $ldap->bind ($f_rootdn, password => $f_rootpw); | ||||||
|  | 	if ($res->code != LDAP_SUCCESS)  | ||||||
|  | 	{ | ||||||
|  | 		print (STDERR "Cannot bind LDAP as $f_rootdn - " . $res->error()); | ||||||
|  | 		$ldap->unbind(); | ||||||
|  | 		return (-1, undef);  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	my $f_basedn = format_string ($cfg->{ldap_userid_format}, $userid, ''); | ||||||
|  | 	my $f_filter = '(' . $cfg->{ldap_mail_attribute_name} . '=*)'; | ||||||
|  |  | ||||||
|  | 	$res = $ldap->search (base => $f_basedn, scope => 'sub', filter => $f_filter); | ||||||
|  | 	if ($res->code != LDAP_SUCCESS)  | ||||||
|  | 	{ | ||||||
|  | 		$ldap->unbind(); | ||||||
|  | 		return (0, undef); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	my $entry = $res->entry(0); # get the first entry only | ||||||
|  | 	if (!defined($entry)) | ||||||
|  | 	{ | ||||||
|  | 		$ldap->unbind(); | ||||||
|  | 		return (0, undef); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	my $xret = 0; | ||||||
|  | 	my $email = ''; | ||||||
|  | 	my @attrs = $entry->attributes (); | ||||||
|  | 	foreach my $attr (@attrs) | ||||||
|  | 	{ | ||||||
|  | 		if ($attr eq  $cfg->{ldap_mail_attribute_name}) | ||||||
|  | 		{ | ||||||
|  | 			$email = $entry->get_value ($attr); | ||||||
|  | 			$xret = 1; | ||||||
|  | 			last; | ||||||
|  | 		 } | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$ldap->unbind(); | ||||||
|  | 	return ($xret, $email); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub get_author_email_db | ||||||
|  | { | ||||||
|  | 	my ($cfg, $dbh, $prefix, $userid) = @_; | ||||||
|  |  | ||||||
|  | 	my $query = $dbh->prepare ("SELECT ${QC}email${QC} FROM ${QC}${prefix}user_account${QC} WHERE ${QC}userid${QC}=?"); | ||||||
|  | 	if (!$query || !$query->execute ($userid)) | ||||||
|  | 	{ | ||||||
|  | 		return (-1, $dbh->errstr()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (my @row = $query->fetchrow_array()) | ||||||
|  | 	{ | ||||||
|  | 		return (1, @row[0]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return (0, undef); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub email_message_to_project_members | ||||||
|  | { | ||||||
|  | 	my ($cfg, $dbh, $prefix, $projectid, $subject, $message) = @_; | ||||||
|  |  | ||||||
|  | 	my $query = $dbh->prepare ("SELECT ${QC}userid${QC} FROM ${QC}${prefix}project_membership${QC} WHERE ${QC}projectid${QC}=?"); | ||||||
|  | 	if (!$query || !$query->execute ($projectid)) | ||||||
|  | 	{ | ||||||
|  | 		return (-1, $dbh->errstr()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	my @members; | ||||||
|  | 	while (my @row = $query->fetchrow_array()) | ||||||
|  | 	{ | ||||||
|  | 		push (@members, $row[0]); | ||||||
|  | 	} | ||||||
|  | 	$query->finish (); | ||||||
|  |  | ||||||
|  | 	my $recipients = ''; | ||||||
|  | 	foreach my $member (@members) | ||||||
|  | 	{ | ||||||
|  | 		my $xret; | ||||||
|  | 		my $email; | ||||||
|  |  | ||||||
|  | 		if ($cfg->{login_model} eq 'LdapLoginModel') | ||||||
|  | 		{ | ||||||
|  | 			($xret, $email) = get_author_email_ldap ($cfg, $member) | ||||||
|  | 		} | ||||||
|  | 		elsif ($cfg->{login_model} eq 'DbLoginModel') | ||||||
|  | 		{ | ||||||
|  | 			($xret, $email) = get_author_email_db ($cfg, $dbh, $prefix, $member); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			$xret = -2; | ||||||
|  | 			$email = ''; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ($xret >= 1 && defined($email) && length($email) > 0) | ||||||
|  | 		{ | ||||||
|  | 			if (length($recipients) > 0) { $recipients .= ', '; } | ||||||
|  | 			$recipients .= $email; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (length($recipients) <= 0) { return (0, undef); } | ||||||
|  |  | ||||||
|  | 	my %mail = ( | ||||||
|  | 		To => $recipients, | ||||||
|  | 		From => $cfg->{email_sender}, | ||||||
|  | 		Subject => $subject, | ||||||
|  | 		Message => $message | ||||||
|  | 	); | ||||||
|  |  | ||||||
|  | 	Mail::Sendmail::sendmail (%mail); | ||||||
|  | 	return (1, undef); | ||||||
|  | } | ||||||
|  |  | ||||||
| #------------------------------------------------------------ | #------------------------------------------------------------ | ||||||
| # MAIN | # MAIN | ||||||
| #------------------------------------------------------------ | #------------------------------------------------------------ | ||||||
| @ -173,7 +341,12 @@ if (!defined($dbh)) | |||||||
| } | } | ||||||
|  |  | ||||||
| write_commit_log ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $AUTHOR); | write_commit_log ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $AUTHOR); | ||||||
|  |  | ||||||
|  | my $commit_subject = "Commit $REV by $AUTHOR in $REPOBASE"; | ||||||
|  | my $commit_message = $commit_subject; # TODO: compose a proper URL | ||||||
|  |  | ||||||
|  | email_message_to_project_members ($cfg, $dbh, $cfg->{database_prefix}, $REPOBASE, $commit_subject, $commit_message); | ||||||
|  |  | ||||||
| close_database ($dbh); | close_database ($dbh); | ||||||
|  |  | ||||||
| exit (0); | exit (0); | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user