~serpent-consulting-services/openerp-usa/shipping_api_6-1

« back to all changes in this revision

Viewing changes to account_payment_creditcard/account_voucher.py

  • Committer: npgllc
  • Date: 2012-09-13 17:23:36 UTC
  • mfrom: (78.1.3 openerp-usa)
  • Revision ID: npgllc-20120913172336-tom9sako8yops2gx
[IMP]: account_payment_cim_authodotnet, account_payment_creditcard

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
##############################################################################
22
22
 
23
23
from osv import osv, fields
24
 
from Crypto.Cipher import DES3
25
24
import base64
26
 
 
27
 
def get_encrypt_key(key='mY_p@ssw0rd_kEy_'):
28
 
    return key
29
 
 
30
 
#def get_encrypt_key(key='mY_p@ssw0rd_kEy_'):
31
 
#    if not os.path.exists('./des_config.cfg'):
32
 
#        fp = open('./des_config.cfg','wb')
33
 
#        fp.write(key)
34
 
#        fp.close()
35
 
#    else:
36
 
#        fp = open('./des_config.cfg','rb')
37
 
#        key = fp.read()
38
 
#        fp.close()
39
 
#    return key
 
25
import rsa_encrypt
 
26
 
40
27
 
41
28
class AuthnetAIMError(Exception):
42
29
    def __init__(self, value):
104
91
        return ret
105
92
 
106
93
    def create(self, cr, uid, vals, context=None):
107
 
        '''
108
 
        Encrypt credit card number before writing to database
109
 
        '''
 
94
        """ 
 
95
            Encrypt credit card number before writing to database
 
96
            @param self : The object pointer
 
97
            @param cr: A database cursor
 
98
            @param uid: ID of the user currently logged in
 
99
            @param vals: Dictionary of Values.
 
100
            @param context: A standard dictionary
 
101
            @return:ID of newly created record.
 
102
        """
 
103
        if context is None:
 
104
            context = {}
110
105
        if vals.get('cc_number', False):
111
 
            if 'XXXXX' in vals['cc_number']:
112
 
                del vals['cc_number']
113
 
            else:
114
 
                encrytipn_obj = DES3.new(get_encrypt_key(), DES3.MODE_ECB)
115
 
                i = len(vals['cc_number']) % 8
116
 
                i = (8 - i)
117
 
                plain_text = vals['cc_number'] + 'X' * i
118
 
                ciphered_text = encrytipn_obj.encrypt(plain_text)
119
 
                vals['cc_number'] = base64.encodestring(ciphered_text)
120
 
                vals['cc_length'] = i
 
106
            res = rsa_encrypt.encrypt(vals.get('cc_number', False))
 
107
            res['cc_number'] = res['enc_value']
 
108
            del res['enc_value']
 
109
            vals.update(res)
121
110
        result = super(account_voucher, self).create(cr, uid, vals, context)
122
 
        vouch = self.browse(cr, uid, result, context=context)
123
 
        if vouch.rel_sale_order_id:
124
 
            self.pool.get('sale.order').write(cr, uid, [vouch.rel_sale_order_id.id], {'rel_account_voucher_id':result})
125
111
        return result
126
112
    
127
113
    def write(self, cr, uid, ids, vals, context=None):
128
114
        '''
129
 
        Encrypt credit card number before writing to database
 
115
            Encrypt credit card number before writing to database
 
116
            @param self : The object pointer
 
117
            @param cr: A database cursor
 
118
            @param uid: ID of the user currently logged in
 
119
            @param ids: List of ids selected
 
120
            @param vals: Dictionary of Values.
 
121
            @param context: A standard dictionary
 
122
            @return:True.
130
123
        '''
131
 
        if vals.get('cc_number', False):
132
 
            if 'XXXXX' in vals['cc_number']:
133
 
                del vals['cc_number']
134
 
            else:
135
 
                encrytipn_obj = DES3.new(get_encrypt_key(), DES3.MODE_ECB)
136
 
                i = len(vals['cc_number']) % 8
137
 
                i = (8 - i)
138
 
                plain_text = vals['cc_number'] + 'X' * i
139
 
                ciphered_text = encrytipn_obj.encrypt(plain_text)
140
 
                vals['cc_number'] = base64.encodestring(ciphered_text)
141
 
                vals['cc_length'] = i
 
124
        if context is None:
 
125
            context = {}
 
