Hello

I have had trouble ove rthe past configuring this but managed using hacks.

What i want to do is get trac to send emails to users lookup it up through 
AD. 

I am have just upgraded to trac 1.0.3 and my custom hack is broken.


my current setup.


in apache:


Alias /trac "/opt/html/trac"
<Directory /opt/html/trac>
        AuthType Kerberos
        AuthName KerberosLogin
        KrbServiceName HTTP/intranet.domain.com
        KrbMethodNegotiate On
        KrbMethodK5Passwd On
        KrbAuthRealms DOMAIN.COM
        Krb5KeyTab /etc/httpd/conf/intranet.keytab

        AuthLDAPURL 
ldap://ldapauth.domain.com/ou=TechSupport,ou=Woking,ou=Sites,dc=domain,dc=com?userPrincipalName
        AuthLDAPBindDN cn=ldaplookup,cn=Users,dc=domain,dc=com
        AuthLDAPBindPassword ****

        require valid-user
        ErrorDocument 401 "<html><meta http-equiv=\"refresh\" 
content=\"0;url=/intranet/info/unauthorized\"></html>"
</Directory>

<Location /trac/paradox>
   SetHandler mod_python
   PythonInterpreter main_interpreter
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnv /opt/html/trac/paradox
   PythonOption TracUriRoot /trac/paradox
</Location>


When a user logs into trac project they are logged in as.

[email protected]


current trac config

[root@cobra trac]# cat /opt/html/trac/paradox/conf/trac.ini
# -*- coding: utf-8 -*-

[announcer]
email_sender = SmtpLdapEmailSender

[attachment]
max_size = 5242880
max_zip_size = 5242880
render_unsafe_content = true

