Khai báo tập các vị từ cho tệp tin

Một phần của tài liệu Kiểm định đặc tả alloy sử dụng chứng minh định lý logic vị từ bậc 1 (Trang 38)

II. Triển khai cách thức sử dụng cụ thể

3. Khai báo tập các vị từ

3.1. Khai báo tập các vị từ cho tệp tin

Ta có các vị từ cho tệp gồm: Sửa, đọc, thực thi, xóa, thay đổi quyền truy cập, thay đổi quyền sở hữu. Sau đây là cụ thể từng vị từ

3.1.1 Sửa đổi quyền truy cập file

Khai báo vị từ thay đổi quyền truy cập cho tệp tin. Trong đoạn mã dưới a, b là trạng thái trước và sau khi thực hiện thay đổi quyền truy cập của tệp tin. Để thay đổi quyền truy cập cho tệp tin thì người dùng hiện tại phải là người có chức năng Full Control hoặc người dùng với quyền Admin. Thực hiện thay đổi quyền trên một tệp tin thì trạng thái sau của tệp tin xác định được thông qua trạng thái trước khi thay đổi.

Sau đây tôi xin viết đầy đủ chương trình thực hiện sửa đổi quyền truy cập file và giải tích từng đoạn trong chương trình cụ thể. Tất cả các vị từ còn lại thì tôi chỉ đưa vào phần đoạn mã.

Chƣơng trình Chú thích

module windowsFile open util/boolean

Khai báo tên chương trình và thư viện sử dụng

sig Path{}

one sig NoAccess {} one sig SpecialAccess {} sig Name{}

sig User{name:one Name}

one sig CurrentUser extends User{} one sig Adminuser extends User{}

Khai báo tập các chữ ký sig Permission{ read: Bool, write: Bool, execute: Bool, Delete: Bool, SetPermission: Bool, TakeOnership: Bool } Các quyền truy cập

sig FileState{

path: one Path, admin: some User, everyone: set User, read: one User,

Changer: one User, Fullcontrol: one User,

EveryonePermission: one Permission, AdminPermission: set Permission, ReadPermission: one Permission, ChangerPermission: some Permission, FullcontrolPermission: set Permission,

parentDirect: one DirectState, name: one Name

}

Trạng thái của File

sig DirectState{ path: one Path, admin: some User,

everyone: set User, read: one User, Changer: one User, Fullcontrol: one User,

EveryonePermission: one Permission, AdminPermission: set Permission, ReadPermission: one Permission, ChangerPermission: some Permission, FullcontrolPermission: set Permission, parentDirect: one DirectState,

childFile: set FileState, childDirect: set DirectState,

name: one Name

} fact DisjoinPathFile{

all disj a,b :FileState| a.path !=b.path }

Khai báo tập các ràng buộc

Tệp phải có đường dẫn khác nhau

all disj a,b :DirectState| a.path !=b.path }

fact DisjoinEveryone{

all disj a,b :User|a.name!=b.name }

Người sử dụng phải có tên khác nhau

fact DisjoinPathFileDirect

{ all a:FileState,b:DirectState|a.path!=b.path }

Tệp và thư mục không cùng Path

pred editFilePermission [a,b:FileState] {

let c= CurrentUser|c.name=a.admin.name or c.name=a.Adminuser.name b.AdminPermission = a.AdminPermission

b.AdminusesPermission = a.AdminuserPermission b.FullcontrolPermission = a.FullcontrolPermission }

Thay đổi quyền truy cập File

Người có quyền truy cập c là Admin hoặc người được trao quyền Admin hoặc full control. Quyền của a và b là không thay đổi

run editFilePermission for 2 Thực hiện chương trình với 2 vị từ

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 1

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ có nghĩa rằng quá trình chuyển trạng thái đã làm thay đổi hệ thống. Nhưng ở đây bộ phân tích không tìm ra phản ví dụ cho mô hình. Có rất nhiều các giải pháp khác nhau phù hợp với yêu cầu của hệ thống. Ở đây chỉ hiển thị ra một giải pháp. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