126
        context.update({'cc_no':'no_mask'})
 
127
        if not isinstance(ids,list):
 
128
            ids = [ids]
 
129
        for record in self.browse(cr, uid, ids, context=context):
 
130
            if vals.get('cc_number', False):
 
131
                res = rsa_encrypt.encrypt(vals.get('cc_number', False), record.key)
 
132
                res['cc_number'] = res['enc_value']
 
133
                del res['enc_value']
 
134
                vals.update(res)
142
135
        result = super(account_voucher, self).write(cr, uid, ids, vals, context)
143
136
        return result
144
137
    
145
 
    def read(self, cr, user, ids, fields=None, context={}, load='_classic_read'):
146
 
        '''
147
 
        Decrypt credit card number after reading from database and display last four digits if there is 
148
 
        no no_mask in context
149
 
        '''
150
 
        if fields and 'cc_number' in fields and 'cc_length' not in fields:
151
 
            fields.append('cc_length')
152
 
        if not ids:
153
 
            return []
154
 
        vals = super(account_voucher, self).read(cr, user, ids, fields, context, load)
155
 
        if ids and type(ids) == type([]):
156
 
            val = vals[0]
157
 
        else:
158
 
            val = vals
159
 
        if val.get('cc_number', False) and val.get('cc_length', False):
160
 
            encrytipn_obj = DES3.new(get_encrypt_key(), DES3.MODE_ECB)
161
 
            back = encrytipn_obj.decrypt(base64.decodestring(val['cc_number']))
162
 
            i = val['cc_length']
163
 
            i = -i
164
 
            plain_text = back[:i]
165
 
            val['cc_number'] = plain_text
166
 
        else:
167
 
            val['cc_number'] = ''
168
 
        if context.get('cc_no', '') != 'no_mask':
169
 
            if len(vals) == 1:
170
 
                if val.get('cc_number', False):
171
 
                    t = val['cc_number']
172
 
                    i = len(t) - 4
173
 
                    val['cc_number'] = 'X' * i + t[-4:len(t)]
174
 
        if type(ids) == type([]):
175
 
            vals[0] = val
176
 
        else:
177
 
            vals = val
178
 
 
 
138
    def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
 
139
        '''
 
140
            Decrypt credit card number after reading from database and display last four digits if there is 
 
141
            no no_mask in context
 
142
            @param self : The object pointer
 
143
            @param cr: A database cursor
 
144
            @param uid: ID of the user currently logged in
 
145
            @param ids: List of ids selected
 
146
            @param fields: List of fields
 
147
            @param context: A standard dictionary
 
148
            @param load: a parameter used for reading the values of functional fields
 
149
            @return:List of dictionary of fields,values pair
 
150
        '''
 
151
        if context is None:
 
152
            context = {}
 
153
        if 'cc_number' in fields and 'key' not in fields:
 
154
            fields.append('key')
 
155
        vals = super(account_voucher, self).read(cr, uid, ids, fields, context, load)
 
156
        for val in vals:
 
157
            if val.get('cc_number', False) :
 
158
                dec_data = rsa_encrypt.decrypt(val.get('cc_number', False), val.get('key', False))
 
159
                val['cc_number'] = dec_data
 
160
                if context.get('cc_no', '') != 'no_mask':
 
161
                    i = len(val['cc_number']) - 4
 
162
                    val['cc_number'] = 'X' * i + val['cc_number'][-4:len(val['cc_number'])]
179
163
        return vals
180
164
 
181
165
 
205
189
 
206
190
    _inherit = 'account.voucher'
207
191
    _columns = {
208
 
        'cc_name':fields.char('Cardholders Name', size=32,),
 
192
        'cc_name':fields.char("Card Holder's Name", size=32,),
209
193
        'cc_b_addr_1':fields.char('Billing Address1', size=32,),
210
194
        'cc_b_addr_2':fields.char('Billing Address2', size=32,),
211
195
        'cc_city': fields.char('City', size=32,),
234
218
        'cc_details':fields.many2one('res.partner.bank', 'Bank'),
235
219
        'cc_length':fields.integer('CC Length'),
236
220
        'cc_transaction':fields.boolean('Transaction Done'),
 
221
        'key':fields.char('Encryption Key', size=1024,
 
222
                          help="The Key used to Encrypt the Credit Card Number"),
237
223
    }
238
224
    _defaults = {
239
225
        'cc_info_hide': lambda * a: True,