Home | History | Annotate | Download | only in server
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.example.android.asymmetricfingerprintdialog.server;
     18 
     19 import java.io.ByteArrayOutputStream;
     20 import java.io.DataOutputStream;
     21 import java.io.IOException;
     22 import java.util.Objects;
     23 
     24 /**
     25  * An entity that represents a single transaction (purchase) of an item.
     26  */
     27 public class Transaction {
     28 
     29     /** The unique ID of the item of the purchase */
     30     private final Long mItemId;
     31 
     32     /** The unique user ID who made the transaction */
     33     private final String mUserId;
     34 
     35     /**
     36      * The random long value that will be also signed by the private key and verified in the server
     37      * that the same nonce can't be reused to prevent replay attacks.
     38      */
     39     private final Long mClientNonce;
     40 
     41     public Transaction(String userId, long itemId, long clientNonce) {
     42         mItemId = itemId;
     43         mUserId = userId;
     44         mClientNonce = clientNonce;
     45     }
     46 
     47     public String getUserId() {
     48         return mUserId;
     49     }
     50 
     51     public byte[] toByteArray() {
     52         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     53         DataOutputStream dataOutputStream = null;
     54         try {
     55             dataOutputStream = new DataOutputStream(byteArrayOutputStream);
     56             dataOutputStream.writeLong(mItemId);
     57             dataOutputStream.writeUTF(mUserId);
     58             dataOutputStream.writeLong(mClientNonce);
     59             return byteArrayOutputStream.toByteArray();
     60         } catch (IOException e) {
     61             throw new RuntimeException(e);
     62         } finally {
     63             try {
     64                 if (dataOutputStream != null) {
     65                     dataOutputStream.close();
     66                 }
     67             } catch (IOException ignore) {
     68             }
     69             try {
     70                 byteArrayOutputStream.close();
     71             } catch (IOException ignore) {
     72             }
     73         }
     74     }
     75 
     76     @Override
     77     public boolean equals(Object o) {
     78         if (this == o) {
     79             return true;
     80         }
     81         if (o == null || getClass() != o.getClass()) {
     82             return false;
     83         }
     84 
     85         Transaction that = (Transaction) o;
     86         return Objects.equals(mItemId, that.mItemId) && Objects.equals(mUserId, that.mUserId) &&
     87                 Objects.equals(mClientNonce, that.mClientNonce);
     88     }
     89 
     90     @Override
     91     public int hashCode() {
     92         return Objects.hash(mItemId, mUserId, mClientNonce);
     93     }
     94 }
     95