Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 80132 Details for
Bug 195644
Add security support to New Agent Controller
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
patch to remove openssl dependency from 441
ssl_off.txt (text/plain), 19.30 KB, created by
Igor Alelekov
on 2007-10-11 08:16:11 EDT
(
hide
)
Description:
patch to remove openssl dependency from 441
Filename:
MIME Type:
Creator:
Igor Alelekov
Created:
2007-10-11 08:16:11 EDT
Size:
19.30 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.tptp.platform.agentcontroller >Index: src-native-new/src/transport/socketTL/SocketListener.h >=================================================================== >RCS file: /cvsroot/tptp/platform/org.eclipse.tptp.platform.agentcontroller/src-native-new/src/transport/socketTL/SocketListener.h,v >retrieving revision 1.13 >diff -u -r1.13 SocketListener.h >--- src-native-new/src/transport/socketTL/SocketListener.h 4 Sep 2007 22:39:15 -0000 1.13 >+++ src-native-new/src/transport/socketTL/SocketListener.h 11 Oct 2007 10:48:24 -0000 >@@ -22,10 +22,6 @@ > #include "tptp/TPTPMessageHeader.h" > #include "tptp/hashtable.h" > >-#ifndef _WIN32 >- #include <openssl/ssl.h> >-#endif >- > #define SOCKET_LISTENER_OBJECT_ID 20001 > > /** instance-specific data block */ >@@ -37,7 +33,6 @@ > transport_layer_data_t agentControllerDataBlk ; > processMessage_ptr_t processMessage; > tptp_object* nexto; >- int securityEnabled; > > /* hash table of connections for easy and fast search */ > HashTable * connectionTable ; >@@ -205,14 +200,6 @@ > > BOOL isForConsole ; > >- BOOL authenticated; >- BOOL secured; >- >-#ifndef _WIN32 >- SSL* ssl; >- SSL_CTX* sslCtx; >-#endif >- > Lock_t locker ; > > } request_block_t ; >Index: src-native-new/src/transport/socketTL/SocketListener.c >=================================================================== >RCS file: /cvsroot/tptp/platform/org.eclipse.tptp.platform.agentcontroller/src-native-new/src/transport/socketTL/SocketListener.c,v >retrieving revision 1.41 >diff -u -r1.41 SocketListener.c >--- src-native-new/src/transport/socketTL/SocketListener.c 14 Sep 2007 13:47:10 -0000 1.41 >+++ src-native-new/src/transport/socketTL/SocketListener.c 11 Oct 2007 10:48:24 -0000 >@@ -67,7 +67,6 @@ > #include <unistd.h> > #include <signal.h> > #include <sys/wait.h> >- #include <openssl/ssl.h> > #include <tptp/TPTPConfig.h> > #endif > >@@ -112,16 +111,8 @@ > int handleCONNECT(request_block_ptr_t pBlk, char *pMsg) ; > > int handleCONNECT_DATA(request_block_ptr_t pBlk, char *pMsg) ; >-tptp_int32 writeData(request_block_ptr_t pBlock, char* buffer, int length); > tptp_int32 closeConnection(request_block_ptr_t pBlock); > int closeSocket (int socket); >-int handleAUTHENTICATE(request_block_ptr_t pBlk, char *pMsg) ; >- >-BOOL vrfusrpwd(tptp_string *userid, tptp_string *password); >- >-static int sslinit = 1; >-static char* certFile = NULL; >-static char* keyFile = NULL; > > /** > ********************************************************* >@@ -171,7 +162,7 @@ > > addBasicMsgHeader(cmd, cmdLength, &buffer, &bufferLength, flags) ; > /* send the response */ >- writeData(pBlk, buffer, bufferLength); >+ writeToSocket(pBlk->clientSock, buffer, bufferLength); > > if (cmd) tptp_free(cmd); > if (buffer) tptp_free(buffer); >@@ -179,74 +170,6 @@ > return ( rc ) ; > } > >-#ifndef _WIN32 >-int setSSL(request_block_ptr_t pBlk) { >- SSL_METHOD *meth; >- SSL_CTX* ctx; >- SSL* ssl; >- int err; >- >- if (sslinit) { >- SSL_load_error_strings(); >- SSL_library_init(); >- sslinit = 0; >- } >- >- meth = SSLv23_server_method(); >- >- ctx = SSL_CTX_new (meth); >- if (!ctx) { >- TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "SSL: context error"); >- return -1; >- } >- >- if (certFile == NULL) { >- TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "SSL: no certificate file found"); >- return -1; >- } >- >- if (SSL_CTX_use_certificate_file(ctx, certFile, SSL_FILETYPE_PEM) <= 0) { >- TPTP_LOG_DEBUG_MSG1(pBlk->pServerData, "SSL: illegal certificate file %s", certFile); >- return -1; >- } >- >- if (keyFile == NULL) { >- TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "SSL: no key file found"); >- return -1; >- } >- >- if (SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM) <= 0) { >- TPTP_LOG_DEBUG_MSG1(pBlk->pServerData, "SSL: illegal key file %s", keyFile); >- return -1; >- } >- >- if (!SSL_CTX_check_private_key(ctx)) { >- TPTP_LOG_DEBUG_MSG2(pBlk->pServerData, "SSL: Private key %s does not match the certificate public key %s", >- keyFile, certFile); >- return -1; >- } >- >- ssl = SSL_new (ctx); >- if (ssl < 0) { >- TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "SSL.new error"); >- return -1; >- } >- >- SSL_set_fd (ssl, pBlk->clientSock); >- err = SSL_accept (ssl); >- if (err < 0) { >- TPTP_LOG_DEBUG_MSG1(pBlk->pServerData, "SSL: ssl_accept error %d", SSL_get_error(ssl, err)); >- return -1; >- } >- >- pBlk->sslCtx = ctx; >- pBlk->ssl = ssl; >- pBlk->secured = TRUE; >- >- return 0; >-} >-#endif >- > /** > ********************************************************* > * >@@ -264,14 +187,6 @@ > TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "Socket: handle CONNECT request (Control channel)."); > pBlk->connectionType = CONTROL_CHANNEL ; > >-#ifndef _WIN32 >- if (pBlk->pServerData->securityEnabled && !pBlk->secured) { >- processCONNECTCall(pBlk, pMsg, CONNECTION_REFUSED | SECURITY_REQUIRED); >- // no race condition here since incoming ssl request >- return setSSL(pBlk); // will wait for processing in input buffer >- } >-#endif >- > /* tell the agent controller about the new connection */ > /* and receive the assigned connection id */ > pFunc = pBlk->pServerData->agentControllerDataBlk.addConnectionEntry ; >@@ -288,65 +203,8 @@ > pTab = pBlk->pServerData->connectionTable ; > tablePut(pTab, connId, (Entry_value_ptr_t) pBlk) ; > >-#ifndef _WIN32 >- /* CONNECT command. Go handle it. */ >- if (pBlk->pServerData->securityEnabled) { >- processCONNECTCall(pBlk, pMsg, CONNECTION_COMPLETE | AUTHENTICATION_FAILED); >- } >- else { >- processCONNECTCall(pBlk, pMsg, CONNECTION_COMPLETE); >- pBlk->authenticated = TRUE; >- } >-#else > processCONNECTCall(pBlk, pMsg, CONNECTION_COMPLETE); >- pBlk->authenticated = TRUE; >-#endif >- >- return 0 ; >-} >- >-/** >- ********************************************************* >- * >- * @brief >- * handle the AUTHENTICATE request >- * >- *********************************************************/ >-int handleAUTHENTICATE(request_block_ptr_t pBlk, char *pMsg) { >- char *name=NULL, *psw=NULL; >- BOOL success; >- >- pMsg = readStringFromBuffer(pMsg, &name); >- pMsg = readStringFromBuffer(pMsg, &psw); >- >- if (name != NULL && psw != NULL){ >- success = vrfusrpwd(name, psw); >- } >- else{ >- success = FALSE; >- } >- >- if (success) { >- TPTP_LOG_DEBUG_MSG1(pBlk->pServerData, "User %s is authenticated", name); >- } >- else if (name != NULL) { >- TPTP_LOG_DEBUG_MSG1(pBlk->pServerData, "User %s is not authenticated", name); >- } >- else { >- TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "User <null> is not authenticated"); >- } >- >- pBlk->authenticated = success; >- if (success) { >- processCONNECTCall(pBlk, pMsg, AUTHENTICATION_SUCCESSFUL); >- } >- else { >- processCONNECTCall(pBlk, pMsg, AUTHENTICATION_FAILED); >- } > >- if (name != NULL) tptp_free(name); >- if (psw != NULL) tptp_free(psw); >- > return 0 ; > } > >@@ -366,14 +224,6 @@ > > TPTP_LOG_DEBUG_MSG(pBlk->pServerData, "Socket: handle CONNECT_DATA/CONNECT_CONSOLE request (Data channel)."); > >-#ifndef _WIN32 >- if (pBlk->pServerData->securityEnabled && !pBlk->secured) { >- processCONNECTCall(pBlk, pMsg, CONNECTION_REFUSED | SECURITY_REQUIRED); >- // no race condition here since incoming ssl request >- return setSSL(pBlk); // will wait for processing in input buffer >- } >-#endif >- > pBlk->connectionType = DATA_CHANNEL ; > > /* tell the agent controller about the new connection */ >@@ -477,21 +327,6 @@ > /* prevent it from forwarding to the AC */ > pMsg = NULL ; > } >-#ifndef _WIN32 >- else if (pBlk->pServerData->securityEnabled && !pBlk->secured) { >- pMsg = NULL ; >- } >- else if ((flags & AUTHENTICATE) != 0) { >- handleAUTHENTICATE(pBlk, pMsg) ; >- >- /* prevent it from forwarding to the AC */ >- pMsg = NULL ; >- } >- else if (pBlk->pServerData->securityEnabled && !pBlk->authenticated) { >- processCONNECTCall(pBlk, pMsg, AUTHENTICATION_FAILED); >- pMsg = NULL ; >- } >-#endif > else if ((flags & DISCONNECT) != 0) > { > handleDISCONNECT(pBlk, pMsg) ; >@@ -690,29 +525,6 @@ > return ( bytesToBeProcessed ) ; > } > >-#ifndef _WIN32 >- >-int recvData (request_block_ptr_t pRdb, char *buffer, int length, int *bytesRead) { >- int result; >- if (pRdb->secured) { >- result = SSL_read (pRdb->ssl, buffer, length); >- *bytesRead = result; >- } >- else { >- result = readFromSocket(pRdb->clientSock, buffer, length, bytesRead); >- } >- >- return result; >-} >- >-#else >- >-int recvData (request_block_ptr_t pRdb, char *buffer, int length, int *bytesRead) { >- return readFromSocket(pRdb->clientSock, buffer, length, bytesRead); >-} >- >-#endif >- > /** > ********************************************************* > * >@@ -748,7 +560,7 @@ > > /* Another message might come in while we're processing > * so we read until the pipe is empty */ >- while ( (rc = recvData(pRdb, buffer, bufferLength, &bytesRead)) > 0) >+ while ( (rc = readFromSocket(pRdb->clientSock, buffer, bufferLength, &bytesRead)) > 0) > { > TPTP_LOG_DEBUG_MSG1(pRdb->pServerData, "Socket processClientRequest: Read %d bytes.", bytesRead) ; > >@@ -807,14 +619,6 @@ > > pRequestDataBlock->isForConsole = FALSE ; > >- pRequestDataBlock->authenticated = FALSE; >- pRequestDataBlock->secured = FALSE; >- >-#ifndef _WIN32 >- pRequestDataBlock->ssl = NULL; >- pRequestDataBlock->sslCtx = NULL; >-#endif >- > pRequestDataBlock->pSendFunc = NULL ; > > tptp_initializeLock( & pRequestDataBlock->locker ); >@@ -915,59 +719,6 @@ > return ( 0 ); > } > >-int getACHome (char* buf, int len) { >- char* acHome; >- >- acHome = getenv(CONFIGURATION_HOME); >- if (acHome != NULL) { >- strncpy(buf, acHome, len); >- return 0; >- } >- >-#ifdef _WIN32 >- acHome = _getcwd(buf, 1024); >- if (acHome == NULL) return -1; >- >- strcat(buf, "\\.."); >-#else >- acHome = getcwd(buf, 1024); >- if (acHome == NULL) return -1; >- >- strcat(buf, "/.."); >-#endif >- >- return 0; >-} >- >-int initSSL() { >- char buf[1024]; >- >- if (getACHome(buf, 1024) < 0) { >- certFile = (char*) malloc(strlen(CERTF) + 1); >- strcpy(certFile, CERTF); >- >- keyFile = (char*) malloc(strlen(KEYF) + 1); >- strcpy(keyFile, CERTF); >- } >- else { >-#ifdef _WIN32 >- strcat(buf, "\\security\\"); >-#else >- strcat(buf, "/security/"); >-#endif >- >- certFile = (char*) malloc(strlen(buf) + strlen(CERTF) + 1); >- strcpy(certFile, buf); >- strcat(certFile, CERTF); >- >- keyFile = (char*) malloc(strlen(buf) + strlen(KEYF) + 1); >- strcpy(keyFile, buf); >- strcat(keyFile, KEYF); >- } >- >- return 0; >-} >- > /** > ********************************************************* > * >@@ -982,8 +733,6 @@ > { > int rc = 0 ; > >- initSSL(); >- > rc = initForSocketCalls() ; > > if (rc == 0) >@@ -1004,12 +753,10 @@ > if (rc != -1) > { > pServerData->port = socketInfo.portNumber; >- pServerData->securityEnabled = socketInfo.securityEnabled; > } > else > { > pServerData->port = DEFAULT_PORT_NUM; >- pServerData->securityEnabled = 0; > } > > tlo->data = pServerData; >@@ -1111,20 +858,6 @@ > tptp_int32 closeConnection(request_block_ptr_t pBlock) { > if (pBlock == NULL) return -1; > >-#ifndef _WIN32 >- if (pBlock->ssl != NULL) { >- SSL_free(pBlock->ssl); >- pBlock->ssl = NULL; >- } >- >- if (pBlock->sslCtx != NULL) { >- SSL_CTX_free(pBlock->sslCtx); >- pBlock->sslCtx = NULL; >- } >-#endif >- >- pBlock->secured = FALSE; >- > return closeSocket(pBlock->clientSock); > } > >@@ -1172,25 +905,6 @@ > return ( sendThisMessage(pServerData, connectionID, cmdSize, pCmdBlock, TRUE ) ) ; > } > >-#ifndef _WIN32 >- >-tptp_int32 writeData(request_block_ptr_t pBlock, char* buffer, int length) { >- if (pBlock->secured) { >- return SSL_write(pBlock->ssl, buffer, length); >- } >- else { >- return writeToSocket(pBlock->clientSock, buffer, length); >- } >-} >- >-#else >- >-tptp_int32 writeData(request_block_ptr_t pBlock, char* buffer, int length) { >- return writeToSocket(pBlock->clientSock, buffer, length); >-} >- >-#endif >- > /** > ********************************************************* > * >@@ -1237,7 +951,7 @@ > tptp_getWriteLock( & pBlock->locker ); > > /* go send the message */ >- bytesSent = writeData(pBlock, pSendBuffer, bufferLength); >+ bytesSent = writeToSocket(pBlock->clientSock, pSendBuffer, bufferLength); > if (bytesSent < 0) > { > TPTP_LOG_ERROR_MSG1(pServerData, "Socket: Failed to send data on connection ID %d", connectionID); >@@ -1481,7 +1195,7 @@ > if (pBlock == NULL) return -1; > > /* go send the message */ >- bytesSent = writeData(pBlock, pDataBlock, dataSize); >+ bytesSent = writeToSocket(pBlock->clientSock, pDataBlock, dataSize); > if (bytesSent < 0) > { > TPTP_LOG_ERROR_MSG1(pServerData,"Socket: Failed to send data on connection ID %d", connectionID); >@@ -1547,128 +1261,6 @@ > return (forwardDataToPartner(pBlk, dataLen, pBuffer)) ; > } > >-/* >- * -------------------------------------------------------------------------------- >- * All the platform-dependent vrfusrpwd() functions below >- * -------------------------------------------------------------------------------- >- */ >- >- >-#if defined(_WIN32) >-/* >- * Windows/IA32 section, in-process authentication >- */ >-BOOL vrfusrpwd(tptp_string *userid, tptp_string *password) { >- HANDLE handle; >- >- return LogonUser(userid, NULL, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &handle); >-} >-#elif defined(__MVS__) >-/* >- * OS/390 section, in-process authentication. BPX.DAEMON is needed. >- */ >-BOOL vrfusrpwd(tptp_string *userid, tptp_string *password) { >- return __passwd(userid, password, NULL) ? FALSE : TRUE; >-} >-#elif defined(__OS400__) >-/* >- * OS/400 section, in-process authentication >- */ >-BOOL vrfusrpwd(tptp_string *userid, tptp_string *password) { >- struct error_code_t errorCode; >- char profileHandle[12]; /* profile handle, required by QSYGETPH API */ >- char useridBuf[10] = " "; >- >- /* In descrypted case, the password is in code page of 437 */ >- errorCode.bytesProvided = 64; >- errorCode.bytesAvailable = 0; >- >- if(userid[0] == '*') { >- return FALSE; >- } >- else if(strlen(userid) > 10) { >- return FALSE; >- } >- else { >- int i; >- for(i = 0; i < strlen(userid); i++) { >- useridBuf[i] = toupper(userid[i]); /* change it all to upper case */ >- } >- } >- >- QSYGETPH(useridBuf, password, profileHandle, &errorCode, strlen(password), 37); /* CCSID of password is 37 (EBCDIC) */ >- >- if(errorCode.bytesAvailable > 0) { >- char *exc = (char*)ra_malloc(sizeof(char) * 8); >- BZERO(exc, 8); >- strncpy(exc, errorCode.exceptionID, 7); >- ra_free(exc); >- >- return FALSE; >- } >- else { >- return TRUE; /* authentication successful */ >- } >-} >-#else /* non-Windows, non-OS/400 */ >-/* >- * Launch a separate process to authenticate user name and password >- */ >-BOOL vrfusrpwd(tptp_string *userid, tptp_string *password) { >- FILE *fp; >- BOOL success = FALSE; >- char *serverHome; >- char *authCmd; >- int authLen; >- int status; >- int rc = 0; >- >- struct sigaction ignoreHandler; /* Use this handler for bypassing pre-configured signal handler */ >- struct sigaction oldHandler; /* Used to temporary storing the configured signal handler */ >- >- serverHome = getCacheEnv("default", "RASERVER_HOME"); >- /* Do not pass user ID and password since they will be shown by running 'ps' */ >- authLen = strlen(serverHome) + 1 + strlen("bin") + 1 + strlen("ChkPass") + 1; /* Bug 168705 : need a null at the end for strcat() */ >- authCmd = (char*)malloc(sizeof(char) * authLen); >- BZERO(authCmd, authLen); >- strcpy(authCmd, serverHome); >- strcat(authCmd, "/"); >- strcat(authCmd, "bin"); >- strcat(authCmd, "/"); >- strcat(authCmd, "ChkPass"); >- >- /* Disable default SIGCHLD handler since system() call doesn't work with user-supplied signal handlers */ >- BZERO(&ignoreHandler, sizeof(struct sigaction)); >- BZERO(&oldHandler, sizeof(struct sigaction)); >- >- ignoreHandler.sa_handler = SIG_DFL; /* Reset to default SIGCHLD handler */ >- sigaction(SIGCHLD, &ignoreHandler, &oldHandler); /* Store the previous signal handler */ >- >- fp = popen(authCmd, "w"); >- fprintf(fp, "%s\n", userid); >- fprintf(fp, "%s\n", password); >- status = pclose(fp); >- if(WIFEXITED(status)) { >- rc = WEXITSTATUS(status); >- } >- >- if(rc == 100) { /* 100 indicates success */ >- success = TRUE; >- } >- else { >- success = FALSE; >- } >- >- /* Re-enable the user-specified SIGCHLD handler */ >- sigaction(SIGCHLD, &oldHandler, NULL); >- >- free(authCmd); >- >- return success; >-} >- >-#endif >- > #ifdef __linux__ > int closeSocket (int socket) { > struct linger linger; >Index: src-native-new/src/transport/socketTL/SocketTL.make >=================================================================== >RCS file: /cvsroot/tptp/platform/org.eclipse.tptp.platform.agentcontroller/src-native-new/src/transport/socketTL/SocketTL.make,v >retrieving revision 1.7 >diff -u -r1.7 SocketTL.make >--- src-native-new/src/transport/socketTL/SocketTL.make 29 Aug 2007 19:53:13 -0000 1.7 >+++ src-native-new/src/transport/socketTL/SocketTL.make 11 Oct 2007 10:48:24 -0000 >@@ -44,7 +44,7 @@ > # list of additional libraries to be linked with > # (separated by blanks) > #----------------------------------- >-LIBS := dl tptpUtils transportSupport ssl >+LIBS := dl tptpUtils transportSupport > > #----------------------------------- > # list of additional library directories to search from >Index: src-native/collection/packaging/security/generateKey.sh >=================================================================== >RCS file: /cvsroot/tptp/platform/org.eclipse.tptp.platform.agentcontroller/src-native/collection/packaging/security/generateKey.sh,v >retrieving revision 1.2 >diff -u -r1.2 generateKey.sh >--- src-native/collection/packaging/security/generateKey.sh 29 Aug 2007 19:53:14 -0000 1.2 >+++ src-native/collection/packaging/security/generateKey.sh 11 Oct 2007 10:48:24 -0000 >@@ -9,13 +9,3 @@ > > $KEYTOOL -genkey -alias sample -keyalg RSA -sigalg MD5withRSA -dname "CN=Sample, OU=Sample, O=Sample, C=US" -validity 3650 -keypass $PASSWORD -storetype jks -keystore $KEYSTORE -storepass $PASSWORD > $KEYTOOL -export -alias sample -file $CERT -keystore $KEYSTORE -storepass $PASSWORD >- >-CERTF=cert.pem >-KEYF=key.pem >-REQF=req.pem >-LOG=openssl.log >- >-echo `date` > $LOG >-openssl genrsa -out $KEYF 1024 >> $LOG 2>&1 >-openssl req -new -key $KEYF -out $REQF -batch >> $LOG 2>&1 >-openssl x509 -req -in $REQF -signkey $KEYF -out $CERTF >> $LOG 2>&1 >Index: src-native-new/src/agentController/AgentController.make >=================================================================== >RCS file: /cvsroot/tptp/platform/org.eclipse.tptp.platform.agentcontroller/src-native-new/src/agentController/AgentController.make,v >retrieving revision 1.10 >diff -u -r1.10 AgentController.make >--- src-native-new/src/agentController/AgentController.make 29 Aug 2007 19:53:13 -0000 1.10 >+++ src-native-new/src/agentController/AgentController.make 11 Oct 2007 10:48:23 -0000 >@@ -29,7 +29,7 @@ > # (separated by blanks) > #----------------------------------- > >-LIBS := tptpUtils tptpLogUtils tptpConfig processControlUtil xerces-c pthread ssl >+LIBS := tptpUtils tptpLogUtils tptpConfig processControlUtil xerces-c pthread > > #----------------------------------- > # list of additional library directories to search from
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 195644
:
73419
|
73421
|
73422
|
73423
|
73425
|
73429
|
77241
|
77242
|
77243
|
80051
| 80132 |
80870
|
84612
|
84631