2014-10-17 105 views
1

最近問起Twisted mail server with TLS - no portal?看來我在咆哮一個錯誤的樹 - 所以現在看起來相當恰當的問一個新的,修正的問題。扭曲的SMTP服務器,添加SSL支持,2工廠?

所以我試圖擴展在http://twistedmatrix.com/documents/current/_downloads/emailserver.tac發現的基本SMTP服務器樣本以支持SSL連接。我可以如下(從我以前的努力解除代碼創建一個ssl上下文工廠:

caCertFile = open("/opt/tesa/etc/certs/CA/cacert.pem","r") 
certFile = open("/opt/tesa/etc/certs/server/server.crt","r") 
keyFile = open("/opt/tesa/etc/certs/server/server.key","r") 
caCertData = caCertFile.read() 
pKeyData = keyFile.read() 
certData = certFile.read() 
caCert = ssl.Certificate.loadPEM(caCertData) 
cert = load_certificate(FILETYPE_PEM, certData) 
pKey = load_privatekey(FILETYPE_PEM, pKeyData) 
sslCtxFactory = ssl.CertificateOptions(privateKey=pKey, certificate=cert, trustRoot=caCert) 

所以現在我有SMTP廠從emailserver.tac,以上我sslCtxFactory在我的舊代碼,我創建了一個對象類ESMTP如下:

myESMTP = ESMTP(contextFactory=sslCtxFactory) 
factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory)) 
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8001) 
endpoint.listen(factory) 

但是,由於該代碼不使用門戶等,那麼一些方法/在類定義爲ESMTP功能失效由於沒有被定義的各種屬性(例如自我。 delivery,self.portal)。

所以我試圖瞭解如何在mailserver.tac代碼中實現我的sslCtxFactory - 同時仍按照mailserver.tac使用門戶/領域,以確保twisted的ESMTP類中的方法不會失敗。

但是,我怎樣才能把這兩個工廠「結合在一起」呢?

感謝

回答

1

這看起來很奇怪:一個由扭曲所提供的ESMTP類的

myESMTP = ESMTP(contextFactory=sslCtxFactory) 
factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory)) 

實例是不可調用的。我想你一定意思大概是:

from functools import partial 

myESMTP = partial(ESMTP, contextFactory=sslCtxFactory) 
factory = protocol.Factory.forProtocol(mySMTP) 

假設所以......

ESMTP類尊重其身份驗證和授權行爲self.portal屬性。所有你需要做的就是設置它。

SMTPFactorySMTP實例的工廠,它將協議的portal屬性設置爲其自身(工廠的)portal屬性的值。唯一的問題是它使SMTP實例而不是ESMTP實例。

幸運的是,它(工廠)尊重它的屬性以供類實例化。實例是 時

  • 創建
  • 通過contextFactory=...ESMTP初始化ESMTP
  • 的實例:

    如果你寫:

    portal = Portal(...) 
    myESMTP = partial(ESMTP, contextFactory=...) 
    factory = SMTPFactory.forProtocol(protocol=myESMTP, portal=portal) 
    

    ,那麼你將有一個工廠,

  • 立即在ESMTP實例上設置portal屬性iates他們,使用傳遞到forProtocol這裏的價值。