3.1.2. Thay đổi quyền quản lý tệp

Khai báo vị từ thay đổi quyền quản lý của tệp tin. a, b là trạng thái trước và sau khi thay đổi. Người dùng hiện tại phải là người sở hữu tệp tin hoặc người dùng với quyền Admin. Các đối tượng có thể thay đổi quyền quản lý đó là Admin, user Admin và người dùng có quyền Full control.

Ta có thể viết đoạn thay đổi quyền quản lý như sau:

pred changeAdminFileState[a,b:FileState] {

let c=CurrentUser|c.name=a.admin.name or c.name =

Adminuser.name

b.Fullcontrol = a.Fullcontrol b.admin=a.admin

}

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 2.

Thực hiện phân tích tự động, nếu tìm thấy phản ví dụ có nghĩa rằng quá trình thay đổi người quản lý đã làm thay đổi hệ thống tệp. Nhưng ở đây bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

Hình 2. Mô hình hệ thống khi chạy vị từ changeAdminFileState

3.1.3 Thay đổi ngƣời sử dụng tệp

Khai báo vị từ thay đổi nhóm sở hữu của tệp tin. a, b là trạng thái trước và sau khi thay đổi. Người dùng hiện tại có thể là bất cứ ai. Vị từ thay đổi người sử dụng của tệp tin có dạng:

Sơ đồ thay đổi người sử dụng:

pred changeEveryoneFileState[a,b:FileState] {

let c=CurrentUser|c.name=a.admin.name or c.name = Adminuser.name or c.name=a.read.name or c.name=a.admin.name or c.name=a.changer.name

or c.name=a.fullcontrol.name b.admin = a.admin b.read = a.read b.changer = a.changer b.fullcontrol = a.fullcontrol }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 3.

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ có nghĩa rằng trong quá trình thay đổi người sử dụng tệp thì hệ thống tệp thay đổi. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

3.1.4. Đọc tệp

Khai báo vị từ cho tác vụ đọc một tệp tin. Người dùng hiện tại phải có quyền đọc trên tệp tin. Quyền đọc tệp tin của nhóm người dùng: Admin, read, change, full control

Sơ đồ như sau:

pred readFile[a:FileState]{ let b= a.admin+a.read+a.userAdmin+a.Changer+a.Fullcontrol { a.read.read=True a.Changer.read = True a.admin.read= True a.Fullcontrol.read=True let c=CurrentUser|c in b } }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 4.

Hình 4. Mô hình hệ thống khi chạy vị từ readFile

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ cho mô hình thì có nghĩa rằng quá trình đọc tệp đã ảnh hưởng đến tệp. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

3.1.5. Ghi tệp

Khai báo vị từ cho tác vụ ghi một tệp tin. Người dùng hiện tại phải có quyền ghi trên tệp tin. Tương tự như vị từ đọc một tệp tin, quyền ghi của một tệp tin với các nhóm người dùng: read, changer, full control

pred writeFile[a:FileState]{

let b= a.admin +a.Changer+a.Fullcontrol {

a.AdminPermission.write=True

a.FullcontrolPermission.write = True let c=CurrentUser|c in b

} }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 5.

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ có nghĩa rằng việc ghi tệp ảnh hưởng đến hệ thống. Ở đây bộ phân tích không tìm ra phản ví dụ cho mô hình. Hình trên thể hiện mô hình của hệ thống ban đầu. Có rất nhiều các giải pháp khác nhau phù hợp với yêu cầu của hệ thống. Ở đây chỉ hiển thị ra một giải pháp. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

Hình 5. Mô hình hệ thống khi chạy vị từ writeFile

3.1.6. Thực thi tệp

Khai báo vị từ cho tác vụ thực thi một tệp tin. Những nhóm người có thể thực thi tệp tin là: Read, changer, full control

