Closed Bug 869291 Opened 7 years ago Closed 6 years ago

Support Receiving WAP-Push-CP

Categories

(Core :: DOM: Device Interfaces, defect)

All
Gonk (Firefox OS)
defect
Not set

Tracking

()

RESOLVED FIXED
mozilla25

People

(Reporter: chucklee, Assigned: chucklee)

References

Details

Attachments

(4 files, 15 obsolete files)

1.81 KB, patch
vicamo
: review+
Details | Diff | Splinter Review
11.46 KB, patch
vicamo
: review+
Details | Diff | Splinter Review
17.45 KB, patch
Details | Diff | Splinter Review
16.63 KB, patch
Details | Diff | Splinter Review
Receive and decode WAP Push CP from WBXML to XML.
Whiteboard: RN5/29
Whiteboard: RN5/29 → RN6/14
Attached patch 0001. Add CP decoder. (obsolete) — Splinter Review
Add decoder for OTA Provisioning
Attachment #765181 - Flags: review?(vyang)
Attached patch 0002. Handle CP message. (obsolete) — Splinter Review
Handle OTA Provisioning on receiving.
Attachment #765182 - Flags: review?(vyang)
Test cases for OTA Provisioning decoding, including plain text and WBXML format.
Attachment #765183 - Flags: review?(vyang)
Comment on attachment 765181 [details] [diff] [review]
0001. Add CP decoder.

Review of attachment 765181 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/src/gonk/CpPduHelper.jsm
@@ +120,5 @@
> +    names[name] = names[number] = entry;
> +  }
> +
> +  add("name",     "",                                 0x05);
> +  add("value",    "",                                 0x06);

I don't really understand what do you mean by giving a empty string here while it's going to be an attribute name.  Please don't just follow previous patterns because of those patterns.  Do it as you need it.
Attachment #765181 - Flags: review?(vyang) → review-
(In reply to Vicamo Yang [:vicamo][:vyang] from comment #4)
> Comment on attachment 765181 [details] [diff] [review]
> 0001. Add CP decoder.
> 
> Review of attachment 765181 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> ::: dom/wappush/src/gonk/CpPduHelper.jsm
> @@ +120,5 @@
> > +    names[name] = names[number] = entry;
> > +  }
> > +
> > +  add("name",     "",                                 0x05);
> > +  add("value",    "",                                 0x06);
> 
> I don't really understand what do you mean by giving a empty string here
> while it's going to be an attribute name.  Please don't just follow previous
> patterns because of those patterns.  Do it as you need it.

empty string indicates the value of name/value attribute is not defined as well-known value, so its value will be defined right after, in string.
In such case, these two attribute will be decoded into "name=" and "value=", and concatenated with the string value part.
This is defined in WAP-183-ProvCont-20010724-A, 8.2.3.

This might happen on provider-specific values, specially in VENDORCONFIG section.
I think they are necessary.
Attachment #765181 - Flags: review?(vyang) → review-
Refactory : handle attribute token and value token separately in main WBXML decoder.
corresponding modifications are applied to SI and SL helper.
Attachment #765870 - Flags: review?(vyang)
Attached patch 0002. Add CP decoder. V2 (obsolete) — Splinter Review
Address comment 4.
Attachment #765181 - Attachment is obsolete: true
Attachment #765871 - Flags: review?(vyang)
Attached patch 0003. Handle CP message. (obsolete) — Splinter Review
Rebase.
Attachment #765182 - Attachment is obsolete: true
Attachment #765182 - Flags: review?(vyang)
Attachment #765872 - Flags: review?(vyang)
Attachment #765183 - Attachment is obsolete: true
Attachment #765183 - Flags: review?(vyang)
Attachment #765873 - Flags: review?(vyang)
Attachment #765870 - Attachment description: 0001. Handle attribute token and value token seperatly. → 0001. Handle attribute token and value token separately.
There is a problem on how to handle OPAQUE data in VENDORCONFIG Characteristics.
It's application-specific, but we can't keep track on VENDORCONFIG of every provider.
After discussion, if we found VENDORCONFIG Characteristics in WBXML encoded CP message, we will not decode it and send notification with message in original form( WBXML encoded message).
1. Handle attribute token and value token separately.
2. Throw error on invalid WBXML token.
Attachment #765870 - Attachment is obsolete: true
Attachment #765870 - Flags: review?(vyang)
Attachment #770610 - Flags: review?(vyang)
Attached patch 0002. Add CP decoder. V3 (obsolete) — Splinter Review
Notify with raw data on existence of VENDORCONFIG Characteristics, as mentioned in comment 11.
Attachment #765871 - Attachment is obsolete: true
Attachment #765871 - Flags: review?(vyang)
Attachment #770611 - Flags: review?(vyang)
Attachment #765872 - Attachment is obsolete: true
Attachment #765872 - Flags: review?(vyang)
Add test for appearance of VENDORCONFIG in WBXML message.
Attachment #765873 - Attachment is obsolete: true
Attachment #765873 - Flags: review?(vyang)
Attachment #770613 - Flags: review?(vyang)
Blocks: 838062
Blocks: 891762
No longer blocks: 891762
No longer blocks: 838062
Attachment #770610 - Flags: review?(vyang) → review+
Comment on attachment 770611 [details] [diff] [review]
0002. Add CP decoder. V3