[browser]
color_scale = True
downloadable_paths = /trunk, /branches/*, /tags/*
hide_properties = svk:merge
intermediate_color = 
intermediate_point = 
newest_color = (255, 136, 136)
oldest_color = (136, 136, 255)
oneliner_properties = trac:summary
render_unsafe_content = true
wiki_properties = trac:description

[changeset]
max_diff_bytes = 10000000
max_diff_files = 0
wiki_format_messages = true

[components]
advancedworkflow.controller.ticketworkflowopownercomponent = enabled
advancedworkflow.controller.ticketworkflowopxref = enabled
announcer.api.announcementsystem = disabled
announcer.api.subscriptionresolver = disabled
announcer.distributors.mail.emaildistributor = disabled
announcer.distributors.mail.sendmailemailsender = disabled
announcer.distributors.mail.smtpemailsender = disabled
announcer.email_decorators.announceremaildecorator = disabled
announcer.email_decorators.staticemaildecorator = disabled
announcer.email_decorators.threadingemaildecorator = disabled
announcer.email_decorators.ticketaddlheaderemaildecorator = disabled
announcer.email_decorators.ticketsubjectemaildecorator = disabled
announcer.email_decorators.wikisubjectemaildecorator = disabled
announcer.filters.defaultpermissionfilter = disabled
announcer.formatters.ticketformatter = disabled
announcer.formatters.wikiformatter = disabled
announcer.opt.subscribers.allticketsubscriber = disabled
announcer.opt.subscribers.generalwikisubscriber = disabled
announcer.opt.subscribers.joinablegroupsubscriber = disabled
announcer.opt.subscribers.ticketcomponentownersubscriber = disabled
announcer.opt.subscribers.ticketcomponentsubscriber = disabled
announcer.opt.subscribers.ticketcustomfieldsubscriber = disabled
announcer.opt.subscribers.userchangesubscriber = disabled
announcer.opt.subscribers.watchsubscriber = disabled
announcer.pref.announcerpreferences = disabled
announcer.pref.subscriptionmanagementpanel = disabled
announcer.producers.attachmentchangeproducer = disabled
announcer.producers.ticketchangeproducer = disabled
announcer.producers.wikichangeproducer = disabled
announcer.resolvers.defaultdomainemailresolver = disabled
announcer.resolvers.ldapemailresolver = disabled
announcer.resolvers.sessionemailresolver = disabled
announcer.resolvers.specifiedemailresolver = disabled
announcer.resolvers.specifiedxmppresolver = disabled
announcer.subscribers.carboncopysubscriber = disabled
announcer.subscribers.ticketownersubscriber = disabled
announcer.subscribers.ticketreportersubscriber = disabled
announcer.subscribers.ticketupdatersubscriber = disabled
changelog.changelogmacro.changelogmacro = enabled
changelogmacro.* = enabled
spectrum.smtpldapemailsender.smtpldapemailsender = enabled
ticketchangesets.* = enabled
ticketlog.* = enabled
trac.db.mysql_backend.mysqlconnector = disabled
trac.db.postgres_backend.postgresqlconnector = disabled
tracbacks.tracbacks.tracbacksplugin = enabled
tracdragdrop.* = enabled
tracduplicates.web_ui = enabled
tracopt.mimeview.enscript.enscriptrenderer = enabled
tracopt.mimeview.php.phprenderer = enabled
tracopt.ticket.clone.ticketclonebutton = enabled
tracopt.ticket.commit_updater.committicketreferencemacro = enabled
tracopt.ticket.commit_updater.committicketupdater = enabled
tracopt.ticket.deleter.ticketdeleter = enabled
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertydiffrenderer = 
enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertyrenderer = 
enabled
tracopt.versioncontrol.svn.svn_prop.subversionpropertyrenderer = enabled
tracworkflowadmin.web_ui.tracworkflowadminmodule = enabled

[header_logo]
alt = 
link = http://intranet/trac/paradox/
src = common/trac_banner.png

[logging]
log_level = WARNING
log_type = file

[notification]
always_notify_owner = true
always_notify_reporter = true
always_notify_updater = true
email_sender = SmtpEmailSender
smtp_always_cc = [email protected]
smtp_enabled = true
smtp_from = [email protected]
smtp_from_author = Paradox
smtp_from_name = Paradox
smtp_password = 
smtp_port = 25
smtp_replyto = [email protected]
smtp_server = hero.uk.domain.com
smtp_subject_prefix = __default__
smtp_user = 
use_public_cc = true

[project]
descr = Paradox replacement
name = Paradox
url = http://intranet/sidb

[ticket]
commit_ticket_update_check_perms = true
commit_ticket_update_commands.close = 
commit_ticket_update_commands.refs = <ALL>
commit_ticket_update_envelope = []
commit_ticket_update_notify = true
default_component = other
default_milestone = Misc
default_version = v16.6
workflow = 
ConfigurableTicketWorkflow,TicketWorkflowOpOwnerComponent,TicketWorkflowOpXRef

[ticket-changesets]
collapsed = false
commands.close = close closed closes fix fixed fixes
commands.refs = addresses re references refs see
compact = true
envelope = 
hide_when_none = false
notify = true
ticket_comments = false

[ticket-workflow]
accept = new -> assigned
accept.operations = set_owner_to_self
accept.permissions = TICKET_MODIFY
dup = * -> closed
dup.name = close
dup.operations = set_resolution,xref
dup.set_resolution = duplicate
dup.xref = Ticket %s has been marked as a duplicate of this ticket.
dup.xref_local = Closed as duplicate of %s.
leave = * -> *
leave.default = 1
leave.operations = leave_status
needinfo = * -> needinfo
needinfo.name = Need info
needinfo.operations = set_owner_to_reporter
reassign = new,assigned,reopened -> new
reassign.operations = set_owner
reassign.permissions = TICKET_MODIFY
reopen = closed -> reopened
reopen.operations = del_resolution
reopen.permissions = TICKET_CREATE
resolve = new,assigned,reopened -> closed
resolve.operations = set_resolution
resolve.permissions = TICKET_MODIFY

#resolve_new = needinfo -> closed
#resolve_new.name = resolve
#resolve_new.operations = set_resolution
#resolve_new.permissions = TICKET_MODIFY
#resolve_new.set_resolution = invalid,wontfix,worksforme

[ticketlog]
log_message_maxlength = 100
log_pattern = \s*#%s\s+.*

[trac]
base_url = http://intranet/trac/paradox/
check_auth_ip = true
default_date_format = iso8601
default_language = en_GB
default_timezone = 
metanav = login,logout,settings,help,about
repository_dir = /hero/subversion/paradox

i am using 

[root@cobra trac]# cat /etc/redhat-release 
CentOS release 6.5 (Final)

pythin 2.6

ll /usr/lib/python2.6/site-packages
total 748
drwxr-xr-x  4 root root  4096 Aug 19 12:25 
AdvancedTicketWorkflowPlugin-0.11dev_r13338-py2.6.egg
drwxr-xr-x  4 root root  4096 Jun 20  2014 babel
drwxr-xr-x  2 root root  4096 Jun 20  2014 Babel-0.9.4-py2.6.egg-info
drwxr-xr-x  4 root root  4096 Sep 16 16:49 
ChangeLogMacro-0.2_r13850-py2.6.egg
drwxr-xr-x  2 root root  4096 Jun 20  2014 distribute-0.6.10-py2.6.egg-info
-rw-r--r--  1 root root   579 Jan 21 11:39 easy-install.pth
-rw-r--r--  1 root root   126 Nov 12  2010 easy_install.py
-rw-r--r--  2 root root   317 Nov 12  2010 easy_install.pyc
-rw-r--r--  2 root root   317 Nov 12  2010 easy_install.pyo
drwxr-xr-x  4 root root  4096 Jun 20  2014 Genshi-0.7-py2.6-linux-x86_64.egg
drwxr-xr-x. 2 root root  4096 Jun 10  2014 iniparse
-rw-r--r--. 1 root root  1085 Aug 17  2010 iniparse-0.3.1-py2.6.egg-info
-rw-r--r--  1 root root  4330 Aug 14  2009 libproxy.py
-rw-r--r--  2 root root  3990 Feb 20  2013 libproxy.pyc
-rw-r--r--  2 root root  3990 Feb 20  2013 libproxy.pyo
drwxr-xr-x  5 root root  4096 Aug 20 12:19 pip
drwxr-xr-x  2 root root  4096 Aug 20 12:19 pip-1.3.1-py2.6.egg-info
-rw-r--r--  1 root root 88196 Nov 12  2010 pkg_resources.py
-rw-r--r--  2 root root 92875 Nov 12  2010 pkg_resources.pyc
-rw-r--r--  2 root root 92875 Nov 12  2010 pkg_resources.pyo
drwxr-xr-x  6 root root  4096 Jun 20  2014 pygments
drwxr-xr-x  2 root root  4096 Jun 20  2014 Pygments-1.1.1-py2.6.egg-info
drwxr-xr-x. 2 root root  4096 Jun 10  2014 rpmUtils
drwxr-xr-x  3 root root  4096 Jun 20  2014 setuptools
-rw-r--r--  1 root root   144 Nov 12  2010 setuptools-0.6c11-py2.6.egg-info
-rw-r--r--  1 root root    33 Aug 19 16:44 setuptools.pth
-rw-r--r--  1 root root  2362 Nov 12  2010 site.py
-rw-r--r--  2 root root  1771 Nov 12  2010 site.pyc
-rw-r--r--  2 root root  1771 Nov 12  2010 site.pyo
-rw-r--r--  1 root root  3068 Aug 21 12:19 
SmtpLdapEmailSender-1.0-py2.7.egg.tar-gz
drwxr-xr-x  5 root root  4096 Jun 20  2014 Trac-1.0.1-py2.6.egg
drwxr-xr-x  5 root root  4096 Jan 21 11:39 Trac-1.0.3-py2.6.egg
drwxr-xr-x  4 root root  4096 Aug 21 11:17 
TracAnnouncer-1.0dev_r13984-py2.6.egg
drwxr-xr-x  4 root root  4096 Aug 20 11:18 Tracbacks-0.2dev_r12197-py2.6.egg
drwxr-xr-x  4 root root  4096 Aug 19 11:39 
TracDragDrop-0.12.0.12_r13613-py2.6.egg
drwxr-xr-x  4 root root  4096 Aug 20 11:20 TracDuplicates-0.11-py2.6.egg
drwxr-xr-x  4 root root  4096 Aug 20 11:05 
TracTicketChangelogPlugin-0.2dev_r13960-py2.6.egg
drwxr-xr-x  4 root root  4096 Jan 21 11:07 
TracWorkflowAdmin-0.12.0.2-py2.6.egg
drwxr-xr-x. 2 root root  4096 Jun 10  2014 urlgrabber
-rw-r--r--. 1 root root  2285 Jul 30  2013 urlgrabber-3.9.1-py2.6.egg-info
-rw-r--r--  1 root root 54516 Aug 15  2013 virtualenv-1.10.1-py2.6.egg-info
-rw-r--r--  1 root root 97379 Aug 15  2013 virtualenv.py
-rw-r--r--  1 root root 82291 Aug 15  2013 virtualenv.pyc
-rw-r--r--  1 root root 81691 Aug 15  2013 virtualenv.pyo
drwxr-xr-x  2 root root  4096 Aug 20 12:54 virtualenv_support
drwxr-xr-x. 2 root root  4096 Jun 10  2014 yum


ll /opt/html/trac/paradox/plugins/
total 16
drwxr-xr-x 7 apache apache 4096 Sep 16 16:34 changelogmacro
drwxr-xr-x 4 apache apache 4096 Aug 21 12:45 
SmtpLdapEmailSender-1.0-py2.7.egg
drwxr-xr-x 4 apache apache 4096 Aug 20 11:17 tracbacksplugin
drwxr-xr-x 4 apache apache 4096 Aug 20 11:05 tracticketchangelogplugin




#cat SmtpLdapEmailSender.py
from trac.core import *
from trac.config import IntOption, Option
from trac.notification import IEmailSender, SmtpEmailSender
import ldap

class SmtpLdapEmailSender(SmtpEmailSender):

    implements(IEmailSender)

    email_ldap_serveruri = Option('notification', 'email_ldap_serveruri', 
'',
                               """AD LDAP Server to use for looking up 
e-mail addresses""")
    email_ldap_port = IntOption('notification', 'email_ldap_port', 389, 
"""AD LDAP Server port""")
    email_ldap_binddn = Option('notification', 'email_ldap_binddn', '',
                               """Bind DN for LDAP lookup. If not given, 
Kerberos auth will be used for current user""")
    email_ldap_bindpw = Option('notification', 'email_ldap_bindpw', '', 
"""Password for non-kerberos auth""")
    email_ldap_basedn = Option('notification', 'email_ldap_basedn', '', 
"""Base DN to use for LDAP searches""")
    
    email_attr = 'mail'
    
    def __init__(self):
        self.log.debug("Initialising LDAP object with URI: ", 
self.email_ldap_serveruri)
        self.ldap_conn=ldap.initialize(self.email_ldap_serveruri)
        
        
    def send(self, from_addr, recipients, message):
        
        if self.email_ldap_binddn != None:
            self.log.info("Binding to LDAP as " + self.email_ldap_binddn)
            self.ldap_conn.bind_s(self.email_ldap_binddn, 
self.email_ldap_bindpw, ldap.AUTH_SIMPLE)
        else:
            self.log.info("Binding to LDAP with Kerberos")
            self.ldap_conn.bind_s()
        
        #Iterate through recipients, checking for correct e-mail addresses 
in LDAP
        #Output in ldapRecipients
        self.log.info("Updating list of recipients")
        new_recipients = []
        for addr in recipients:
            self.log.debug("Searching LDAP server %s for user %s", 
self.email_ldap_serveruri, addr)
            search_string = 'userPrincipalName=' + addr
            result = self.ldap_conn.search_s(self.email_ldap_basedn, 
ldap.SCOPE_SUBTREE, search_string, [self.email_attr])
            
            #result is formatted as a string (result) in a list of [attr 
values], in a dictionary of {attr_name=>attr_values}
            #in a tuple of (DN, Entry), within a list of results. So result 
for principle name [email protected] would be
            #[('CN=Jason 
Aftalion,OU=TechSupport,OU=Woking,OU=Sites,DC=domain,DC=com', {'mail': 
['[email protected]']})] 
            if result[0][1][self.email_attr][0]:
                self.log.debug("Found e-mail address: " + 
result[0][1][self.email_attr][0])
                new_recipients.append(result[0][1][self.email_attr][0])
            else:
                self.log.debug("Could not find e-mail address")
                new_recipients.append(addr)
            
            
            return super(SmtpLdapEmailSender,self).send(from_addr, 
new_recipients, message)


This was working fine in trac 1.0.1. the error i recieve is

2015-01-22 14:15:24,738 Trac[web_ui] ERROR: Failure sending notification on 
change to ticket #86: ConfigurationError: Cannot find an implementation of 
the <tt>IEmailSender</tt> interface named <tt>SmtpLdapEmailSender</tt>. 
Please check that the Component is enabled or update the option 
<tt>[notification] email_sender</tt> in trac.ini.


-- 
You received this message because you are subscribed to the Google Groups "Trac 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/trac-dev.
For more options, visit https://groups.google.com/d/optout.

Reply via email to