pred execFile[a:FileState]{ let b= a.admin+a.everyone+a.read+a.Changer+a.Fullcontrol { a.AdminPermission.execute=True a.EveryonePermission.execute = True a.ReadPermission.execute = True a.ChangerPermission.execute = True a.FullcontrolPermission.execute = True

let c=CurrentUser|c in b }

}

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hiện chạy trên bộ phân tích tự động được biểu diễn ở hình 6.

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ có nghĩa rằng quá trình thực thi tệp đã làm ảnh hưởng đến mô hình của hệ thống. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

Hình 6. Mô hình hệ thống khi chạy vị từ executeFile

Tới đây chúng ta đã thực hiện mô hình hóa được các hành động của hệ thống. Các vị từ đều chạy tốt và không có phản ví dụ nào được phát hiện. Các hành động của hệ thống trên tệp tin đã được hoàn tất. Việc thực hiện các thao tác của hệ thống không

làm mất tính an toàn, tính đúng đắn của hệ thống. Tiếp theo chúng ta sẽ thực hiện mô hình hóa các hành động của hệ thống với thư mục.

3.2. Khai báo tập các vị từ cho thƣ mục

Với thư mục thì cũng tương tự như các tệp. Ta cũng có các vị từ: sửa, đọc, thực thi, xóa, thay đổi quyền truy cập, thay đổi quyền sở hữu nhưng ngoài ra còn có các vị từ: thêm, xóa tệp trong thư mục; thêm xóa thư mục trong thư mục. Cụ thể như sau:

Tương tự như đối với tệp tin, trạng thái của thư mục sau khi thực hiện vị từ được xác định thông qua trạng thái trước đó của thư mục.

3.2.1 Thay đổi quyền chủ thƣ mục

Khai báo vị từ thay đổi quyền truy cập cho thư mục. Trong đoạn mã dưới a, b là trạng thái trước và sau khi thực hiện thay đổi quyền truy cập của thư mục. Để thay đổi quyền truy cập cho thư mục thì người dùng hiện tại phải là người sở hữu của thư mục hoặc người dùng với quyền Admin.

pred changeAdminDirectState[a,b:DirectState] { let c=CurrentUser|c.name=a.admin.name or c.name = Adminuser.name b.admin = a.admin b.Fullcontrol = a.Fullcontrol }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 7.

Thực hiện phân tích tự động, Nếu tìm ra phản ví dụ cho mô hình thì điều đó có nghĩa rằng quá trình chuyển đổi quyền chủ thư mục đã ảnh hưởng tới hệ thống. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

Hình 7. Mô hình hệ thống khi chạy vị từ changerAdminDirectState

3.2.2 Thay đổi ngƣời dùng hiện tại cho thƣ mục

Khai báo vị từ thay đổi nhóm sở hữu của thư mục. Trong phần dưới a, b là trạng thái trước và sau khi thay đổi. Người dùng hiện tại của thư mục có thể là bất cứ ai đó. Trạng thái sau khi thực hiện vị từ được xác định thông qua trạng thái trước đó của vị từ. Tương tự như với tệp tin, ta có vị từ được khai báo như sau:

pred changeEveryoneFileState[a,b:FileState] {

let c=CurrentUser|c.name=a.admin.name or c.name = Adminuser.name or c.name = read.name

c.name = changer.name or c.name = fullcontrol.name b.admin = a.admin

b.read = a.read

b.changer = a.changer

b.fullcontrol = a.fullcontrol

}

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 8.

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ có nghĩa rằng quá trình thay đổi người sử dụng làm thay đổi thư mục và hệ thống. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

Hình 8. Mô hình hệ thống khi chạy vị từ changeGroupDirectState

3.2.3. Đọc thƣ mục

Khai báo vị từ cho tác vụ đọc một thư mục. Người dùng hiện tại phải có quyền đọc trên thư mục. Việc đọc tệp tin không làm ảnh hưởng tới trạng thái trước và sau của thư mục cần đọc. Quyền đọc với ba nhóm người dùng: read,changer, full control được xác định thông qua quyền của nhóm với thư mục.

