Skip to content

Commit cdb034f

Browse files
committed
Merge conflicts
2 parents e23bc72 + a26d274 commit cdb034f

File tree

5 files changed

+161
-28
lines changed

5 files changed

+161
-28
lines changed

AndroidBillingLibrary/src/net/robotmedia/billing/BillingController.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ private static void notifyPurchaseStateChange(String itemId, Transaction.Purchas
308308

309309
/**
310310
* Obfuscates the specified purchase. Only the order id, product id and
311-
* developer payload are obfuscated.
311+
* developer payload, signed data and signature are obfuscated.
312312
*
313313
* @param context
314314
* @param purchase
@@ -323,6 +323,8 @@ static void obfuscate(Context context, Transaction purchase) {
323323
purchase.orderId = Security.obfuscate(context, salt, purchase.orderId);
324324
purchase.productId = Security.obfuscate(context, salt, purchase.productId);
325325
purchase.developerPayload = Security.obfuscate(context, salt, purchase.developerPayload);
326+
purchase.signedData = Security.obfuscate(context, salt, purchase.signedData);
327+
purchase.signature = Security.obfuscate(context, salt, purchase.signature);
326328
}
327329

328330
/**
@@ -396,7 +398,7 @@ protected static void onPurchaseStateChanged(final Context context, final String
396398
}
397399

398400
if (debug) {
399-
onSignatureValidated(context, signedData);
401+
onSignatureValidated(context, signedData, signature);
400402
return;
401403
}
402404

@@ -418,7 +420,7 @@ protected Boolean doInBackground(Void... params) {
418420
@Override
419421
protected void onPostExecute(Boolean result) {
420422
if (result) {
421-
onSignatureValidated(context, signedData);
423+
onSignatureValidated(context, signedData, signature);
422424
} else {
423425
Log.w(LOG_TAG, "Signature does not match data.");
424426
}
@@ -436,8 +438,10 @@ protected void onPostExecute(Boolean result) {
436438
* @param context
437439
* @param signedData
438440
* signed JSON data received from the Market Billing service.
441+
* @param signature
442+
* data signature.
439443
*/
440-
private static void onSignatureValidated(Context context, String signedData) {
444+
private static void onSignatureValidated(Context context, String signedData, String signature) {
441445
List<Transaction> purchases;
442446
try {
443447
JSONObject jObject = new JSONObject(signedData);
@@ -460,6 +464,11 @@ private static void onSignatureValidated(Context context, String signedData) {
460464
// refunds.
461465
addManualConfirmation(p.productId, p.notificationId);
462466
}
467+
468+
// Add signedData and signature as receipt to transaction
469+
p.signedData = signedData;
470+
p.signature = signature;
471+
463472
storeTransaction(context, p);
464473
notifyPurchaseStateChange(p.productId, p.purchaseState);
465474
}
@@ -747,6 +756,8 @@ static void unobfuscate(Context context, Transaction purchase) {
747756
purchase.orderId = Security.unobfuscate(context, salt, purchase.orderId);
748757
purchase.productId = Security.unobfuscate(context, salt, purchase.productId);
749758
purchase.developerPayload = Security.unobfuscate(context, salt, purchase.developerPayload);
759+
purchase.signedData = Security.unobfuscate(context, salt, purchase.signedData);
760+
purchase.signature = Security.unobfuscate(context, salt, purchase.signature);
750761
}
751762

752763
/**

AndroidBillingLibrary/src/net/robotmedia/billing/model/BillingDB.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,21 @@
2424

2525
public class BillingDB {
2626
static final String DATABASE_NAME = "billing.db";
27-
static final int DATABASE_VERSION = 1;
27+
static final int DATABASE_VERSION = 2;
2828
static final String TABLE_TRANSACTIONS = "purchases";
2929

3030
public static final String COLUMN__ID = "_id";
3131
public static final String COLUMN_STATE = "state";
3232
public static final String COLUMN_PRODUCT_ID = "productId";
3333
public static final String COLUMN_PURCHASE_TIME = "purchaseTime";
3434
public static final String COLUMN_DEVELOPER_PAYLOAD = "developerPayload";
35+
public static final String COLUMN_SIGNED_DATA = "signedData";
36+
public static final String COLUMN_SIGNATURE = "signature";
3537

3638
private static final String[] TABLE_TRANSACTIONS_COLUMNS = {
3739
COLUMN__ID, COLUMN_PRODUCT_ID, COLUMN_STATE,
38-
COLUMN_PURCHASE_TIME, COLUMN_DEVELOPER_PAYLOAD
40+
COLUMN_PURCHASE_TIME, COLUMN_DEVELOPER_PAYLOAD,
41+
COLUMN_SIGNED_DATA, COLUMN_SIGNATURE
3942
};
4043

4144
SQLiteDatabase mDb;
@@ -57,6 +60,8 @@ public void insert(Transaction transaction) {
5760
values.put(COLUMN_STATE, transaction.purchaseState.ordinal());
5861
values.put(COLUMN_PURCHASE_TIME, transaction.purchaseTime);
5962
values.put(COLUMN_DEVELOPER_PAYLOAD, transaction.developerPayload);
63+
values.put(COLUMN_SIGNED_DATA, transaction.signedData);
64+
values.put(COLUMN_SIGNATURE, transaction.signature);
6065
mDb.replace(TABLE_TRANSACTIONS, null /* nullColumnHack */, values);
6166
}
6267

@@ -82,10 +87,12 @@ protected static final Transaction createTransaction(Cursor cursor) {
8287
purchase.purchaseState = PurchaseState.valueOf(cursor.getInt(2));
8388
purchase.purchaseTime = cursor.getLong(3);
8489
purchase.developerPayload = cursor.getString(4);
90+
purchase.signedData = cursor.getString(5);
91+
purchase.signature = cursor.getString(6);
8592
return purchase;
8693
}
8794

88-
private class DatabaseHelper extends SQLiteOpenHelper {
95+
public static class DatabaseHelper extends SQLiteOpenHelper {
8996
public DatabaseHelper(Context context) {
9097
super(context, DATABASE_NAME, null, DATABASE_VERSION);
9198
}
@@ -98,13 +105,28 @@ public void onCreate(SQLiteDatabase db) {
98105
private void createTransactionsTable(SQLiteDatabase db) {
99106
db.execSQL("CREATE TABLE " + TABLE_TRANSACTIONS + "(" +
100107
COLUMN__ID + " TEXT PRIMARY KEY, " +
101-
COLUMN_PRODUCT_ID + " INTEGER, " +
108+
COLUMN_PRODUCT_ID + " TEXT, " +
102109
COLUMN_STATE + " TEXT, " +
103110
COLUMN_PURCHASE_TIME + " TEXT, " +
104-
COLUMN_DEVELOPER_PAYLOAD + " INTEGER)");
111+
COLUMN_DEVELOPER_PAYLOAD + " TEXT, " +
112+
COLUMN_SIGNED_DATA + " TEXT," +
113+
COLUMN_SIGNATURE + " TEXT)");
105114
}
106115

107116
@Override
108-
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
117+
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
118+
if (oldVersion == 1 && newVersion == 2) {
119+
db.beginTransaction();
120+
try {
121+
db.execSQL("ALTER TABLE " + TABLE_TRANSACTIONS +
122+
" ADD COLUMN " + COLUMN_SIGNED_DATA + " TEXT");
123+
db.execSQL("ALTER TABLE " + TABLE_TRANSACTIONS +
124+
" ADD COLUMN " + COLUMN_SIGNATURE + " TEXT");
125+
db.setTransactionSuccessful();
126+
} finally {
127+
db.endTransaction();
128+
}
129+
}
130+
}
109131
}
110132
}

