diff --git a/include/vcl/printerinfomanager.hxx b/include/vcl/printerinfomanager.hxx index 66d5d28..df89630 100644 --- a/include/vcl/printerinfomanager.hxx +++ b/include/vcl/printerinfomanager.hxx @@ -43,6 +43,8 @@ struct PrinterInfo : JobData OUString m_aLocation; // a user defined comment OUString m_aComment; + // authentication requirements + OUString m_aAuthInfoRequired; // a command line to pipe a PS-file to OUString m_aCommand; // a command line to pipe a PS-file to in case of direct print diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx index d39196e..3d37519 100644 --- a/vcl/unx/generic/printer/cupsmgr.cxx +++ b/vcl/unx/generic/printer/cupsmgr.cxx @@ -314,10 +314,13 @@ void CUPSManager::initialize() for( int k = 0; k < pDest->num_options; k++ ) { + fprintf(stderr, "option is %s\n", pDest->options[k].name); if(!strcmp(pDest->options[k].name, "printer-info")) aPrinter.m_aInfo.m_aComment=OStringToOUString(pDest->options[k].value, aEncoding); if(!strcmp(pDest->options[k].name, "printer-location")) aPrinter.m_aInfo.m_aLocation=OStringToOUString(pDest->options[k].value, aEncoding); + if(!strcmp(pDest->options[k].name, "auth-info-required")) + aPrinter.m_aInfo.m_aAuthInfoRequired=OStringToOUString(pDest->options[k].value, aEncoding); } OUStringBuffer aBuf( 256 ); @@ -446,9 +449,9 @@ const PPDParser* CUPSManager::createCUPSParser( const OUString& rPrinter ) pNewParser = pCUPSParser; /*int nConflicts =*/ cupsMarkOptions( pPPD, pDest->num_options, pDest->options ); - SAL_INFO("vcl.unx.print", "processing the following options for printer " << pDest->name << " (instance " << pDest->instance << "):"); + SAL_WARN("vcl.unx.print", "processing the following options for printer " << pDest->name << " (instance " << pDest->instance << "):"); for( int k = 0; k < pDest->num_options; k++ ) - SAL_INFO("vcl.unx.print", + SAL_WARN("vcl.unx.print", " \"" << pDest->options[k].name << "\" = \"" << pDest->options[k].value << "\""); PrinterInfo& rInfo = m_aPrinters[ aPrinter ].m_aInfo; @@ -616,6 +619,61 @@ void CUPSManager::getOptionsFromDocumentSetup( const JobData& rJob, bool bBanner } } +namespace +{ + class RTSPWDialog : public ModalDialog + { + FixedText* m_pText; + Edit* m_pUserEdit; + Edit* m_pPassEdit; + + public: + RTSPWDialog(const OString& rServer, const OString& rUserName, Window* pParent); + + OString getUserName() const; + OString getPassword() const; + }; + + RTSPWDialog::RTSPWDialog( const OString& rServer, const OString& rUserName, Window* pParent ) + : ModalDialog(pParent, "CUPSPasswordDialog", + "vcl/ui/cupspassworddialog.ui") + { + get(m_pText, "text"); + get(m_pUserEdit, "user"); + get(m_pPassEdit, "pass"); + + OUString aText(m_pText->GetText()); + aText = aText.replaceFirst("%s", OStringToOUString(rServer, osl_getThreadTextEncoding())); + m_pText->SetText(aText); + m_pUserEdit->SetText( OStringToOUString(rUserName, osl_getThreadTextEncoding())); + } + + OString RTSPWDialog::getUserName() const + { + return OUStringToOString( m_pUserEdit->GetText(), osl_getThreadTextEncoding() ); + } + + OString RTSPWDialog::getPassword() const + { + return OUStringToOString( m_pPassEdit->GetText(), osl_getThreadTextEncoding() ); + } + + bool AuthenticateQuery(const OString& rServer, OString& rUserName, OString& rPassword) + { + bool bRet = false; + + RTSPWDialog aDialog(rServer, rUserName, NULL); + if (aDialog.Execute()) + { + rUserName = aDialog.getUserName(); + rPassword = aDialog.getPassword(); + bRet = true; + } + + return bRet; + } +} + bool CUPSManager::endSpool( const OUString& rPrintername, const OUString& rJobTitle, FILE* pFile, const JobData& rDocumentJobData, bool bBanner, const OUString& rFaxNumber ) { OSL_TRACE( "endSpool: %s, %s, copy count = %d", @@ -647,6 +705,22 @@ bool CUPSManager::endSpool( const OUString& rPrintername, const OUString& rJobTi cups_option_t* pOptions = NULL; getOptionsFromDocumentSetup( rDocumentJobData, bBanner, nNumOptions, (void**)&pOptions ); + const PrinterInfo& rInfo = m_aPrinters[rPrintername].m_aInfo; + if (rInfo.m_aAuthInfoRequired == "username,password" || rInfo.m_aAuthInfoRequired == "domain,username,password") + { + OString aUser = cupsUser(); + OString aServer = cupsServer(); + OString aPassword; + if (AuthenticateQuery(aServer, aUser, aPassword)) + { + OString aAuthInfo; + if (rInfo.m_aAuthInfoRequired == "domain,username,password") + aAuthInfo += aServer + ","; + aAuthInfo += aUser + "," + aPassword; + nNumOptions = cupsAddOption("auth-info", aAuthInfo.getStr(), nNumOptions, &pOptions); + } + } + OString sJobName(OUStringToOString(rJobTitle, aEnc)); //fax4CUPS, "the job name will be dialled for you" @@ -833,61 +907,6 @@ bool CUPSManager::writePrinterConfig() return PrinterInfoManager::writePrinterConfig(); } -namespace -{ - class RTSPWDialog : public ModalDialog - { - FixedText* m_pText; - Edit* m_pUserEdit; - Edit* m_pPassEdit; - - public: - RTSPWDialog(const OString& rServer, const OString& rUserName, Window* pParent); - - OString getUserName() const; - OString getPassword() const; - }; - - RTSPWDialog::RTSPWDialog( const OString& rServer, const OString& rUserName, Window* pParent ) - : ModalDialog(pParent, "CUPSPasswordDialog", - "vcl/ui/cupspassworddialog.ui") - { - get(m_pText, "text"); - get(m_pUserEdit, "user"); - get(m_pPassEdit, "pass"); - - OUString aText(m_pText->GetText()); - aText = aText.replaceFirst("%s", OStringToOUString(rServer, osl_getThreadTextEncoding())); - m_pText->SetText(aText); - m_pUserEdit->SetText( OStringToOUString(rUserName, osl_getThreadTextEncoding())); - } - - OString RTSPWDialog::getUserName() const - { - return OUStringToOString( m_pUserEdit->GetText(), osl_getThreadTextEncoding() ); - } - - OString RTSPWDialog::getPassword() const - { - return OUStringToOString( m_pPassEdit->GetText(), osl_getThreadTextEncoding() ); - } - - bool AuthenticateQuery(const OString& rServer, OString& rUserName, OString& rPassword) - { - bool bRet = false; - - RTSPWDialog aDialog(rServer, rUserName, NULL); - if (aDialog.Execute()) - { - rUserName = aDialog.getUserName(); - rPassword = aDialog.getPassword(); - bRet = true; - } - - return bRet; - } -} - const char* CUPSManager::authenticateUser( const char* /*pIn*/ ) { const char* pRet = NULL;