pred readDirect[a:DirectState]{ let b= a.admin+a.everyone+a.read+a.Changer+a.Fullcontrol { a.ReadPermission.read=True a.ChangerPermission.read = True a.AdminPermission.read= True a.EveryonePermission.read = True a.FullcontrolPermission.read=True let c=CurrentUser|c in b } }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 9.

Thực hiện phân tích tự động, nếu tìm thấy phản ví dụ cho mô hình thì điều đó có nghĩa rằng quá trình đọc thư mục đã làm ảnh hưởng đến thư mục. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

3.2.4. Ghi thƣ mục

Khai báo vị từ cho tác vụ ghi một thư mục. Vị từ thực hiện kiểm tra quyền của người dùng khi thực hiện tác vụ. Quyền ghi với ba nhóm người dùng: changer, full control. Ta có vị từ ghi thư mục được biểu diễn như sau:

pred writeDirect[a:DirectState]{ let b= a.admin+a.Changer+a.Fullcontrol { a.AdminPermission.write=True a.ChangerPermission.write = True a.FullcontrolPermission.write = True let c=CurrentUser|c in b } }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 10.

Hình 10. Mô hình hệ thống khi chạy vị từ writeDirect

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ cho mô hình thì điều đó có nghĩa rằng việc ghi thư mục làm ảnh hưởng đến thư mục khác trong thư mục. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

3.2.5. Thêm một tệp vào thƣ mục

Khai báo vị từ cho tác vụ thêm một tệp tin trong thư mục. Người dùng hiện tại phải có quyền ghi trên thư mục. Khi thực hiện thêm một tệp tin trong thư mục, trạng thái thư mục thể hiện qua sự thay đổi số tệp tin con của thư mục hiện tại, đồng thời trạng thái của tệp tin mới thêm cũng thay đổi. Ta có vị từ biểu diễn hành động thêm tệp tin trong thư mục biểu diễn như sau:

pred addFileInDirect[a,b:DirectState, c:FileState] {

let d= a.admin+a.everyone+a.read+a.Changer+a.Fullcontrol {

a.ChangerPermission.write = True a.ReadPermission.write = True a.FullcontrolPermission.write = True let e=CurrentUser|e in d c.parentDirect=b b.childFile=a.childFile +c b.childDirect = a.childDirect b.parentDirect = a.parentDirect b.path = a.path } }

Chạy thử vị từ với hai nguyên tử cho mỗi chữ ký, sử dụng bộ phân tích tự động cho ta mô hình của hệ thống. Kết quả sau khi thực hệ chạy trên bộ phân tích tự động được biểu diễn ở hình 11.

Thực hiện phân tích tự động, nếu tìm ra phản ví dụ cho mô hình thì điều đó có nghĩa rằng quá trình thêm thư mục vào thư mục không ảnh hưởng gì đến thư mục khác trong thư mục đó. Nhưng bộ phân tích không tìm ra phản ví dụ cho mô hình. Hình trên thể hiện mô hình của hệ thống ban đầu. Có rất nhiều các giải pháp khác nhau phù hợp với yêu cầu của hệ thống. Ở đây chỉ hiển thị ra một giải pháp. Vị từ chạy tốt, không gặp lỗi. Như vậy quá trình chuyển trạng thái không làm thay đổi đến tính đúng đắn của hệ thống.

Hình 11. Mô hình hệ thống khi chạy vị từ addFileInDirect

3.2.6. Xóa thƣ mục trong thƣ mục

Khai báo vị từ cho tác vụ xóa một thư mục trong thư mục. Những người có thể xóa thư mục ngoài Admin và người được trao quyền Admin ra thì là người có quyền: changer và fullcontrol. Việc xóa thư mục trong thư mục không chỉ ảnh hưởng tới thư mục hiện tại mà còn ảnh hưởng rất lớn tới nội dung của thư mục.

Một phần của tài liệu Kiểm định đặc tả alloy sử dụng chứng minh định lý logic vị từ bậc 1 (Trang 38)