AndroidBillingLibrary/src/net/robotmedia/billing/model/Transaction.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public static PurchaseState valueOf(int index) {
3939
return values[index];
4040
}
4141
}
42+
4243
static final String DEVELOPER_PAYLOAD = "developerPayload";
4344
static final String NOTIFICATION_ID = "notificationId";
4445
static final String ORDER_ID = "orderId";
@@ -61,6 +62,8 @@ public static Transaction parse(JSONObject json) throws JSONException {
6162
return transaction;
6263
}
6364

65+
public String signedData;
66+
public String signature;
6467
public String developerPayload;
6568
public String notificationId;
6669
public String orderId;
@@ -72,18 +75,20 @@ public static Transaction parse(JSONObject json) throws JSONException {
7275
public Transaction() {}
7376

7477
public Transaction(String orderId, String productId, String packageName, PurchaseState purchaseState,
75-
String notificationId, long purchaseTime, String developerPayload) {
78+
String notificationId, long purchaseTime, String developerPayload, String signature, String signedData) {
7679
this.orderId = orderId;
7780
this.productId = productId;
7881
this.packageName = packageName;
7982
this.purchaseState = purchaseState;
8083
this.notificationId = notificationId;
8184
this.purchaseTime = purchaseTime;
8285
this.developerPayload = developerPayload;
86+
this.signature = signature;
87+
this.signedData = signedData;
8388
}
8489

8590
public Transaction clone() {
86-
return new Transaction(orderId, productId, packageName, purchaseState, notificationId, purchaseTime, developerPayload);
91+
return new Transaction(orderId, productId, packageName, purchaseState, notificationId, purchaseTime, developerPayload, signature, signedData);
8792
}
8893

8994
@Override
@@ -124,12 +129,21 @@ public boolean equals(Object obj) {
124129
return false;
125130
if (purchaseTime != other.purchaseTime)
126131
return false;
132+
if (signature == null) {
133+
if (other.signature != null)
134+
return false;
135+
} else if (!signature.equals(other.signature))
136+
return false;
137+
if (signedData == null) {
138+
if (other.signedData != null)
139+
return false;
140+
} else if (!signedData.equals(other.signedData))
141+
return false;
127142
return true;
128143
}
129144

130145
@Override
131146
public String toString() {
132147
return String.valueOf(orderId);
133148
}
134-
135149
}