Review of attachment 770611 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/src/gonk/CpPduHelper.jsm
@@ +90,5 @@
> +   * @return An instance of nsIMultiplexInputStream or null in case of errors.
> +   */
> +compose: function compose_cp(multiStream, msg) {
> +    // Composing CP message is not supported
> +    return null;

Please just remove it.
Attachment #770611 - Flags: review?(vyang) → review+
Comment on attachment 770610 [details] [diff] [review]
0001. Refactory existing WAP PUSH handlers.

Review of attachment 770610 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/src/gonk/SiPduHelper.jsm
@@ +90,5 @@
>        let appToken = {
>          publicId: PUBLIC_IDENTIFIER_SI,
>          tagToken: SI_TAG_FIELDS,
>          attrToken: SI_ATTRIBUTE_FIELDS,
> +        valueToken: SI_VALUE_FIELDS,

Just have a re-scan.  Could you rename all the three token attributes to |fooTokenList|, e.g. |tagToken| => |tagTokenList|.

@@ +174,5 @@
>    add("href",         "",               0x0B);
>    add("href",         "http://",        0x0C);
>    add("href",         "http://www.",    0x0D);
>    add("href",         "https://",       0x0E);
>    add("href",         "https://www.",   0x0F);

Hi, in the |add()| function in this SI_ATTRIBUTE_FIELDS initiator we have:

  names[name] = names[number] = entry;

Since there are several entries with the same name here, will that cause potential errors?  Besides, when do we need the lookup |SI_ATTRIBUTE_FIELDS[name]| actually?  I think we need only |SI_ATTRIBUTE_FIELDS[number]|, right?
Attachment #770610 - Flags: review+
Comment on attachment 770610 [details] [diff] [review]
0001. Refactory existing WAP PUSH handlers.

Review of attachment 770610 [details] [diff] [review]:
-----------------------------------------------------------------

I also find we have:

  this.SiPduHelper = {
    parse: function parse_si(data, contentType) {
      let msg = {};
      ...
      WBXML.PduHelper.parse(data, appToken, msg);
      ...
    }
  };

  this.WbxmlPduHelper = {
    parse: function parse_wbxml(data, appToken, msg) {
      if (!msg) {
        msg = {};
      }
      ...
    }
  };

This doesn't really help when somebody calls |WbxmlPduHelper.parse()| with a null/undefined |msg|.  Please always check the return value.

::: dom/wappush/src/gonk/SiPduHelper.jsm
@@ +116,5 @@
> +        let stringData = WSP.Octet.decodeMultiple(data, data.array.length);
> +        msg.content = WSP.PduHelper.decodeStringContent(stringData, "UTF-8");
> +      } catch (e) {
> +        // Provide raw data if we failed to parse.
> +        msg.content = data.array;

Why do you skip assigning |msg.contentType = "application/vnd.wap.si";| here?

::: dom/wappush/src/gonk/SlPduHelper.jsm
@@ +72,5 @@
> +        let stringData = WSP.Octet.decodeMultiple(data, data.array.length);
> +        msg.content = WSP.PduHelper.decodeStringContent(stringData, "UTF-8");
> +      } catch (e) {
> +        // Provide raw data if we failed to parse.
> +        msg.content = data.array;

ditto.
Comment on attachment 770611 [details] [diff] [review]
0002. Add CP decoder. V3

Review of attachment 770611 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/src/gonk/CpPduHelper.jsm
@@ +77,5 @@
> +      }
> +      return msg;
> +    }
> +
> +    return null;