AndroidBillingLibraryTest/src/net/robotmedia/billing/model/BillingDBTest.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package net.robotmedia.billing.model;
1717

1818
import android.database.Cursor;
19+
import android.database.sqlite.SQLiteDatabase;
1920
import android.test.AndroidTestCase;
2021
import android.test.suitebuilder.annotation.SmallTest;
2122

@@ -130,4 +131,71 @@ public void testQueryTransactionsStringPurchaseState() throws Exception {
130131
cursor2.close();
131132
}
132133

134+
@SmallTest
135+
public void testDatabaseHelperConstructor() throws Exception {
136+
BillingDB.DatabaseHelper helper = new BillingDB.DatabaseHelper(this.getContext());
137+
assertEquals(helper.getReadableDatabase().getVersion(), BillingDB.DATABASE_VERSION);
138+
}
139+
140+
private void testColumn(SQLiteDatabase db, String column, String expectedType, boolean result) {
141+
Cursor cursor = db.rawQuery("PRAGMA table_info(" + BillingDB.TABLE_TRANSACTIONS + ")", null);
142+
boolean found = false;
143+
while (cursor.moveToNext()) {
144+
final String name = cursor.getString(1);
145+
if (name.equals(column)) {
146+
final String type = cursor.getString(2);
147+
assertEquals(type, expectedType);
148+
found = true;
149+
}
150+
}
151+
cursor.close();
152+
assertEquals(found, result);
153+
}
154+
155+
@SmallTest
156+
public void testDatabaseHelperOnCreate() throws Exception {
157+
BillingDB.DatabaseHelper helper = new BillingDB.DatabaseHelper(this.getContext());
158+
SQLiteDatabase db = SQLiteDatabase.create(null);
159+
helper.onCreate(db);
160+
Cursor cursor = db.query("sqlite_master", new String[] {"name"}, "type='table' AND name='" + BillingDB.TABLE_TRANSACTIONS + "'", null, null, null, null);
161+
assertTrue(cursor.getCount() > 0);
162+
cursor.close();
163+
testColumn(db, BillingDB.COLUMN__ID, "TEXT", true);
164+
testColumn(db, BillingDB.COLUMN_PRODUCT_ID, "TEXT", true);
165+
testColumn(db, BillingDB.COLUMN_STATE, "TEXT", true);
166+
testColumn(db, BillingDB.COLUMN_PURCHASE_TIME, "TEXT", true);
167+
testColumn(db, BillingDB.COLUMN_DEVELOPER_PAYLOAD, "TEXT", true);
168+
testColumn(db, BillingDB.COLUMN_SIGNED_DATA, "TEXT", true);
169+
testColumn(db, BillingDB.COLUMN_SIGNATURE, "TEXT", true);
170+
}
171+
172+
@SmallTest
173+
public void testDatabaseHelperOnUpgradeCurrentVersion() throws Exception {
174+
BillingDB.DatabaseHelper helper = new BillingDB.DatabaseHelper(this.getContext());
175+
SQLiteDatabase db = helper.getWritableDatabase();
176+
helper.onUpgrade(db, BillingDB.DATABASE_VERSION, BillingDB.DATABASE_VERSION);
177+
178+
}
179+
180+
private SQLiteDatabase createVersion1Database() {
181+
final SQLiteDatabase db = SQLiteDatabase.create(null);
182+
db.execSQL("CREATE TABLE " + BillingDB.TABLE_TRANSACTIONS + "(" +
183+
BillingDB.COLUMN__ID + " TEXT PRIMARY KEY, " +
184+
BillingDB.COLUMN_PRODUCT_ID + " INTEGER, " +
185+
BillingDB.COLUMN_STATE + " TEXT, " +
186+
BillingDB.COLUMN_PURCHASE_TIME + " TEXT, " +
187+
BillingDB.COLUMN_DEVELOPER_PAYLOAD + " INTEGER)");
188+
return db;
189+
}
190+
191+
@SmallTest
192+
public void testDatabaseHelperOnUpgradeVersion1To2() throws Exception {
193+
BillingDB.DatabaseHelper helper = new BillingDB.DatabaseHelper(this.getContext());
194+
SQLiteDatabase db = createVersion1Database();
195+
testColumn(db, BillingDB.COLUMN_SIGNED_DATA, "TEXT", false);
196+
testColumn(db, BillingDB.COLUMN_SIGNATURE, "TEXT", false);
197+
helper.onUpgrade(db, 1, 2);
198+
testColumn(db, BillingDB.COLUMN_SIGNED_DATA, "TEXT", true);
199+
testColumn(db, BillingDB.COLUMN_SIGNATURE, "TEXT", true);
200+
}
133201
}