Please have re-examine on the call path and make sure all errors result in an event with raw data.
Attachment #770611 - Flags: review+
Comment on attachment 770611 [details] [diff] [review]
0002. Add CP decoder. V3

Review of attachment 770611 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/src/gonk/CpPduHelper.jsm
@@ +40,5 @@
> +     * Message is compressed by WBXML, decode into string.
> +     *
> +     * @see WAP-192-WBXML-20010725-A
> +     */
> +    if (!contentType || contentType === "application/vnd.wap.connectivity-wbxml") {

You have following code in WapPushManager.js:

  if (contentType === "text/vnd.wap.connectivity-xml" ||
      contentType === "application/vnd.wap.connectivity-wbxml") {
    msg = CP.PduHelper.parse(data, contentType);
  }

So how could |contentType| be evaluated as false here?
> ::: dom/wappush/src/gonk/SiPduHelper.jsm
> @@ +116,5 @@
> > +        let stringData = WSP.Octet.decodeMultiple(data, data.array.length);
> > +        msg.content = WSP.PduHelper.decodeStringContent(stringData, "UTF-8");
> > +      } catch (e) {
> > +        // Provide raw data if we failed to parse.
> > +        msg.content = data.array;
> 
> Why do you skip assigning |msg.contentType = "application/vnd.wap.si";| here?

I think we can't assume that data can't be decoded as "text/vnd.wap.si" must be "application/vnd.wap.sic", so I keep its original type.
1. Address comment 17 and comment 18.
2. Make sure all errors throws an error.
Attachment #770610 - Attachment is obsolete: true
Attachment #778376 - Flags: review?(vyang)
Attached patch 0002. Add CP decoder. V4 (obsolete) — Splinter Review
1. Address comment 19 and comment 20.
2. Make changes corresponding to patch 0001.
Attachment #770611 - Attachment is obsolete: true
Attachment #778378 - Flags: review?(vyang)
Comment on attachment 778376 [details] [diff] [review]
0001. Refactory existing WAP PUSH handlers. V2

Review of attachment 778376 [details] [diff] [review]:
-----------------------------------------------------------------

Please pay attention to data binding of a function, especially a javascript one.  How many attributes are supposed to be included in the returned object?  What are they?  Please document them since there are already too many similar errors now.

::: dom/wappush/src/gonk/SiPduHelper.jsm
@@ +99,5 @@
>  
> +      try {
> +        let parseResult = WBXML.PduHelper.parse(data, appToken);
> +        msg.content = parseResult.content;
> +        msg.contentType = "text/vnd.wap.si";

You missed |publicId|, |version| and maybe still others.  You can really have:

  let msg = WBXML.PduHelper.parse(data, appToken);
  msg.contentType = "text/vnd.wap.si";

@@ +102,5 @@
> +        msg.content = parseResult.content;
> +        msg.contentType = "text/vnd.wap.si";
> +      } catch (e) {
> +        // Provide raw data if we failed to parse.
> +        msg.content = data.array;

Same here.
Attachment #778376 - Flags: review?(vyang)
(In reply to Vicamo Yang [:vicamo][:vyang] from comment #24)
> Comment on attachment 778376 [details] [diff] [review]
> 0001. Refactory existing WAP PUSH handlers. V2
> 
> Review of attachment 778376 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> Please pay attention to data binding of a function, especially a javascript
> one.  How many attributes are supposed to be included in the returned
> object?  What are they?  Please document them since there are already too
> many similar errors now.
> 
> ::: dom/wappush/src/gonk/SiPduHelper.jsm
> @@ +99,5 @@
> >  
> > +      try {
> > +        let parseResult = WBXML.PduHelper.parse(data, appToken);
> > +        msg.content = parseResult.content;
> > +        msg.contentType = "text/vnd.wap.si";
> 
> You missed |publicId|, |version| and maybe still others.  You can really
> have:
> 
>   let msg = WBXML.PduHelper.parse(data, appToken);
>   msg.contentType = "text/vnd.wap.si";
> 

I think these headers are mainly providing information for decoder, since we have decoded the message into text, we might don't have to bring those info anymore.
If we failed to decode, then those information are not available.
So the function returns only |content| and |contentType|.

Attribute |publicId| added in text parsing will be removed.
Apply same modification as part 0001 to CP helper.
Attachment #778378 - Attachment is obsolete: true
Attachment #778378 - Flags: review?(vyang)
Attachment #778410 - Flags: review?(vyang)
Comment on attachment 778409 [details] [diff] [review]
0001. Refactory existing WAP PUSH handlers. V3

Review of attachment 778409 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/src/gonk/WbxmlPduHelper.jsm
@@ +149,5 @@
> +      globalTagTokenList[token] = WBXML_GLOBAL_TOKENS[token];
> +    }
> +    for (let token in globalTokenOverrideList) {
> +      globalTagTokenList[token] = globalTokenOverrideList[token];
> +    }

You can have:

  let globalTagTokenList = Object.create(WBXML_GLOBAL_TOKENS);
  if (appToken.globalTokenOverride) {
    let globalTokenOverrideList = appToken.globalTokenOverride;
    for (let token in globalTokenOverrideList) {
      globalTagTokenList[token] = globalTokenOverrideList[token];
    }
  }
Attachment #778409 - Flags: review?(vyang) → review+
Attachment #778410 - Flags: review?(vyang) → review+
Attachment #770612 - Flags: review?(vyang) → review+
Comment on attachment 770613 [details] [diff] [review]
0004. Add test case for CP message. V2

Review of attachment 770613 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/tests/test_cp_pdu_helper.js
@@ +13,5 @@
> + * CP in plain text
> + *
> + * Test case from OMA-TS-WAP_ProvCont-V1_1-20090421-C.pdf, clause 6.1
> + */
> +add_test(function test_cp_parse_plain_text() {

Please create an utility function to testing CP decoding.  Something like:

  function foo(array, contentType, result) {
    let data = { array: array, offset: 0 };
    let msg = CP.PduHelper.parse(data, contentType);
    do_check_eq(msg.contentType, result.contentType);
    do_check_eq(msg.content, result.content);    
  }

@@ +213,5 @@
> +                  0x72, 0x6F, 0x76, 0x69, 0x73, 0x69, 0x6F, 0x6E,
> +                  0x69, 0x6E, 0x67, 0x64, 0x6F, 0x63, 0x3E
> +                ]);
> +  data.offset = 0;
> +  let result = "<?xml version=\"1.0\"?><!DOCTYPE wap-provisioningdoc PUBLIC \"-//WAPFORUM//DTD PROV 1.0//EN\" \"http://www.wapforum.org/DTD/prov.dtd\"><wap-provisioningdoc version=\"1.0\"><characteristic type=\"PXLOGICAL\"><parm name=\"PROXY-ID\" value=\"170.187.51.4\"/><parm name=\"NAME\" value=\"BankMainProxy\"/><parm name=\"STARTPAGE\" value=\"http://www.bank.com/startpage.wml\"/><characteristic type=\"PXAUTHINFO\"><parm name=\"PXAUTH-TYPE\" value=\"HTTP-BASIC\"/><parm name=\"PXAUTH-ID\" value=\"pxusername\"/><parm name=\"PXAUTH-PW\" value=\"pxuserpasswd\"/></characteristic><characteristic type=\"PXPHYSICAL\"><parm name=\"PHYSICAL-PROXY-ID\" value=\"PROXY 1\"/><parm name=\"DOMAIN\" value=\"www.bank.com/\"/><parm name=\"PXADDR\" value=\"170.187.51.3\"/><parm name=\"PXADDRTYPE\" value=\"IPV4\"/><parm name=\"TO-NAPID\" value=\"INTERNET\"/><parm name=\"TO-NAPID\" value=\"NAP1\"/><characteristic type=\"PORT\"><parm name=\"PORTNBR\" value=\"9203\"/></characteristic></characteristic></characteristic><characteristic type=\"NAPDEF\"><parm name=\"NAPID\" value=\"NAP1\"/><parm name=\"BEARER\" value=\"GSM-CSD\"/><parm name=\"NAME\" value=\"MY ISP CSD\"/><parm name=\"NAP-ADDRESS\" value=\"+35808124002\"/><parm name=\"NAP-ADDRTYPE\" value=\"E164\"/><parm name=\"CALLTYPE\" value=\"ANALOG-MODEM\"/><characteristic type=\"NAPAUTHINFO\"><parm name=\"AUTHTYPE\" value=\"PAP\"/><parm name=\"AUTHNAME\" value=\"wwwmmmuser\"/><parm name=\"AUTHSECRET\" value=\"wwwmmmsecret\"/></characteristic><characteristic type=\"VALIDITY\"><parm name=\"COUNTRY\" value=\"228\"/><parm name=\"NETWORK\" value=\"001\"/></characteristic></characteristic></wap-provisioningdoc>";

Could you help a little bit more by formatting this long long string with some line breaks and make it more human-readable?

@@ +214,5 @@
> +                  0x69, 0x6E, 0x67, 0x64, 0x6F, 0x63, 0x3E
> +                ]);
> +  data.offset = 0;
> +  let result = "<?xml version=\"1.0\"?><!DOCTYPE wap-provisioningdoc PUBLIC \"-//WAPFORUM//DTD PROV 1.0//EN\" \"http://www.wapforum.org/DTD/prov.dtd\"><wap-provisioningdoc version=\"1.0\"><characteristic type=\"PXLOGICAL\"><parm name=\"PROXY-ID\" value=\"170.187.51.4\"/><parm name=\"NAME\" value=\"BankMainProxy\"/><parm name=\"STARTPAGE\" value=\"http://www.bank.com/startpage.wml\"/><characteristic type=\"PXAUTHINFO\"><parm name=\"PXAUTH-TYPE\" value=\"HTTP-BASIC\"/><parm name=\"PXAUTH-ID\" value=\"pxusername\"/><parm name=\"PXAUTH-PW\" value=\"pxuserpasswd\"/></characteristic><characteristic type=\"PXPHYSICAL\"><parm name=\"PHYSICAL-PROXY-ID\" value=\"PROXY 1\"/><parm name=\"DOMAIN\" value=\"www.bank.com/\"/><parm name=\"PXADDR\" value=\"170.187.51.3\"/><parm name=\"PXADDRTYPE\" value=\"IPV4\"/><parm name=\"TO-NAPID\" value=\"INTERNET\"/><parm name=\"TO-NAPID\" value=\"NAP1\"/><characteristic type=\"PORT\"><parm name=\"PORTNBR\" value=\"9203\"/></characteristic></characteristic></characteristic><characteristic type=\"NAPDEF\"><parm name=\"NAPID\" value=\"NAP1\"/><parm name=\"BEARER\" value=\"GSM-CSD\"/><parm name=\"NAME\" value=\"MY ISP CSD\"/><parm name=\"NAP-ADDRESS\" value=\"+35808124002\"/><parm name=\"NAP-ADDRTYPE\" value=\"E164\"/><parm name=\"CALLTYPE\" value=\"ANALOG-MODEM\"/><characteristic type=\"NAPAUTHINFO\"><parm name=\"AUTHTYPE\" value=\"PAP\"/><parm name=\"AUTHNAME\" value=\"wwwmmmuser\"/><parm name=\"AUTHSECRET\" value=\"wwwmmmsecret\"/></characteristic><characteristic type=\"VALIDITY\"><parm name=\"COUNTRY\" value=\"228\"/><parm name=\"NETWORK\" value=\"001\"/></characteristic></characteristic></wap-provisioningdoc>";
> +  let msg = CP.PduHelper.parse(data, contentType);

|msg| was originally defined in line 18 and is re-defined here.

@@ +280,5 @@
> +                  0x03, 0x30, 0x30, 0x31, 0x00, 0x01, 0x01, 0x01,
> +                  0x01
> +                ]);
> +  data.offset = 0;
> +  let result = "<wap-provisioningdoc version=\"1.0\"><characteristic type=\"PXLOGICAL\"><parm name=\"PROXY-ID\" value=\"170.187.51.4\"/><parm name=\"NAME\" value=\"BankMainProxy\"/><parm name=\"STARTPAGE\" value=\"http://www.bank.com/startpage.wml\"/><characteristic type=\"PXAUTHINFO\"><parm name=\"PXAUTH-TYPE\" value=\"HTTP-BASIC\"/><parm name=\"PXAUTH-ID\" value=\"pxusername\"/><parm name=\"PXAUTH-PW\" value=\"pxuserpasswd\"/></characteristic><characteristic type=\"PXPHYSICAL\"><parm name=\"PHYSICAL-PROXY-ID\" value=\"PROXY 1\"/><parm name=\"DOMAIN\" value=\"www.bank.com/\"/><parm name=\"PXADDR\" value=\"170.187.51.3\"/><parm name=\"PXADDRTYPE\" value=\"IPV4\"/><parm name=\"TO-NAPID\" value=\"INTERNET\"/><parm name=\"TO-NAPID\" value=\"NAP1\"/><characteristic type=\"PORT\"><parm name=\"PORTNBR\" value=\"9203\"/></characteristic></characteristic></characteristic><characteristic type=\"NAPDEF\"><parm name=\"NAPID\" value=\"NAP1\"/><parm name=\"BEARER\" value=\"GSM-CSD\"/><parm name=\"NAME\" value=\"MY ISP CSD\"/><parm name=\"NAP-ADDRESS\" value=\"+35808124002\"/><parm name=\"NAP-ADDRTYPE\" value=\"E164\"/><parm name=\"CALLTYPE\" value=\"ANALOG-MODEM\"/><characteristic type=\"NAPAUTHINFO\"><parm name=\"AUTHTYPE\" value=\"PAP\"/><parm name=\"AUTHNAME\" value=\"wwwmmmuser\"/><parm name=\"AUTHSECRET\" value=\"wwwmmmsecret\"/></characteristic><characteristic type=\"VALIDITY\"><parm name=\"COUNTRY\" value=\"228\"/><parm name=\"NETWORK\" value=\"001\"/></characteristic></characteristic></wap-provisioningdoc>";