AndroidBillingLibraryTest/src/net/robotmedia/billing/model/TransactionTest.java

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,39 @@
2525

2626
public class TransactionTest extends TestCase {
2727

28-
public static final Transaction TRANSACTION_1 = new Transaction("order1", "android.test.purchased", "com.example", Transaction.PurchaseState.PURCHASED, "notificationId", new Date().getTime(), "developerPayload");
29-
public static final Transaction TRANSACTION_2 = new Transaction("order2", "product_2", "com.example", Transaction.PurchaseState.PURCHASED, "notificationId", new Date().getTime(), "developerPayload");
30-
public static final Transaction TRANSACTION_2_REFUNDED = new Transaction("order4", "product_2", "com.example", Transaction.PurchaseState.REFUNDED, "notificationId", new Date().getTime(), "developerPayload");
31-
public static final Transaction TRANSACTION_1_REFUNDED = new Transaction("order3", "android.test.purchased", "com.example", Transaction.PurchaseState.REFUNDED, "notificationId", new Date().getTime(), "developerPayload");
28+
public static final Transaction TRANSACTION_1 = new Transaction("order1", "android.test.purchased", "com.example", Transaction.PurchaseState.PURCHASED, "notificationId", new Date().getTime(), "developerPayload", "signature", "signedData");
29+
public static final Transaction TRANSACTION_2 = new Transaction("order2", "product_2", "com.example", Transaction.PurchaseState.PURCHASED, "notificationId", new Date().getTime(), "developerPayload", "signature", "signedData");
30+
public static final Transaction TRANSACTION_2_REFUNDED = new Transaction("order4", "product_2", "com.example", Transaction.PurchaseState.REFUNDED, "notificationId", new Date().getTime(), "developerPayload", "signature", "signedData");
31+
public static final Transaction TRANSACTION_1_REFUNDED = new Transaction("order3", "android.test.purchased", "com.example", Transaction.PurchaseState.REFUNDED, "notificationId", new Date().getTime(), "developerPayload", "signature", "signedData");
3232
public static void assertEquals(Transaction a, Transaction b) {
3333
assertTrue(a.equals(b));
3434
}
3535

36-
@SmallTest
37-
public void testParseAllFields() throws Exception {
36+
private void testParseAllFields(Transaction transaction) throws Exception {
3837
JSONObject json = new JSONObject();
39-
json.put(Transaction.ORDER_ID, TRANSACTION_1.orderId);
40-
json.put(Transaction.PRODUCT_ID, TRANSACTION_1.productId);
41-
json.put(Transaction.PACKAGE_NAME, TRANSACTION_1.packageName);
42-
json.put(Transaction.PURCHASE_STATE, TRANSACTION_1.purchaseState.ordinal());
43-
json.put(Transaction.NOTIFICATION_ID, TRANSACTION_1.notificationId);
44-
json.put(Transaction.PURCHASE_TIME, TRANSACTION_1.purchaseTime);
45-
json.put(Transaction.DEVELOPER_PAYLOAD, TRANSACTION_1.developerPayload);
38+
json.put(Transaction.ORDER_ID, transaction.orderId);
39+
json.put(Transaction.PRODUCT_ID, transaction.productId);
40+
json.put(Transaction.PACKAGE_NAME, transaction.packageName);
41+
json.put(Transaction.PURCHASE_STATE, transaction.purchaseState.ordinal());
42+
json.put(Transaction.NOTIFICATION_ID, transaction.notificationId);
43+
json.put(Transaction.PURCHASE_TIME, transaction.purchaseTime);
44+
json.put(Transaction.DEVELOPER_PAYLOAD, transaction.developerPayload);
4645
final Transaction parsed = Transaction.parse(json);
47-
assertEquals(TRANSACTION_1, parsed);
46+
assertEquals(transaction.orderId, parsed.orderId);
47+
assertEquals(transaction.productId, parsed.productId);
48+
assertEquals(transaction.packageName, parsed.packageName);
49+
assertEquals(transaction.purchaseState, parsed.purchaseState);
50+
assertEquals(transaction.notificationId, parsed.notificationId);
51+
assertEquals(transaction.purchaseTime, parsed.purchaseTime);
52+
assertEquals(transaction.developerPayload, parsed.developerPayload);
53+
assertNull(parsed.signature);
54+
assertNull(parsed.signedData);
55+
}
56+
57+
@SmallTest
58+
public void testParseAllFields() throws Exception {
59+
testParseAllFields(TRANSACTION_1);
60+
testParseAllFields(TRANSACTION_2);
4861
}
4962

5063
@SmallTest
@@ -62,6 +75,8 @@ public void testParseOnlyMandatoryFields() throws Exception {
6275
assertNull(parsed.notificationId);
6376
assertEquals(TRANSACTION_1.purchaseTime, parsed.purchaseTime);
6477
assertNull(parsed.developerPayload);
78+
assertNull(parsed.signature);
79+
assertNull(parsed.signedData);
6580
}
6681

6782
@SmallTest
@@ -76,11 +91,14 @@ public void testPurchaseStateOrdinal() throws Exception {
7691
public void testEquals() throws Exception {
7792
assertTrue(TRANSACTION_1.equals(TRANSACTION_1));
7893
assertTrue(TRANSACTION_1.equals(TRANSACTION_1.clone()));
79-
assertFalse(TRANSACTION_1.equals(TRANSACTION_2_REFUNDED));
94+
assertTrue(TRANSACTION_1.clone().equals(TRANSACTION_1));
95+
assertFalse(TRANSACTION_1.equals(TRANSACTION_2));
96+
assertFalse(TRANSACTION_2.equals(TRANSACTION_1));
8097
}
8198

8299
@SmallTest
83100
public void testClone() throws Exception {
84101
assertEquals(TRANSACTION_1, TRANSACTION_1.clone());
102+
assertEquals(TRANSACTION_2, TRANSACTION_2.clone());
85103
}
86104
}

0 commit comments

Comments
 (0)