ditto
Attachment #770613 - Flags: review?(vyang)
Address comment 28.
Thank you for the tweak!
Attachment #778409 - Attachment is obsolete: true
Address comment 29.
Attachment #770613 - Attachment is obsolete: true
Attachment #779114 - Flags: review?(vyang)
Comment on attachment 779114 [details] [diff] [review]
0004. Add test case for CP message. V3

Review of attachment 779114 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/wappush/tests/test_cp_pdu_helper.js
@@ +292,5 @@
> +        "<characteristic type=\"PORT\">" +
> +        "<parm name=\"PORTNBR\" value=\"9203\"/>" +
> +      "</characteristic>" +
> +    "</characteristic>" +
> +  "</characteristic>" +

Now we know here is a unmatched '</characteristic>'.
Attachment #779114 - Flags: review?(vyang)
(In reply to Vicamo Yang [:vicamo][:vyang] from comment #32)
> Comment on attachment 779114 [details] [diff] [review]
> 0004. Add test case for CP message. V3
> 
> Review of attachment 779114 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> ::: dom/wappush/tests/test_cp_pdu_helper.js
> @@ +292,5 @@
> > +        "<characteristic type=\"PORT\">" +
> > +        "<parm name=\"PORTNBR\" value=\"9203\"/>" +
> > +      "</characteristic>" +
> > +    "</characteristic>" +
> > +  "</characteristic>" +
> 
> Now we know here is a unmatched '</characteristic>'.

Sorry I missed the indent of "<characteristic type=\"PORT\">"
Fix indent per comment 33
Attachment #779114 - Attachment is obsolete: true
Attachment #780149 - Flags: review?(vyang)
Attachment #780149 - Flags: review?(vyang) → review+
Fix description format in patch summary
Attachment #780149 - Attachment is obsolete: true
Blocks: 811554
No longer blocks: 811554
Whiteboard: RN6/14
You need to log in before you can comment on or make changes to this bug.